From b0821d89c03723a52f95099267d4440eaa428c8a Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Thu, 3 Sep 2026 17:16:38 +0200 Subject: [PATCH 01/25] feat(assets-controller): resolve customAssets in AccountsAPI --- packages/assets-controller/CHANGELOG.md | 10 + .../src/AssetsController.test.ts | 750 +++++++++-- .../assets-controller/src/AssetsController.ts | 1104 +++++++++++++---- .../data-sources/AbstractDataSource.test.ts | 39 +- .../src/data-sources/AbstractDataSource.ts | 28 + .../data-sources/AccountActivityDataSource.ts | 3 + .../AccountsApiDataSource.test.ts | 335 ++++- .../src/data-sources/AccountsApiDataSource.ts | 271 +++- .../src/data-sources/RpcDataSource.test.ts | 397 +++++- .../src/data-sources/RpcDataSource.ts | 284 ++++- .../services/BalanceFetcher.test.ts | 34 +- .../services/BalanceFetcher.ts | 53 +- .../evm-rpc-services/types/state.ts | 5 +- .../src/middlewares/ParallelMiddleware.ts | 11 + .../middlewares/RpcFallbackMiddleware.test.ts | 526 ++------ .../src/middlewares/RpcFallbackMiddleware.ts | 379 +++--- packages/assets-controller/src/types.ts | 46 +- 17 files changed, 3207 insertions(+), 1068 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 495facb9eb3..14054f7c3dc 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add an optional `customAssets` option to `AssetsController.getAssets`, used only when `assetsAccountsApiV6` is enabled. It overrides which pinned assets are attached to the fetch (sent as `includeAssetIds` and to RPC). When the flag is off, `getAssets` still attaches every pin of the requested accounts, unscoped, matching the previous v5 request ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Add an optional `isBalanceV6Enabled` getter to `AccountsApiDataSource` and `RpcDataSource`. `AssetsController` injects it so the `assetsAccountsApiV6` flag is read in one place; both default to v5 when the getter is omitted([#9651](https://github.com/MetaMask/core/pull/9651)) + +### Changed + +- When `assetsAccountsApiV6` is enabled, Accounts API fetch and middleware report `updateMode: 'full'` so assets on chains in the snapshot (including custom assets returned via `includeAssetIds`) are replaced; pins left in `unprocessedCustomAssets` after RPC fallback keep their prior balances. The v5 path keeps `updateMode: 'merge'` with `replaceCoveredChainBalances` so custom assets are preserved ([#9651](https://github.com/MetaMask/core/pull/9651)) +- **BREAKING:** Remove the unused `updateMode` option from `AssetsController.getAssets`. Apply mode comes only from `DataResponse.updateMode` (data sources). Remove `'update'` from `AssetsUpdateMode` — it was never produced; use `'merge'` to overlay or `'full'` to replace a covered chain slice ([#9651](https://github.com/MetaMask/core/pull/9651)) + ## [16.0.0] ### Changed diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index dc31450f492..1e19332fcdd 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -20,7 +20,9 @@ import type { AssetsControllerMessenger, AssetsControllerState, } from './AssetsController.js'; +import { AccountActivityDataSource } from './data-sources/AccountActivityDataSource.js'; import type { AccountsApiDataSourceConfig } from './data-sources/AccountsApiDataSource.js'; +import { AccountsApiDataSource } from './data-sources/AccountsApiDataSource.js'; import type { PriceDataSourceConfig } from './data-sources/PriceDataSource.js'; import { PriceDataSource } from './data-sources/PriceDataSource.js'; import { RpcDataSource } from './data-sources/RpcDataSource.js'; @@ -703,6 +705,47 @@ describe('AssetsController', () => { }); }); + it('fetches only the newly added asset instead of every pinned asset', async () => { + // Use a valid checksummed address (DAI token address) + const secondAssetId = + 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F' as Caip19AssetId; + + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); + + capturedCustomAssets.length = 0; + await controller.addCustomAsset(MOCK_ACCOUNT_ID, secondAssetId); + }, + ); + + // The fetch triggered by adding the second pin must not re-request the + // first pin — the subscription refresh covers it on the next poll. + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toStrictEqual([secondAssetId]); + } + + middlewareGetter.mockRestore(); + }); + it('does not overwrite an existing balance when re-adding a custom asset', async () => { await withController( { @@ -763,99 +806,6 @@ describe('AssetsController', () => { }); }); - describe('custom asset graduation', () => { - const SOLANA_ASSET_ID = - 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Caip19AssetId; - - it('graduates an EVM custom asset when AccountsApiDataSource reports a balance for it', async () => { - await withController(async ({ controller }) => { - await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); - expect(controller.state.customAssets[MOCK_ACCOUNT_ID]).toContain( - MOCK_ASSET_ID, - ); - - await controller.handleAssetsUpdate( - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_ID]: { amount: '1000000' }, - }, - }, - }, - 'AccountsApiDataSource', - ); - - expect(controller.state.customAssets[MOCK_ACCOUNT_ID]).toBeUndefined(); - }); - }); - - it('graduates an EVM custom asset when AccountActivityDataSource reports a balance for it', async () => { - await withController(async ({ controller }) => { - await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); - - await controller.handleAssetsUpdate( - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_ID]: { amount: '1000000' }, - }, - }, - }, - 'AccountActivityDataSource', - ); - - expect(controller.state.customAssets[MOCK_ACCOUNT_ID]).toBeUndefined(); - }); - }); - - it('does not graduate when RpcDataSource reports a balance for a custom asset', async () => { - await withController(async ({ controller }) => { - await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); - - await controller.handleAssetsUpdate( - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_ID]: { amount: '1000000' }, - }, - }, - }, - 'RpcDataSource', - ); - - expect(controller.state.customAssets[MOCK_ACCOUNT_ID]).toContain( - MOCK_ASSET_ID, - ); - }); - }); - - it('does not graduate a non-EVM (Solana) custom asset', async () => { - await withController( - { - state: { - customAssets: { [MOCK_ACCOUNT_ID]: [SOLANA_ASSET_ID] }, - }, - }, - async ({ controller }) => { - await controller.handleAssetsUpdate( - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [SOLANA_ASSET_ID]: { amount: '1000000' }, - }, - }, - }, - 'AccountsApiDataSource', - ); - - expect(controller.state.customAssets[MOCK_ACCOUNT_ID]).toContain( - SOLANA_ASSET_ID, - ); - }, - ); - }); - }); - describe('getCustomAssets', () => { it('returns empty array for account with no custom assets', async () => { await withController(({ controller }) => { @@ -1463,6 +1413,317 @@ describe('AssetsController', () => { ); }); + it('forwards user-pinned custom assets to the Accounts API v6 endpoint as includeAssetIds', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await withController( + { + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await flushPromises(); + + await controller.addCustomAsset(MOCK_ACCOUNT_ID, customToken); + + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + + expect(fetchV6MultiAccountBalances).toHaveBeenCalledWith( + expect.any(Array), + expect.objectContaining({ + includeAssetIds: expect.arrayContaining([customToken]), + }), + expect.anything(), + ); + }, + ); + }); + + it('includes every pinned asset on the v5 force-update request, including other chains', async () => { + const mainnetToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const polygonToken = + 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; + + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController(async ({ controller }) => { + await controller.addCustomAsset(MOCK_ACCOUNT_ID, mainnetToken); + await controller.addCustomAsset(MOCK_ACCOUNT_ID, polygonToken); + + capturedCustomAssets.length = 0; + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + }); + + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toStrictEqual( + expect.arrayContaining([mainnetToken, polygonToken]), + ); + } + + middlewareGetter.mockRestore(); + }); + + it('scopes the custom assets on the request to the requested chains', async () => { + const mainnetToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const polygonToken = + 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; + + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await controller.addCustomAsset(MOCK_ACCOUNT_ID, mainnetToken); + await controller.addCustomAsset(MOCK_ACCOUNT_ID, polygonToken); + + capturedCustomAssets.length = 0; + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + }, + ); + + // Pins on chains outside the request are dropped when the request is + // built — every data source would only ignore them at fetch time. + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toStrictEqual([mainnetToken]); + } + + middlewareGetter.mockRestore(); + }); + + it('uses the customAssets option instead of state-pinned assets when provided', async () => { + const pinnedToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const requestedToken = + 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F' as Caip19AssetId; + + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await controller.addCustomAsset(MOCK_ACCOUNT_ID, pinnedToken); + await controller.addCustomAsset(MOCK_ACCOUNT_ID, requestedToken); + + capturedCustomAssets.length = 0; + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + customAssets: [requestedToken], + }); + }, + ); + + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toStrictEqual([requestedToken]); + } + + middlewareGetter.mockRestore(); + }); + + it('scopes the customAssets option to the requested chains and drops invalid IDs', async () => { + const polygonToken = + 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; + + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + customAssets: [polygonToken, 'not-a-caip-id' as Caip19AssetId], + }); + }, + ); + + // The off-chain pin and the unparseable ID are both dropped, leaving no + // custom assets on the request. + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toBeUndefined(); + } + + middlewareGetter.mockRestore(); + }); + + it('normalizes asset IDs passed via the customAssets option', async () => { + const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; + const accountsApiMiddleware = jest.fn(async (ctx, next) => { + capturedCustomAssets.push(ctx.request.customAssets); + return next(ctx); + }); + const middlewareGetter = jest + .spyOn( + AccountsApiDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + customAssets: [MOCK_ASSET_ID_LOWERCASE], + }); + }, + ); + + expect(capturedCustomAssets.length).toBeGreaterThan(0); + for (const customAssets of capturedCustomAssets) { + expect(customAssets).toStrictEqual([MOCK_ASSET_ID]); + } + + middlewareGetter.mockRestore(); + }); + + it('forwards user-hidden assets to the Accounts API v6 endpoint as excludeAssetIds', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + const hiddenToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await withController( + { + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await flushPromises(); + + controller.hideAsset(hiddenToken); + + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + + expect(fetchV6MultiAccountBalances).toHaveBeenCalledWith( + expect.any(Array), + expect.objectContaining({ + excludeAssetIds: expect.arrayContaining([hiddenToken]), + }), + expect.anything(), + ); + }, + ); + }); + describe('pipeline splitting', () => { it('returns from getAssets before background pipelines complete', async () => { // Spy on handleAssetsUpdate to count how many times state is written. @@ -1540,6 +1801,76 @@ describe('AssetsController', () => { ); }); + it('routes chains carrying unprocessed pinned assets (unprocessedCustomAssets) to the slow-pipeline RPC fetch', async () => { + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [customToken], + }); + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + const rpcRequestChainIds: ChainId[][] = []; + const rpcMiddleware = jest.fn(async (ctx, next) => { + rpcRequestChainIds.push(ctx.request.chainIds); + return next(ctx); + }); + const rpcMiddlewareGetter = jest + .spyOn( + RpcDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) + .mockReturnValue(rpcMiddleware) as unknown as jest.SpyInstance; + + await withController( + { + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await flushPromises(); + + await controller.addCustomAsset(MOCK_ACCOUNT_ID, customToken); + + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + + // Slow pipeline is fire-and-forget; let it run. + await flushPromises(); + }, + ); + + // The chain of the unresolved pin (eip155:1) — a chain AccountsApi + // handled and did NOT flag as errored — is still routed to RPC in the + // slow pipeline so the pin gets fetched. + expect(rpcMiddleware).toHaveBeenCalled(); + expect( + rpcRequestChainIds.some((chains) => chains.includes('eip155:1')), + ).toBe(true); + + rpcMiddlewareGetter.mockRestore(); + }); + it('does not run token or price middleware in getAssets pipelines when isBasicFunctionality is false', async () => { const tokenMiddlewareGetter = jest.spyOn( TokenDataSource.prototype, @@ -2028,6 +2359,119 @@ describe('AssetsController', () => { tokenMiddlewareGetter.mockRestore(); priceMiddlewareGetter.mockRestore(); }); + + it('falls back to RPC for chains a subscription update flagged as errored (e.g. unprocessedNetworks)', async () => { + const rpcMiddlewareGetter = jest.spyOn( + RpcDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) as unknown as jest.SpyInstance; + + const request: DataRequest = { + accountsWithSupportedChains: [], + chainIds: ['eip155:1'], + dataTypes: ['balance'], + }; + + await withController( + { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + async ({ controller }) => { + rpcMiddlewareGetter.mockClear(); + + await controller.handleAssetsUpdate( + { + assetsBalance: {}, + errors: { 'eip155:1': 'Unprocessed networks' }, + }, + 'AccountsApiDataSource', + request, + ); + }, + ); + + // The RpcFallbackMiddleware pulls the RPC data source middleware only when + // there are errored chains to recover. + expect(rpcMiddlewareGetter).toHaveBeenCalled(); + + rpcMiddlewareGetter.mockRestore(); + }); + + it('falls back to RPC for pinned assets a subscription update reported as unprocessed (unprocessedCustomAssets)', async () => { + const rpcMiddlewareGetter = jest.spyOn( + RpcDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) as unknown as jest.SpyInstance; + + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const request: DataRequest = { + accountsWithSupportedChains: [], + chainIds: ['eip155:1'], + dataTypes: ['balance'], + customAssets: [customToken], + }; + + await withController( + { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + async ({ controller }) => { + rpcMiddlewareGetter.mockClear(); + + await controller.handleAssetsUpdate( + { + assetsBalance: {}, + unprocessedCustomAssets: [customToken], + }, + 'AccountsApiDataSource', + request, + ); + }, + ); + + // The asset-axis signal also pulls the RPC data source middleware for an + // asset-scoped recovery. + expect(rpcMiddlewareGetter).toHaveBeenCalled(); + + rpcMiddlewareGetter.mockRestore(); + }); + + it('does not run the RPC fallback when a subscription update has no errored chains', async () => { + const rpcMiddlewareGetter = jest.spyOn( + RpcDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) as unknown as jest.SpyInstance; + + const request: DataRequest = { + accountsWithSupportedChains: [], + chainIds: ['eip155:1'], + dataTypes: ['balance'], + }; + + await withController(async ({ controller }) => { + rpcMiddlewareGetter.mockClear(); + + await controller.handleAssetsUpdate( + { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_NATIVE_ASSET_ID]: { amount: '1' }, + }, + }, + }, + 'AccountsApiDataSource', + request, + ); + }); + + expect(rpcMiddlewareGetter).not.toHaveBeenCalled(); + + rpcMiddlewareGetter.mockRestore(); + }); }); describe('getAssetsBalance', () => { @@ -2188,6 +2632,58 @@ describe('AssetsController', () => { }); }); + describe('two-axis subscription handoff (chains + custom assets)', () => { + it('claims pinned assets on account-activity-claimed chains instead of letting them fall through', async () => { + // Account activity claims eip155:1; its stream covers pins, so they + // stay with its subscription instead of falling through to a poller. + jest + .spyOn(AccountActivityDataSource.prototype, 'getActiveChainsSync') + .mockReturnValue(['eip155:1' as ChainId]); + const wsSubscribeSpy = jest + .spyOn(AccountActivityDataSource.prototype, 'subscribe') + .mockResolvedValue(undefined); + const rpcSubscribeSpy = jest + .spyOn(RpcDataSource.prototype, 'subscribe') + .mockResolvedValue(undefined); + + await withController( + { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + async ({ controller }) => { + await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); + + const wsRequest = wsSubscribeSpy.mock.calls.at(-1)?.[0].request; + expect(wsRequest?.chainIds).toStrictEqual(['eip155:1']); + expect(wsRequest?.customAssets).toStrictEqual([MOCK_ASSET_ID]); + + // Nothing was left for lower-priority sources to claim. + expect(rpcSubscribeSpy).not.toHaveBeenCalled(); + }, + ); + }); + + it('does not create an RPC subscription for pinned assets no source can claim', async () => { + // Account activity is not active on the pin's chain, so the pin falls + // through the whole handoff... + jest + .spyOn(AccountActivityDataSource.prototype, 'getActiveChainsSync') + .mockReturnValue([]); + jest + .spyOn(AccountActivityDataSource.prototype, 'subscribe') + .mockResolvedValue(undefined); + const rpcSubscribeSpy = jest + .spyOn(RpcDataSource.prototype, 'subscribe') + .mockResolvedValue(undefined); + + await withController(async ({ controller }) => { + // ...and RPC has no provider for the chain (no networks configured in + // the mocked NetworkController), so its real claim returns nothing. + await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); + + expect(rpcSubscribeSpy).not.toHaveBeenCalled(); + }); + }); + }); + describe('handleAssetsUpdate - state updates', () => { it('updates state with balance data', async () => { await withController(async ({ controller }) => { @@ -2560,7 +3056,7 @@ describe('AssetsController', () => { }); }); - it('replaces covered-chain balances in merge mode when replaceCoveredChainBalances is set', async () => { + it('replaces covered-chain balances in full mode, including custom assets', async () => { const initialState: Partial = { assetsBalance: { [MOCK_ACCOUNT_ID]: { @@ -2568,13 +3064,15 @@ describe('AssetsController', () => { [MOCK_NATIVE_ASSET_ID]: { amount: '0.5' }, }, }, + customAssets: { + [MOCK_ACCOUNT_ID]: [MOCK_ASSET_ID], + }, }; await withController({ state: initialState }, async ({ controller }) => { await controller.handleAssetsUpdate( { - updateMode: 'merge', - replaceCoveredChainBalances: true, + updateMode: 'full', assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_NATIVE_ASSET_ID]: { amount: '2' }, @@ -2595,7 +3093,48 @@ describe('AssetsController', () => { }); }); - it('preserves existing staked balances when replaceCoveredChainBalances omits them', async () => { + it('preserves unprocessed custom assets that RPC fallback could not recover', async () => { + const initialState: Partial = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_ASSET_ID]: { amount: '1' }, + [MOCK_NATIVE_ASSET_ID]: { amount: '0.5' }, + }, + }, + customAssets: { + [MOCK_ACCOUNT_ID]: [MOCK_ASSET_ID], + }, + }; + + await withController( + { state: initialState, isBasicFunctionality: () => false }, + async ({ controller }) => { + await controller.handleAssetsUpdate( + { + updateMode: 'full', + unprocessedCustomAssets: [MOCK_ASSET_ID], + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_NATIVE_ASSET_ID]: { amount: '2' }, + }, + }, + }, + 'TestSource', + ); + + expect( + controller.state.assetsBalance[MOCK_ACCOUNT_ID]?.[MOCK_ASSET_ID], + ).toStrictEqual({ amount: '1' }); + expect( + controller.state.assetsBalance[MOCK_ACCOUNT_ID]?.[ + MOCK_NATIVE_ASSET_ID + ], + ).toStrictEqual({ amount: '2' }); + }, + ); + }); + + it('preserves existing staked balances when a full update omits them', async () => { const stakingAssetId = 'eip155:1/erc20:0x4FEF9D741011476750A243aC70b9789a63dd47Df' as Caip19AssetId; const initialState: Partial = { @@ -2611,8 +3150,7 @@ describe('AssetsController', () => { await withController({ state: initialState }, async ({ controller }) => { await controller.handleAssetsUpdate( { - updateMode: 'merge', - replaceCoveredChainBalances: true, + updateMode: 'full', assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_NATIVE_ASSET_ID]: { amount: '2' }, @@ -3193,16 +3731,19 @@ describe('AssetsController', () => { ); }); - it('replaces pre-lock balances on unlock via merge with covered-chain replacement', async () => { - const fetchV5MultiAccountBalances = jest.fn().mockResolvedValue({ + it('replaces pre-lock balances on unlock with a full Accounts API v6 snapshot', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ balances: [ { accountId: 'eip155:1:0x1234567890123456789012345678901234567890', + object: 'token', + type: 'native', assetId: MOCK_NATIVE_ASSET_ID, balance: '2', }, ], unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], }); const queryApiClient = { @@ -3212,7 +3753,11 @@ describe('AssetsController', () => { fullSupport: [1], partialSupport: [], }), - fetchV5MultiAccountBalances, + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), }, } as unknown as ApiPlatformClient; @@ -3220,6 +3765,7 @@ describe('AssetsController', () => { { clientControllerState: { isUiOpen: true }, queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, state: { assetsBalance: { [MOCK_ACCOUNT_ID]: { diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index e3dffd5630b..5917800101c 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -164,6 +164,7 @@ import type { TransactionPayLegacyFormat, } from './utils/index.js'; import { emitTrace, withTrace } from './utils/trace.js'; +import type { TraceSpanData } from './utils/trace.js'; const NATIVE_ASSETS_QUERY_KEY = ['nativeAssets']; @@ -580,6 +581,15 @@ function normalizeResponse(response: DataResponse): DataResponse { normalized.replaceCoveredChainBalances = true; } + if ( + response.unprocessedCustomAssets && + response.unprocessedCustomAssets.length > 0 + ) { + normalized.unprocessedCustomAssets = response.unprocessedCustomAssets.map( + (assetId) => normalizeAssetId(assetId), + ); + } + return normalized; } @@ -588,16 +598,17 @@ function normalizeResponse(response: DataResponse): DataResponse { * * @param previousBalances - Balances already in state for this account. * @param accountBalances - Balances from the incoming response. - * @param customAssetIds - Custom assets to preserve when replacing covered chains. - * @param replaceCoveredChains - When true, drop prior balances on chains present - * in the response before applying it (authoritative chain slice). + * @param customAssetIds - Custom assets to preserve when replacing covered chains + * on the Accounts API v5 path (`replaceCoveredChainBalances`). + * @param replaceCoveredChains - When true (v5 force refresh), drop prior balances + * on chains present in the response before applying it, then restore custom assets. * @returns The merged balance map for the account. */ -function mergeAccountBalances( +function mergeAccountBalancesV5( previousBalances: Record, accountBalances: Record, - customAssetIds: Caip19AssetId[], - replaceCoveredChains: boolean, + customAssetIds: Caip19AssetId[] = [], + replaceCoveredChains = false, ): Record { if (!replaceCoveredChains) { return { ...previousBalances, ...accountBalances }; @@ -618,8 +629,8 @@ function mergeAccountBalances( for (const customId of customAssetIds) { if (!Object.prototype.hasOwnProperty.call(next, customId)) { - const prev = previousBalances[customId]; - next[customId] = prev ?? ({ amount: '0' } as AssetBalance); + const previous = previousBalances[customId]; + next[customId] = previous ?? ({ amount: '0' } as AssetBalance); } } @@ -638,6 +649,52 @@ function mergeAccountBalances( return next; } +/** + * Apply an Accounts API v6 authoritative chain snapshot. + * + * @param previousBalances - Balances already in state for this account. + * @param accountBalances - Balances from the incoming response. + * @param unprocessedCustomAssets - Pins that v6 and RPC could not resolve. + * @returns The merged balance map for the account. + */ +function mergeAccountBalancesV6( + previousBalances: Record, + accountBalances: Record, + unprocessedCustomAssets: Caip19AssetId[] = [], +): Record { + const coveredChains = new Set( + Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]), + ); + const next: Record = {}; + for (const [assetId, balance] of Object.entries(previousBalances)) { + if (!coveredChains.has(assetId.split('/')[0])) { + next[assetId] = balance; + } + } + Object.assign(next, accountBalances); + + const unprocessedSet = new Set( + unprocessedCustomAssets.map((assetId) => normalizeAssetId(assetId)), + ); + for (const [assetId, balance] of Object.entries(previousBalances)) { + if ( + unprocessedSet.has(normalizeAssetId(assetId as Caip19AssetId)) && + !Object.prototype.hasOwnProperty.call(next, assetId) + ) { + next[assetId] = balance; + } + } + for (const [assetId, balance] of Object.entries(previousBalances)) { + if ( + isStakingContractAssetId(assetId) && + !Object.prototype.hasOwnProperty.call(next, assetId) + ) { + next[assetId] = balance; + } + } + return next; +} + // ============================================================================ // CONTROLLER IMPLEMENTATION // ============================================================================ @@ -966,6 +1023,7 @@ export class AssetsController extends BaseController< queryApiClient, onActiveChainsUpdated: this.#onActiveChainsUpdated, ...accountsApiDataSourceConfig, + isBalanceV6Enabled: (): boolean => this.#isBalanceV6Enabled(), }); this.#snapDataSource = new SnapDataSource({ messenger: this.messenger, @@ -988,6 +1046,7 @@ export class AssetsController extends BaseController< isOnboarded: rpcConfig.isOnboarded ?? isOnboarded, getAssetType: (assetId: Caip19AssetId): 'native' | 'erc20' | 'spl' => this.#getAssetType(assetId), + isBalanceV6Enabled: (): boolean => this.#isBalanceV6Enabled(), }); this.#stakedBalanceDataSource = new StakedBalanceDataSource({ messenger: this.messenger, @@ -1023,6 +1082,7 @@ export class AssetsController extends BaseController< ); this.#rpcFallbackMiddleware = new RpcFallbackMiddleware({ rpcDataSource: this.#rpcDataSource, + isBalanceV6Enabled: (): boolean => this.#isBalanceV6Enabled(), }); log('Initializing AssetsController', { @@ -1619,8 +1679,12 @@ export class AssetsController extends BaseController< bypassServerCache?: boolean; dataTypes?: DataType[]; assetsForPriceUpdate?: Caip19AssetId[]; - /** When set to `'merge'`, fetch result is merged with existing state instead of replacing. Use for partial fetches (e.g. newly added chains). */ - updateMode?: AssetsUpdateMode; + /** + * v6 only: pinned assets to attach instead of every pin in state. + * Ignored when `assetsAccountsApiV6` is off. Entries outside the + * requested chains are dropped. + */ + customAssets?: Caip19AssetId[]; }, ): Promise>> { const chainIds = options?.chainIds ?? [...this.#enabledChains]; @@ -1631,171 +1695,427 @@ export class AssetsController extends BaseController< return this.#getAssetsFromState(accounts, chainIds, assetTypes); } - // Collect custom assets for all requested accounts - const customAssets: Caip19AssetId[] = []; - for (const account of accounts) { - const accountCustomAssets = this.getCustomAssets(account.id); - customAssets.push(...accountCustomAssets); - } - if (options?.forceUpdate) { - // Pipeline spans only on unlock/first-init fetch; later forceUpdates pass - // `undefined` so `emitTrace` / `withTrace` no-op without call-site if/else. const pipelineTrace = this.#firstInitFetchReported ? undefined : this.#trace; - - const request = this.#buildDataRequest(accounts, chainIds, { + const requestOptions = { assetTypes, dataTypes, - customAssets: customAssets.length > 0 ? customAssets : undefined, - forceUpdate: true, + forceUpdate: true as const, bypassServerCache: options?.bypassServerCache, assetsForPriceUpdate: options?.assetsForPriceUpdate, - }); + }; + + if (this.#isBalanceV6Enabled()) { + await this.#forceUpdateAssetsV6({ + accounts, + chainIds, + request: this.#buildForceUpdateRequestV6(accounts, chainIds, { + ...requestOptions, + customAssetsOverride: options?.customAssets, + }), + pipelineTrace, + }); + } else { + await this.#forceUpdateAssetsV5({ + accounts, + chainIds, + request: this.#buildForceUpdateRequestV5( + accounts, + chainIds, + requestOptions, + ), + pipelineTrace, + }); + } + } - // Fast pipeline: accountsApi + stakedBalance → detection → token + price. - // Snap and RPC are excluded here due to their latency (snap triggers account - // creation, RPC is slow on many chains). Results are committed to state - // immediately so the UI can display balances without waiting for them. - // - // Fast/slow pipelines use merge so partial API snapshots cannot wipe - // tokens missing from the response (e.g. USDC when only native balance - // is returned). Balances present in the response are still refreshed. - const fastSources = this.#isBasicFunctionality() - ? [ - createParallelBalanceMiddleware([ - this.#accountsApiDataSource, - this.#stakedBalanceDataSource, - ]), - // Graduation must run BEFORE the RPC fallback so it only sees - // AccountsApi/Websocket balances. RPC intentionally carries - // custom assets and must never trigger graduation. - this.#customAssetGraduationMiddleware, - this.#rpcFallbackMiddleware, - this.#detectionMiddleware, - createParallelMiddleware([ - this.#tokenDataSource, - this.#priceDataSource, - ]), - ] - : [this.#stakedBalanceDataSource, this.#detectionMiddleware]; + const result = this.#getAssetsFromState(accounts, chainIds, assetTypes); + return result; + } - const { response } = await withTrace({ - name: TRACE_FETCH_PIPELINE, - trace: pipelineTrace, - data: { - chain_count: chainIds.length, - account_count: accounts.length, - basic_functionality: this.#isBasicFunctionality(), - }, - fn: async (parentContext) => { - const startTime = performance.now(); - const result = await this.#executeMiddlewares({ - sources: fastSources, - request, - parentContext, - trace: pipelineTrace, - }); - await this.#updateState({ - ...result.response, - updateMode: 'merge', - replaceCoveredChainBalances: true, - }); + /** + * v5 force-update request: every pin of the requested accounts, unscoped. + * Delete with the rest of the v5 path when `assetsAccountsApiV6` is the default. + * + * @param accounts - Accounts in this fetch. + * @param chainIds - Chains in this fetch. + * @param requestOptions - Shared force-update request fields. + * @param requestOptions.assetTypes - Asset types to fetch. + * @param requestOptions.dataTypes - Data types to fetch. + * @param requestOptions.forceUpdate - Always `true` to bypass caches. + * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. + * @returns The v5 data request. + */ + #buildForceUpdateRequestV5( + accounts: InternalAccount[], + chainIds: ChainId[], + requestOptions: { + assetTypes: AssetType[]; + dataTypes: DataType[]; + forceUpdate: true; + assetsForPriceUpdate?: Caip19AssetId[]; + }, + ): DataRequest { + const customAssets: Caip19AssetId[] = []; + for (const account of accounts) { + customAssets.push(...this.getCustomAssets(account.id)); + } - const durationMs = performance.now() - startTime; - - // Summary fields for Assets Health (nested under the parent span). - emitTrace({ - name: TRACE_FULL_FETCH, - trace: pipelineTrace, - data: { - duration_ms: durationMs, - chain_count: chainIds.length, - account_count: accounts.length, - basic_functionality: this.#isBasicFunctionality(), - asset_count: result.response.assetsBalance - ? Object.values(result.response.assetsBalance).reduce( - (sum, acct) => sum + Object.keys(acct).length, - 0, - ) - : 0, - price_count: result.response.assetsPrice - ? Object.keys(result.response.assetsPrice).length - : 0, - ...result.durationByDataSource, - }, - parentContext, - }); + return this.#buildDataRequest(accounts, chainIds, { + ...requestOptions, + customAssets: customAssets.length > 0 ? customAssets : undefined, + }); + } - emitTrace({ - name: TRACE_FIRST_INIT_FETCH, - trace: pipelineTrace, - data: { - duration_ms: durationMs, - chain_ids: JSON.stringify(chainIds), - ...result.durationByDataSource, - }, - parentContext, - }); + /** + * v6 force-update request: chain-scoped pins (or `customAssets` override) + * plus hidden assets as `excludeAssetIds`. + * + * @param accounts - Accounts in this fetch. + * @param chainIds - Chains in this fetch. + * @param requestOptions - Shared force-update request fields and optional pin override. + * @param requestOptions.assetTypes - Asset types to fetch. + * @param requestOptions.dataTypes - Data types to fetch. + * @param requestOptions.forceUpdate - Always `true` to bypass caches. + * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. + * @param requestOptions.customAssetsOverride - Pinned assets to use instead of the stored custom assets. + * @returns The v6 data request. + */ + #buildForceUpdateRequestV6( + accounts: InternalAccount[], + chainIds: ChainId[], + requestOptions: { + assetTypes: AssetType[]; + dataTypes: DataType[]; + forceUpdate: true; + assetsForPriceUpdate?: Caip19AssetId[]; + customAssetsOverride?: Caip19AssetId[]; + }, + ): DataRequest { + const requestedChains = new Set(chainIds); + const candidateCustomAssets = + requestOptions.customAssetsOverride ?? + accounts.flatMap((account) => this.getCustomAssets(account.id)); + const customAssetsSet = new Set(); + for (const assetId of candidateCustomAssets) { + try { + const normalizedAssetId = normalizeAssetId(assetId); + if ( + requestedChains.has(parseCaipAssetType(normalizedAssetId).chainId) + ) { + customAssetsSet.add(normalizedAssetId); + } + } catch { + // Skip unparseable asset IDs + } + } + const customAssets = [...customAssetsSet]; + const hiddenAssets = this.#getHiddenAssetIds(); + + return this.#buildDataRequest(accounts, chainIds, { + assetTypes: requestOptions.assetTypes, + dataTypes: requestOptions.dataTypes, + forceUpdate: requestOptions.forceUpdate, + assetsForPriceUpdate: requestOptions.assetsForPriceUpdate, + customAssets: customAssets.length > 0 ? customAssets : undefined, + excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined, + }); + } - return result; - }, - }); + async #forceUpdateAssetsV5({ + accounts, + chainIds, + request, + pipelineTrace, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + request: DataRequest; + pipelineTrace?: TraceCallback; + }): Promise { + const isBasicFunctionality = this.#isBasicFunctionality(); + const fastSources = isBasicFunctionality + ? [ + createParallelBalanceMiddleware([ + this.#accountsApiDataSource, + this.#stakedBalanceDataSource, + ]), + this.#customAssetGraduationMiddleware, + this.#rpcFallbackMiddleware, + this.#detectionMiddleware, + createParallelMiddleware([ + this.#tokenDataSource, + this.#priceDataSource, + ]), + ] + : [this.#stakedBalanceDataSource, this.#detectionMiddleware]; + + const fastResponse = await this.#runFastFetchV5({ + accounts, + chainIds, + request, + pipelineTrace, + fastSources, + isBasicFunctionality, + }); + this.#firstInitFetchReported = true; - // Mark after the unlock/first forceUpdate so later polls skip pipeline spans. - this.#firstInitFetchReported = true; + this.#runBackgroundFetch({ + accounts, + request, + pipelineTrace, + chainIds: this.#getSlowPipelineChainIds(chainIds, fastResponse), + isBasicFunctionality, + }); + } - // Background (slow) lane — flattened sibling of the fast lane (not nested - // inside its withTrace callback). Still fire-and-forget so UI is not blocked. - const slowPipelineChainIds = this.#getSlowPipelineChainIds( - chainIds, - response, - ); + async #forceUpdateAssetsV6({ + accounts, + chainIds, + request, + pipelineTrace, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + request: DataRequest; + pipelineTrace?: TraceCallback; + }): Promise { + const isBasicFunctionality = this.#isBasicFunctionality(); + const fastSources = isBasicFunctionality + ? [ + createParallelBalanceMiddleware([ + this.#accountsApiDataSource, + this.#stakedBalanceDataSource, + ]), + this.#detectionMiddleware, + createParallelMiddleware([ + this.#tokenDataSource, + this.#priceDataSource, + ]), + ] + : [this.#stakedBalanceDataSource, this.#detectionMiddleware]; + + const fastResponse = await this.#runFastFetchV6({ + accounts, + chainIds, + request, + pipelineTrace, + fastSources, + isBasicFunctionality, + }); + this.#firstInitFetchReported = true; - if (slowPipelineChainIds.length > 0) { - const slowSources = this.#isBasicFunctionality() - ? [this.#snapDataSource, this.#rpcDataSource] - : [this.#rpcDataSource]; + this.#runBackgroundFetch({ + accounts, + request, + pipelineTrace, + chainIds: this.#getSlowPipelineChainIds(chainIds, fastResponse), + isBasicFunctionality, + }); + } - const slowRequest = { ...request, chainIds: slowPipelineChainIds }; + async #runFastFetchV5({ + accounts, + chainIds, + request, + pipelineTrace, + fastSources, + isBasicFunctionality, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + request: DataRequest; + pipelineTrace?: TraceCallback; + fastSources: AssetsDataSource[]; + isBasicFunctionality: boolean; + }): Promise { + const { response } = await withTrace({ + name: TRACE_FETCH_PIPELINE, + trace: pipelineTrace, + data: { + chain_count: chainIds.length, + account_count: accounts.length, + basic_functionality: isBasicFunctionality, + }, + fn: async (parentContext) => { + const startTime = performance.now(); + const result = await this.#executeMiddlewares({ + sources: fastSources, + request, + parentContext, + trace: pipelineTrace, + }); + await this.#updateState({ + ...result.response, + updateMode: 'merge', + replaceCoveredChainBalances: true, + }); + this.#emitFastFetchTraces({ + accounts, + chainIds, + result, + durationMs: performance.now() - startTime, + isBasicFunctionality, + parentContext, + pipelineTrace, + }); + return result; + }, + }); + return response; + } - withTrace({ - name: TRACE_BACKGROUND_FETCH, + async #runFastFetchV6({ + accounts, + chainIds, + request, + pipelineTrace, + fastSources, + isBasicFunctionality, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + request: DataRequest; + pipelineTrace?: TraceCallback; + fastSources: AssetsDataSource[]; + isBasicFunctionality: boolean; + }): Promise { + const { response } = await withTrace({ + name: TRACE_FETCH_PIPELINE, + trace: pipelineTrace, + data: { + chain_count: chainIds.length, + account_count: accounts.length, + basic_functionality: isBasicFunctionality, + }, + fn: async (parentContext) => { + const startTime = performance.now(); + const result = await this.#executeMiddlewares({ + sources: fastSources, + request, + parentContext, trace: pipelineTrace, - data: { - chain_count: slowPipelineChainIds.length, - account_count: accounts.length, - }, - fn: async (slowParentContext) => { - const { response: slowResponse } = await this.#executeMiddlewares({ - sources: [ - createParallelBalanceMiddleware(slowSources), - this.#detectionMiddleware, - ...(this.#isBasicFunctionality() - ? [ - createParallelMiddleware([ - this.#tokenDataSource, - this.#priceDataSource, - ]), - ] - : []), - ], - request: slowRequest, - parentContext: slowParentContext, - trace: pipelineTrace, - }); - await this.#updateState({ - ...slowResponse, - updateMode: 'merge', - }); - }, - }).catch((error) => log('Background pipeline failed', { error })); - } + }); + await this.#updateState(result.response); + this.#emitFastFetchTraces({ + accounts, + chainIds, + result, + durationMs: performance.now() - startTime, + isBasicFunctionality, + parentContext, + pipelineTrace, + }); + return result; + }, + }); + return response; + } + + #runBackgroundFetch({ + accounts, + chainIds, + request, + pipelineTrace, + isBasicFunctionality, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + request: DataRequest; + pipelineTrace?: TraceCallback; + isBasicFunctionality: boolean; + }): void { + if (chainIds.length === 0) { + return; } + const slowSources = isBasicFunctionality + ? [this.#snapDataSource, this.#rpcDataSource] + : [this.#rpcDataSource]; + const slowRequest = { ...request, chainIds }; - const result = this.#getAssetsFromState(accounts, chainIds, assetTypes); - return result; + withTrace({ + name: TRACE_BACKGROUND_FETCH, + trace: pipelineTrace, + data: { + chain_count: chainIds.length, + account_count: accounts.length, + }, + fn: async (parentContext) => { + const { response } = await this.#executeMiddlewares({ + sources: [ + createParallelBalanceMiddleware(slowSources), + this.#detectionMiddleware, + ...(isBasicFunctionality + ? [ + createParallelMiddleware([ + this.#tokenDataSource, + this.#priceDataSource, + ]), + ] + : []), + ], + request: slowRequest, + parentContext, + trace: pipelineTrace, + }); + await this.#updateState({ ...response, updateMode: 'merge' }); + }, + }).catch((error) => log('Background pipeline failed', { error })); + } + + #emitFastFetchTraces({ + accounts, + chainIds, + result, + durationMs, + isBasicFunctionality, + parentContext, + pipelineTrace, + }: { + accounts: InternalAccount[]; + chainIds: ChainId[]; + result: { + response: DataResponse; + durationByDataSource: Record; + }; + durationMs: number; + isBasicFunctionality: boolean; + parentContext?: TraceContext; + pipelineTrace?: TraceCallback; + }): void { + emitTrace({ + name: TRACE_FULL_FETCH, + trace: pipelineTrace, + data: { + duration_ms: durationMs, + chain_count: chainIds.length, + account_count: accounts.length, + basic_functionality: isBasicFunctionality, + asset_count: result.response.assetsBalance + ? Object.values(result.response.assetsBalance).reduce( + (sum, account) => sum + Object.keys(account).length, + 0, + ) + : 0, + price_count: result.response.assetsPrice + ? Object.keys(result.response.assetsPrice).length + : 0, + ...result.durationByDataSource, + }, + parentContext, + }); + emitTrace({ + name: TRACE_FIRST_INIT_FETCH, + trace: pipelineTrace, + data: { + duration_ms: durationMs, + chain_ids: JSON.stringify(chainIds), + ...result.durationByDataSource, + }, + parentContext, + }); } async getAssetsBalance( @@ -2153,21 +2473,28 @@ export class AssetsController extends BaseController< balances[accountId][normalizedAssetId] ??= { amount: '0' }; }); - // Fetch data for the newly added custom asset (merge to preserve other chains) const account = this.#getSelectedAccounts().find((a) => a.id === accountId); if (account) { const chainId = extractChainId(normalizedAssetId); - await this.getAssets([account], { - chainIds: [chainId], - dataTypes: ['balance', 'metadata', 'price'], - assetTypes: ['fungible'], - forceUpdate: true, - updateMode: 'merge', - }); + if (this.#isBalanceV6Enabled()) { + await this.getAssets([account], { + chainIds: [chainId], + dataTypes: ['balance', 'metadata', 'price'], + assetTypes: ['fungible'], + forceUpdate: true, + customAssets: [normalizedAssetId], + }); + } else { + await this.getAssets([account], { + chainIds: [chainId], + dataTypes: ['balance', 'metadata', 'price'], + assetTypes: ['fungible'], + forceUpdate: true, + }); + } } - // Re-evaluate subscriptions so the supplemental RPC poll picks up the - // new customAsset on chains another data source already owns. + // Re-evaluate subscriptions so polls pick up the new pin. this.#subscribeAssets(); } @@ -2195,8 +2522,7 @@ export class AssetsController extends BaseController< } }); - // Re-evaluate subscriptions so the supplemental RPC poll for that chain - // is torn down when no more customAssets remain there. + // Re-evaluate subscriptions so polls drop the removed pin. this.#subscribeAssets(); } @@ -2232,6 +2558,9 @@ export class AssetsController extends BaseController< } state.assetPreferences[normalizedAssetId].hidden = true; }); + + // Re-evaluate subscriptions so polls exclude the newly hidden asset. + this.#subscribeAssets(); } /** @@ -2253,6 +2582,49 @@ export class AssetsController extends BaseController< } } }); + + // Re-evaluate subscriptions so polls stop excluding the asset. + this.#subscribeAssets(); + } + + /** + * Collect globally hidden asset IDs (from `assetPreferences`), forwarded on + * data requests as `excludeAssetIds`. + * + * @returns The CAIP-19 asset IDs the user has hidden. + */ + #getHiddenAssetIds(): Caip19AssetId[] { + const hidden: Caip19AssetId[] = []; + for (const [assetId, prefs] of Object.entries( + this.state.assetPreferences, + )) { + if (prefs.hidden) { + hidden.push(assetId as Caip19AssetId); + } + } + return hidden; + } + + /** + * Whether Accounts API v6 (and the v6 custom-asset path) is enabled. + * Injected into AccountsApiDataSource and RpcFallbackMiddleware. + * + * @returns `true` when the v6 remote flag is on. + */ + #isBalanceV6Enabled(): boolean { + try { + const { remoteFeatureFlags } = this.messenger.call( + 'RemoteFeatureFlagController:getState', + ); + const flag = remoteFeatureFlags?.assetsAccountsApiV6; + return ( + typeof flag === 'object' && + flag !== null && + Boolean((flag as { value?: unknown }).value) + ); + } catch { + return false; + } } // ============================================================================ @@ -2550,10 +2922,21 @@ export class AssetsController extends BaseController< this.#accountsApiDataSource.getActiveChainsSync(), ); + // Chains whose pins went unresolved (`unprocessedCustomAssets`): route + // them to the slow pipeline so RPC fetches the pins. + const unprocessedCustomAssetChains = new Set( + (fastResponse.unprocessedCustomAssets ?? []).map( + (assetId) => assetId.split('/')[0] as ChainId, + ), + ); + return chainIds.filter((chainId) => { if (fastResponse.errors?.[chainId]) { return true; } + if (unprocessedCustomAssetChains.has(chainId)) { + return true; + } if (!accountsApiChains.has(chainId)) { return true; } @@ -2765,21 +3148,25 @@ export class AssetsController extends BaseController< )) { const previousBalances = previousState.assetsBalance[accountId] ?? {}; + const customAssetIds = (state.customAssets as Record)[ accountId ] ?? []; - const replaceCoveredChains = - mode === 'full' || - normalizedResponse.replaceCoveredChainBalances === true; - - const effective = mergeAccountBalances( - previousBalances, - accountBalances, - customAssetIds, - replaceCoveredChains, - ); + const effective = + mode === 'full' + ? mergeAccountBalancesV6( + previousBalances, + accountBalances, + normalizedResponse.unprocessedCustomAssets ?? [], + ) + : mergeAccountBalancesV5( + previousBalances, + accountBalances, + customAssetIds, + normalizedResponse.replaceCoveredChainBalances === true, + ); // Ensure native tokens have an entry (0 if missing) for chains this account supports const account = this.#getSelectedAccounts().find( @@ -2865,12 +3252,10 @@ export class AssetsController extends BaseController< log('State updated', { changedBalances: changedBalances.length > 0 ? changedBalances : undefined, - changedMetadataCount: - changedMetadata.length > 0 ? changedMetadata.length : undefined, - changedPricesCount: - changedPriceAssets.length > 0 - ? changedPriceAssets.length - : undefined, + changedMetadata: + changedMetadata.length > 0 ? changedMetadata : undefined, + changedPrices: + changedPriceAssets.length > 0 ? changedPriceAssets : undefined, newAssets: Object.keys(detectedAssets).length > 0 ? Object.entries(detectedAssets).map(([accountId, assets]) => ({ @@ -3142,16 +3527,10 @@ export class AssetsController extends BaseController< if (!subscriptionKey.startsWith('ds:')) { continue; } - // Subscription keys take the form `ds:` for the regular - // subscription or `ds::` for supplemental - // subscriptions (e.g. `ds:RpcDataSource:custom`). Split on `:` and - // pick the source-name segment so both shapes resolve correctly. + // Subscription keys take the form `ds:`. const [, sourceId] = subscriptionKey.split(':'); const source = allSources.find((ds) => ds.getName() === sourceId); if (source) { - // Unsubscribe by the actual key — `#unsubscribeDataSource` only - // knows the regular `ds:` shape and would miss - // supplemental subscriptions, leaking their polling timers. this.#unsubscribeBySubscriptionKey(source, subscriptionKey); } } @@ -3201,10 +3580,12 @@ export class AssetsController extends BaseController< * Strategy to minimize data source calls: * 1. Collect all chains to subscribe based on enabled networks * 2. Map chains to accounts based on their scopes - * 3. Split by data source (ordered by priority) - each data source gets ONE subscription + * 3. Split by data source (priority order) - each source gets ONE + * subscription, claiming chains AND pinned assets (`claimCustomAssets`); + * unclaimed assets fall through to lower-priority sources. * * This ensures we make minimal subscriptions to each data source while covering - * all accounts and chains. + * all accounts, chains, and pinned assets. * * @param accounts - Accounts to subscribe balance updates for. * @param chainIds - Chain IDs to subscribe for. @@ -3215,19 +3596,27 @@ export class AssetsController extends BaseController< accounts: InternalAccount[], chainIds: ChainId[], options?: { skipInitialFetch?: boolean }, + ): void { + if (this.#isBalanceV6Enabled()) { + this.#subscribeAssetsBalanceV6(accounts, chainIds, options); + return; + } + this.#subscribeAssetsBalanceV5(accounts, chainIds, options); + } + + #subscribeAssetsBalanceV5( + accounts: InternalAccount[], + chainIds: ChainId[], + options?: { skipInitialFetch?: boolean }, ): void { const chainToAccounts = this.#buildChainToAccountsMap( accounts, new Set(chainIds), ); const remainingChains = new Set(chainToAccounts.keys()); - // When basic functionality is on, use all balance data sources; when off, - // RPC only. - const isBasicFunctionality = this.#isBasicFunctionality(); - const balanceDataSources = isBasicFunctionality + const balanceDataSources = this.#isBasicFunctionality() ? this.#allBalanceDataSources : [this.#rpcDataSource]; - let rpcAssignedChains: Set = new Set(); for (const source of balanceDataSources) { @@ -3240,16 +3629,13 @@ export class AssetsController extends BaseController< remainingChains.delete(chainId); } } - if (assignedChains.length === 0) { this.#unsubscribeDataSource(source); continue; } - if (source === this.#rpcDataSource) { rpcAssignedChains = new Set(assignedChains); } - const seenIds = new Set(); const accountsForSource = assignedChains .flatMap((chainId) => chainToAccounts.get(chainId) ?? []) @@ -3270,12 +3656,6 @@ export class AssetsController extends BaseController< } } - // Supplemental RPC subscription for customAssets on chains another data - // source claimed during regular handoff. RPC is the sole balance fetcher - // for customAssets, so we must always poll them — even when (e.g.) - // AccountsApi is already covering the chain for normal balances. The - // supplemental subscription runs in `customAssetsOnly` mode so it does - // NOT double-poll the regular tracked balances. this.#subscribeRpcCustomAssetsSupplement( accounts, chainToAccounts, @@ -3283,14 +3663,105 @@ export class AssetsController extends BaseController< ); } + #subscribeAssetsBalanceV6( + accounts: InternalAccount[], + chainIds: ChainId[], + options?: { skipInitialFetch?: boolean }, + ): void { + const chainToAccounts = this.#buildChainToAccountsMap( + accounts, + new Set(chainIds), + ); + const remainingChains = new Set(chainToAccounts.keys()); + const remainingCustomAssets = new Set(); + for (const account of accounts) { + for (const assetId of this.getCustomAssets(account.id)) { + try { + if (remainingChains.has(parseCaipAssetType(assetId).chainId)) { + remainingCustomAssets.add(assetId); + } + } catch { + // Skip unparseable asset IDs + } + } + } + const balanceDataSources = this.#isBasicFunctionality() + ? this.#allBalanceDataSources + : [this.#rpcDataSource]; + + for (const source of balanceDataSources) { + const availableChains = new Set(source.getActiveChainsSync()); + const assignedChains: ChainId[] = []; + + for (const chainId of remainingChains) { + if (availableChains.has(chainId)) { + assignedChains.push(chainId); + remainingChains.delete(chainId); + } + } + + const claimedAssets = source.claimCustomAssets( + [...remainingCustomAssets], + assignedChains, + ); + for (const assetId of claimedAssets) { + remainingCustomAssets.delete(assetId); + } + if (assignedChains.length === 0 && claimedAssets.length === 0) { + this.#unsubscribeDataSource(source); + continue; + } + + const claimedAssetsSet = new Set(claimedAssets); + const seenIds = new Set(); + const accountsForSource = assignedChains + .flatMap((chainId) => chainToAccounts.get(chainId) ?? []) + .filter((account) => { + if (seenIds.has(account.id)) { + return false; + } + seenIds.add(account.id); + return true; + }); + for (const account of accounts) { + if ( + !seenIds.has(account.id) && + this.getCustomAssets(account.id).some((assetId) => + claimedAssetsSet.has(assetId), + ) + ) { + seenIds.add(account.id); + accountsForSource.push(account); + } + } + + if (accountsForSource.length > 0) { + const hiddenAssets = this.#getHiddenAssetIds(); + this.#subscribeDataSource(source, accountsForSource, assignedChains, { + customAssets: claimedAssets, + excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined, + ...(options?.skipInitialFetch && + source === this.#accountsApiDataSource + ? { skipInitialFetch: true } + : {}), + }); + } else { + this.#unsubscribeDataSource(source); + } + } + + if (remainingCustomAssets.size > 0) { + log('Custom assets unclaimed by any data source', { + assetIds: [...remainingCustomAssets], + }); + } + } + /** * Guarantee that customAssets are **always** polled by RPC, even when * AccountsApi or another data source has claimed the chain in the * regular handoff. RPC is the sole balance fetcher for user-imported - * tokens (see `pickRpcCustomAssetsSupplement` for the full rationale), - * so we run a dedicated subscription in `customAssetsOnly` mode under a - * distinct subscription key (`ds:RpcDataSource:custom`) that does not - * interfere with the regular RPC subscription. + * tokens on the Accounts API v5 path (see `pickRpcCustomAssetsSupplement`). * * @param accounts - Accounts to consider for customAssets. * @param chainToAccounts - Map of chain → accounts (built by caller). @@ -3415,7 +3886,12 @@ export class AssetsController extends BaseController< * @param chains - Array of chain IDs to subscribe for. * @param options - Optional subscription overrides. * @param options.subscriptionKey - Custom subscription key (default: `ds:`). - * @param options.customAssetsOnly - When true, only poll customAssets for these chains. + * @param options.customAssets - Pinned assets this source claimed + * (`claimCustomAssets`), forwarded on the poll request (Accounts API v6). + * @param options.customAssetsOnly - When true, only poll customAssets for these + * chains (Accounts API v5 supplemental RPC subscription). + * @param options.excludeAssetIds - Hidden assets forwarded on the poll request + * (Accounts API v6). * @param options.skipInitialFetch - When true, skip the data source's subscribe-time fetch. */ #subscribeDataSource( @@ -3424,6 +3900,8 @@ export class AssetsController extends BaseController< chains: ChainId[], options: { subscriptionKey?: string; + customAssets?: Caip19AssetId[]; + excludeAssetIds?: Caip19AssetId[]; customAssetsOnly?: boolean; skipInitialFetch?: boolean; } = {}, @@ -3432,6 +3910,7 @@ export class AssetsController extends BaseController< const subscriptionKey = options.subscriptionKey ?? `ds:${sourceId}`; const existingSubscription = this.#activeSubscriptions.get(subscriptionKey); const isUpdate = existingSubscription !== undefined; + const customAssets = options.customAssets ?? []; log('Subscribe to data source', { sourceId, @@ -3439,6 +3918,7 @@ export class AssetsController extends BaseController< isUpdate, accountCount: accounts.length, chainCount: chains.length, + customAssetCount: customAssets.length, customAssetsOnly: options.customAssetsOnly === true, skipInitialFetch: options.skipInitialFetch === true, }); @@ -3448,6 +3928,11 @@ export class AssetsController extends BaseController< assetTypes: ['fungible'], dataTypes: ['balance'], updateInterval: this.#defaultUpdateInterval, + customAssets: customAssets.length > 0 ? customAssets : undefined, + excludeAssetIds: + options.excludeAssetIds && options.excludeAssetIds.length > 0 + ? options.excludeAssetIds + : undefined, ...(options.customAssetsOnly === true ? { customAssetsOnly: true } : {}), @@ -3685,13 +4170,13 @@ export class AssetsController extends BaseController< // Refresh subscriptions for new chain set this.#subscribeAssets(); - // Do one-time fetch for newly enabled chains; merge so we keep existing chain balances + // One-time fetch for newly enabled chains. v6 `full` replace is scoped to + // those chains; existing balances on other chains are left untouched. const accounts = this.#getSelectedAccounts(); if (addedChains.length > 0 && accounts.length > 0) { await this.getAssets(accounts, { chainIds: addedChains, forceUpdate: true, - updateMode: 'merge', }); } @@ -3878,57 +4363,35 @@ export class AssetsController extends BaseController< ): Promise { log('Assets updated from data source', { sourceId, - hasBalance: Boolean(response.assetsBalance), - hasPrice: Boolean(response.assetsPrice), + assetsBalance: response.assetsBalance, + assetsPrice: response.assetsPrice, }); - // Enrichment spans only before unlock/first-init fetch completes. + if (this.#isBalanceV6Enabled()) { + await this.#handleAssetsUpdateV6(response, sourceId, request); + return; + } + await this.#handleAssetsUpdateV5(response, sourceId, request); + } + + async #handleAssetsUpdateV5( + response: DataResponse, + sourceId: string, + request?: DataRequest, + ): Promise { const pipelineTrace = this.#firstInitFetchReported ? undefined : this.#trace; - await withTrace({ name: TRACE_UPDATE_PARENT, trace: pipelineTrace, - data: { - source: sourceId, - has_balance: Boolean(response.assetsBalance), - has_price: Boolean(response.assetsPrice), - balance_account_count: response.assetsBalance - ? Object.keys(response.assetsBalance).length - : 0, - }, + data: this.#getUpdateTraceData(response, sourceId), fn: async (parentContext) => { const updateStart = performance.now(); - - const resolvedRequest: DataRequest = request ?? { - accountsWithSupportedChains: [], - chainIds: [], - dataTypes: ['balance', 'metadata', 'price'], - }; - - // RPC-only mode (basic functionality off): never run token/price APIs. Strip - // those data types so downstream middleware cannot treat them as requested. - const pipelineRequest: DataRequest = this.#isBasicFunctionality() - ? resolvedRequest - : { - ...resolvedRequest, - dataTypes: resolvedRequest.dataTypes.filter( - (dt) => dt !== 'metadata' && dt !== 'price', - ), - }; - - // Graduate custom assets only when AccountsAPI / AccountActivity reports - // them. RPC already fetches custom assets on purpose, and Snap handles - // non-EVM chains the rule does not apply to, so skip the middleware for - // those. + const pipelineRequest = this.#getUpdatePipelineRequest(request); const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' || sourceId === 'AccountActivityDataSource'; - - // Websocket updates can carry brand-new spam airdrops: enrich them - // with Token API occurrences and drop below-floor tokens BEFORE - // detection, so spam is never detected, enriched, priced or persisted. const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' && this.#isBasicFunctionality(); @@ -3950,6 +4413,7 @@ export class AssetsController extends BaseController< ...(shouldRunRpcFallback ? [this.#rpcFallbackMiddleware] : []), this.#detectionMiddleware, ]; + enrichmentSources.push(this.#detectionMiddleware); if (this.#isBasicFunctionality()) { enrichmentSources.push( createParallelMiddleware([ @@ -3971,27 +4435,141 @@ export class AssetsController extends BaseController< ...enrichedResponse, replaceCoveredChainBalances: response.replaceCoveredChainBalances, }); + this.#emitUpdateTrace({ + response, + sourceId, + enrichedResponse, + updateStart, + pipelineTrace, + parentContext, + }); + }, + }); + } - // Summary fields for Assets Health (nested under the parent span). - emitTrace({ - name: TRACE_UPDATE_PIPELINE, + async #handleAssetsUpdateV6( + response: DataResponse, + sourceId: string, + request?: DataRequest, + ): Promise { + const pipelineTrace = this.#firstInitFetchReported + ? undefined + : this.#trace; + await withTrace({ + name: TRACE_UPDATE_PARENT, + trace: pipelineTrace, + data: this.#getUpdateTraceData(response, sourceId), + fn: async (parentContext) => { + const updateStart = performance.now(); + const pipelineRequest = this.#getUpdatePipelineRequest(request); + const shouldFilterOccurrences = + sourceId === 'AccountActivityDataSource' && + this.#isBasicFunctionality(); + const enrichmentSources: AssetsDataSource[] = [ + ...(shouldFilterOccurrences + ? [ + { + getName: () => 'OccurrenceFloorFilter', + assetsMiddleware: + this.#tokenDataSource.occurrenceFilterMiddleware, + }, + ] + : []), + ]; + if (this.#isBasicFunctionality()) { + enrichmentSources.push(this.#rpcFallbackMiddleware); + } + enrichmentSources.push(this.#detectionMiddleware); + if (this.#isBasicFunctionality()) { + enrichmentSources.push( + createParallelMiddleware([ + this.#tokenDataSource, + this.#priceDataSource, + ]), + ); + } + + const { response: enrichedResponse } = await this.#executeMiddlewares({ + sources: enrichmentSources, + request: pipelineRequest, + initialResponse: response, + parentContext, trace: pipelineTrace, - data: { - source: sourceId, - duration_ms: performance.now() - updateStart, - has_balance: Boolean(response.assetsBalance), - has_price: Boolean(response.assetsPrice), - has_metadata: Boolean(enrichedResponse.assetsInfo), - balance_account_count: response.assetsBalance - ? Object.keys(response.assetsBalance).length - : 0, - }, + }); + + await this.#updateState(enrichedResponse); + this.#emitUpdateTrace({ + response, + sourceId, + enrichedResponse, + updateStart, + pipelineTrace, parentContext, }); }, }); } + #getUpdatePipelineRequest(request?: DataRequest): DataRequest { + const resolvedRequest: DataRequest = request ?? { + accountsWithSupportedChains: [], + chainIds: [], + dataTypes: ['balance', 'metadata', 'price'], + }; + if (this.#isBasicFunctionality()) { + return resolvedRequest; + } + return { + ...resolvedRequest, + dataTypes: resolvedRequest.dataTypes.filter( + (dataType) => dataType !== 'metadata' && dataType !== 'price', + ), + }; + } + + #getUpdateTraceData(response: DataResponse, sourceId: string): TraceSpanData { + return { + source: sourceId, + has_balance: Boolean(response.assetsBalance), + has_price: Boolean(response.assetsPrice), + balance_account_count: response.assetsBalance + ? Object.keys(response.assetsBalance).length + : 0, + }; + } + + #emitUpdateTrace({ + response, + sourceId, + enrichedResponse, + updateStart, + pipelineTrace, + parentContext, + }: { + response: DataResponse; + sourceId: string; + enrichedResponse: DataResponse; + updateStart: number; + pipelineTrace?: TraceCallback; + parentContext?: TraceContext; + }): void { + emitTrace({ + name: TRACE_UPDATE_PIPELINE, + trace: pipelineTrace, + data: { + source: sourceId, + duration_ms: performance.now() - updateStart, + has_balance: Boolean(response.assetsBalance), + has_price: Boolean(response.assetsPrice), + has_metadata: Boolean(enrichedResponse.assetsInfo), + balance_account_count: response.assetsBalance + ? Object.keys(response.assetsBalance).length + : 0, + }, + parentContext, + }); + } + // ============================================================================ // CLEANUP // ============================================================================ diff --git a/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts b/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts index 98c5262e8e6..b4e11723bf6 100644 --- a/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts @@ -1,4 +1,4 @@ -import type { ChainId } from '../types.js'; +import type { Caip19AssetId, ChainId } from '../types.js'; import type { ActiveSubscription, DataSourceState, @@ -113,6 +113,43 @@ describe('AbstractDataSource', () => { expect(dataSource.getSubscriptions().size).toBe(0); }); + describe('claimCustomAssets', () => { + it('claims assets on assigned chains by default and skips others', () => { + const { dataSource } = setupDataSource(); + + const assignedChainAsset = + `${CHAIN_MAINNET}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + const unassignedChainAsset = + `${CHAIN_POLYGON}/erc20:0x2222222222222222222222222222222222222222` as Caip19AssetId; + + expect( + dataSource.claimCustomAssets( + [assignedChainAsset, unassignedChainAsset], + [CHAIN_MAINNET], + ), + ).toStrictEqual([assignedChainAsset]); + }); + + it('skips malformed asset IDs and claims nothing without assigned chains', () => { + const { dataSource } = setupDataSource(); + + expect( + dataSource.claimCustomAssets( + ['not-a-caip-asset' as Caip19AssetId], + [CHAIN_MAINNET], + ), + ).toStrictEqual([]); + expect( + dataSource.claimCustomAssets( + [ + `${CHAIN_MAINNET}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId, + ], + [], + ), + ).toStrictEqual([]); + }); + }); + it.each([ { chains: [], expected: [] }, { chains: [CHAIN_MAINNET], expected: [CHAIN_MAINNET] }, diff --git a/packages/assets-controller/src/data-sources/AbstractDataSource.ts b/packages/assets-controller/src/data-sources/AbstractDataSource.ts index 6023b18dfb2..be690a116e3 100644 --- a/packages/assets-controller/src/data-sources/AbstractDataSource.ts +++ b/packages/assets-controller/src/data-sources/AbstractDataSource.ts @@ -1,4 +1,7 @@ +import { parseCaipAssetType } from '@metamask/utils'; + import type { + Caip19AssetId, ChainId, DataRequest, DataResponse, @@ -117,6 +120,31 @@ export abstract class AbstractDataSource< return this.state.activeChains; } + /** + * Claim the pinned assets this source commits to serving. Called during the + * subscription handoff; claimed assets are not offered to lower-priority + * sources. Assets a source cannot resolve at fetch time are released via + * `DataResponse.unprocessedCustomAssets`. Default: claim assets on this + * source's assigned chains. + * + * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. + * @param assignedChains - Chains assigned to this source in the handoff. + * @returns The claimed subset of `customAssets`. + */ + claimCustomAssets( + customAssets: Caip19AssetId[], + assignedChains: ChainId[], + ): Caip19AssetId[] { + const assigned = new Set(assignedChains); + return customAssets.filter((assetId) => { + try { + return assigned.has(parseCaipAssetType(assetId).chainId); + } catch { + return false; + } + }); + } + /** * Subscribe to updates for the given request. */ diff --git a/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts b/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts index 576d1dceafd..8cd27366515 100644 --- a/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts @@ -250,6 +250,9 @@ export class AccountActivityDataSource extends AbstractDataSource< // SUBSCRIBE / UNSUBSCRIBE // ============================================================================ + // Pins on active chains are claimed via the inherited `claimCustomAssets`: + // the activity stream pushes all activity for the address, pins included. + /** * AADS is event-driven and chain-agnostic: it never participates in the * controller's subscribe/unsubscribe handoff. Incoming `balanceUpdated` diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts index 382439a702d..7776e216372 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts @@ -34,6 +34,17 @@ const CHAIN_POLYGON = 'eip155:137' as ChainId; const CHAIN_ARBITRUM = 'eip155:42161' as ChainId; const MOCK_ADDRESS = '0x1234567890123456789012345678901234567890'; +function isBalanceV6EnabledFromFlags( + remoteFeatureFlags: Record, +): boolean { + const flag = remoteFeatureFlags.assetsAccountsApiV6; + return ( + typeof flag === 'object' && + flag !== null && + Boolean((flag as { value?: unknown }).value) + ); +} + type MockApiClient = { accounts: { fetchV2SupportedNetworks: jest.Mock; @@ -67,6 +78,7 @@ function createMockApiClient( balances: V5BalanceItem[] = [], unprocessedNetworks: string[] = [], v6Balances: V6BalanceItem[] = [], + unprocessedIncludeAssetIds: string[] = [], ): MockApiClient { return { accounts: { @@ -81,7 +93,7 @@ function createMockApiClient( fetchV6MultiAccountBalances: jest.fn().mockResolvedValue({ balances: v6Balances, unprocessedNetworks, - unprocessedIncludeAssetIds: [], + unprocessedIncludeAssetIds, }), }, }; @@ -144,6 +156,7 @@ async function setupController( supportedChains?: number[]; balances?: V5BalanceItem[]; unprocessedNetworks?: string[]; + unprocessedIncludeAssetIds?: string[]; fetchTimeoutMs?: number; v6Balances?: V6BalanceItem[]; remoteFeatureFlags?: Record; @@ -153,6 +166,7 @@ async function setupController( supportedChains = [1, 137], balances = [], unprocessedNetworks = [], + unprocessedIncludeAssetIds = [], fetchTimeoutMs, v6Balances = [], remoteFeatureFlags = {}, @@ -196,6 +210,7 @@ async function setupController( balances, unprocessedNetworks, v6Balances, + unprocessedIncludeAssetIds, ); const controller = new AccountsApiDataSource({ @@ -205,6 +220,8 @@ async function setupController( apiClient as unknown as AccountsApiDataSourceOptions['queryApiClient'], onActiveChainsUpdated: (dataSourceName, chains, previousChains): void => activeChainsUpdateHandler(dataSourceName, chains, previousChains), + isBalanceV6Enabled: (): boolean => + isBalanceV6EnabledFromFlags(remoteFeatureFlags), ...(fetchTimeoutMs === undefined ? {} : { fetchTimeoutMs }), }); @@ -648,6 +665,48 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); + describe('claimCustomAssets', () => { + const assignedChainAsset = + 'eip155:1/erc20:0x1111111111111111111111111111111111111111'; + const unassignedChainAsset = + 'eip155:137/erc20:0x2222222222222222222222222222222222222222'; + const nonEvmAsset = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFW'; + + it('claims EVM assets on assigned chains when the v6 flag is enabled', async () => { + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + expect( + controller.claimCustomAssets( + [ + assignedChainAsset, + unassignedChainAsset, + nonEvmAsset, + 'not-a-caip-asset', + ] as Caip19AssetId[], + ['eip155:1' as ChainId], + ), + ).toStrictEqual([assignedChainAsset]); + + controller.destroy(); + }); + + it('claims nothing when the v6 flag is disabled (v5 has no includeAssetIds support)', async () => { + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: false } }, + }); + + expect( + controller.claimCustomAssets([assignedChainAsset] as Caip19AssetId[], [ + 'eip155:1' as ChainId, + ]), + ).toStrictEqual([]); + + controller.destroy(); + }); + }); + describe('assetsAccountsApiV6 feature flag', () => { it('uses the v5 endpoint by default', async () => { const { controller, apiClient } = await setupController(); @@ -681,6 +740,18 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); + it('sets updateMode to full for v6 fetches', async () => { + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const response = await controller.fetch(createDataRequest()); + + expect(response.updateMode).toBe('full'); + + controller.destroy(); + }); + it('uses the v5 endpoint when the assetsAccountsApiV6 remote flag is disabled', async () => { const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: { value: false } }, @@ -877,7 +948,7 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); - it('does not pass includeAssetIds to v6 even when custom assets are present', async () => { + it('passes EVM custom assets on requested chains to v6 as includeAssetIds', async () => { const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, }); @@ -889,6 +960,33 @@ describe('AccountsApiDataSource', () => { createDataRequest({ customAssets: [customToken] }), ); + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + { includeAssetIds: [customToken] }, + undefined, + ); + + controller.destroy(); + }); + + it('omits custom assets that are not on a requested chain from includeAssetIds', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + // Custom asset on Polygon while only Mainnet is being fetched. + const polygonToken = + 'eip155:137/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ + chainIds: [CHAIN_MAINNET], + customAssets: [polygonToken], + }), + ); + expect( apiClient.accounts.fetchV6MultiAccountBalances, ).toHaveBeenCalledWith( @@ -899,6 +997,224 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); + + it('surfaces unprocessed include asset ids on the asset axis (unprocessedCustomAssets) without flagging the chain as errored', async () => { + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + unprocessedIncludeAssetIds: [customToken], + }); + + const response = await controller.fetch( + createDataRequest({ customAssets: [customToken] }), + ); + + // The chain itself succeeded — only the specific pinned asset is + // outstanding, so it goes on the asset axis, not `errors`. + expect(response.errors?.[CHAIN_MAINNET]).toBeUndefined(); + expect(response.unprocessedCustomAssets).toStrictEqual([customToken]); + + controller.destroy(); + }); + + it('omits unparseable unprocessed include asset ids from unprocessedCustomAssets', async () => { + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + unprocessedIncludeAssetIds: [ + customToken, + 'not-a-caip-asset' as Caip19AssetId, + ], + }); + + const response = await controller.fetch( + createDataRequest({ customAssets: [customToken] }), + ); + + expect(response.unprocessedCustomAssets).toStrictEqual([customToken]); + + controller.destroy(); + }); + + it('skips non-EVM and malformed custom assets when building includeAssetIds', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const solanaToken = + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Caip19AssetId; + const malformed = 'not-a-caip-asset' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ customAssets: [solanaToken, malformed] }), + ); + + // No EVM custom asset on a requested chain -> includeAssetIds omitted. + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + undefined, + undefined, + ); + + controller.destroy(); + }); + + it('ignores malformed unprocessed include asset ids', async () => { + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + unprocessedIncludeAssetIds: ['not-a-caip-asset'], + }); + + const response = await controller.fetch( + createDataRequest({ customAssets: [customToken] }), + ); + + // The malformed unprocessed id cannot be parsed, so it is dropped from + // both axes (no error, no asset-axis entry). + expect(response.errors).toBeUndefined(); + expect(response.unprocessedCustomAssets).toBeUndefined(); + + controller.destroy(); + }); + + it('passes EVM hidden assets on requested chains to v6 as excludeAssetIds', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const hiddenToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ excludeAssetIds: [hiddenToken] }), + ); + + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + { excludeAssetIds: [hiddenToken] }, + undefined, + ); + + controller.destroy(); + }); + + it('omits hidden assets that are not on a requested chain from excludeAssetIds', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + // Hidden asset on Polygon while only Mainnet is being fetched. + const polygonToken = + 'eip155:137/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ + chainIds: [CHAIN_MAINNET], + excludeAssetIds: [polygonToken], + }), + ); + + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + undefined, + undefined, + ); + + controller.destroy(); + }); + + it('skips non-EVM and malformed hidden assets when building excludeAssetIds', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const solanaToken = + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Caip19AssetId; + const malformed = 'not-a-caip-asset' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ excludeAssetIds: [solanaToken, malformed] }), + ); + + // No EVM hidden asset on a requested chain -> excludeAssetIds omitted. + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + undefined, + undefined, + ); + + controller.destroy(); + }); + + it('lets a pinned asset win when it also appears in the hidden list', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const token = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ + customAssets: [token], + excludeAssetIds: [token], + }), + ); + + // The asset is pinned, so it is included and never excluded. + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + { includeAssetIds: [token] }, + undefined, + ); + + controller.destroy(); + }); + + it('sends both includeAssetIds and excludeAssetIds when pins and hidden assets differ', async () => { + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const pinned = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const hidden = + 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7' as Caip19AssetId; + + await controller.fetch( + createDataRequest({ + customAssets: [pinned], + excludeAssetIds: [hidden], + }), + ); + + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + { includeAssetIds: [pinned], excludeAssetIds: [hidden] }, + undefined, + ); + + controller.destroy(); + }); }); it('fetch marks every requested chain as errored when the call exceeds the configured timeout', async () => { @@ -977,6 +1293,21 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); + it('middleware forwards full updateMode from v6 fetches', async () => { + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }); + + const next = jest.fn().mockResolvedValue(undefined); + const context = createMiddlewareContext(); + + await controller.assetsMiddleware(context, next); + + expect(context.response.updateMode).toBe('full'); + + controller.destroy(); + }); + it('middleware skips Accounts API when balance is not requested', async () => { const { controller, apiClient } = await setupController({ balances: [ diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts index 31e55cdfa72..3409cccbb38 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts @@ -7,6 +7,7 @@ import type { import { isCaipChainId, KnownCaipNamespace, + parseCaipAssetType, toCaipChainId, } from '@metamask/utils'; @@ -49,9 +50,9 @@ const log = createModuleLogger(projectLogger, CONTROLLER_NAME); // Allowed actions that AccountsApiDataSource can call. Balances are fetched via // ApiPlatformClient directly (no BackendApiClient actions needed); the messenger -// is used to read the Accounts API v6 balances feature flag and to subscribe to -// `RemoteFeatureFlagController:stateChange` (see constructor) so migration flag -// changes refresh the active chains. +// is used to subscribe to `RemoteFeatureFlagController:stateChange` (see +// constructor) so migration flag changes refresh the active chains, and to +// read those flags when listing active chains. export type AccountsApiDataSourceAllowedActions = RemoteFeatureFlagControllerGetStateAction; @@ -95,7 +96,7 @@ export type AccountsApiDataSourceConfig = { export type AccountsApiDataSourceOptions = AccountsApiDataSourceConfig & { /** * The AssetsController messenger (shared by all data sources). Used to read - * the `assetsAccountsApiV6` remote feature flag. + * Snaps → AssetsController migration flags and subscribe to flag changes. */ messenger: AssetsControllerMessenger; /** ApiPlatformClient for API calls with caching */ @@ -106,6 +107,12 @@ export type AccountsApiDataSourceOptions = AccountsApiDataSourceConfig & { chains: ChainId[], previousChains: ChainId[], ) => void; + /** + * Whether to use the Accounts API v6 balances endpoint (and `includeAssetIds`). + * Injected by AssetsController so the flag is read in one place. Defaults to + * `false` (v5). Read on demand, not cached. + */ + isBalanceV6Enabled?: () => boolean; state?: Partial; }; @@ -219,6 +226,9 @@ export class AccountsApiDataSource extends AbstractDataSource< /** Shared AssetsController messenger, used to read remote feature flags. */ readonly #messenger: AssetsControllerMessenger; + /** Injected by AssetsController; `true` when the v6 balances endpoint should be used. */ + readonly #isBalanceV6Enabled: () => boolean; + /** ApiPlatformClient for cached API calls */ readonly #apiClient: ApiPlatformClient; @@ -240,6 +250,8 @@ export class AccountsApiDataSource extends AbstractDataSource< this.#tokenDetectionEnabled = options.tokenDetectionEnabled ?? ((): boolean => true); this.#messenger = options.messenger; + this.#isBalanceV6Enabled = + options.isBalanceV6Enabled ?? ((): boolean => false); this.#apiClient = options.queryApiClient; // The Snaps → AssetsController migration flags gate which migration networks @@ -277,35 +289,6 @@ export class AccountsApiDataSource extends AbstractDataSource< } } - /** - * Whether the Accounts API v6 balances endpoint is enabled, read from the - * RemoteFeatureFlagController (`assetsAccountsApiV6`). Read on demand (per - * fetch) rather than cached so the value can be toggled at runtime, and behaves - * the same across clients (extension, mobile). Defaults to `false` when the - * flag is unset or the controller is unavailable. - * - * The flag is a LaunchDarkly JSON variation shaped `{ value: boolean }` (same - * shape as `backendWebSocketConnection`), so the nested `value` is read rather - * than treating the flag as a plain boolean. - * - * @returns `true` when the v6 balances endpoint should be used. - */ - #isBalanceV6Enabled(): boolean { - try { - const { remoteFeatureFlags } = this.#messenger.call( - 'RemoteFeatureFlagController:getState', - ); - const flag = remoteFeatureFlags?.assetsAccountsApiV6; - return ( - typeof flag === 'object' && - flag !== null && - Boolean((flag as { value?: unknown }).value) - ); - } catch { - return false; - } - } - // ============================================================================ // INITIALIZATION // ============================================================================ @@ -435,11 +418,63 @@ export class AccountsApiDataSource extends AbstractDataSource< } : undefined; - // Feature-flagged: v6 endpoint with a fallback to legacy v5. The flag is - // read here (not cached) so a runtime toggle can revert v6 -> v5. - const { unprocessedNetworks, assetsBalance } = this.#isBalanceV6Enabled() - ? await this.#fetchV6Balances(accountIds, fetchOptions, request) - : await this.#fetchV5Balances(accountIds, fetchOptions, request); + const isV6 = this.#isBalanceV6Enabled(); + let fetchResult: { + unprocessedNetworks: string[]; + unprocessedIncludeAssetIds: string[]; + assetsBalance: Record>; + }; + + if (isV6) { + // User-pinned assets on the fetched chains, sent to v6 as + // `includeAssetIds` so the backend returns them even at zero balance. + const includeAssetIds = this.#getIncludeAssetIds( + request, + chainsToFetch, + ); + + // User-hidden assets on the fetched chains, sent to v6 as + // `excludeAssetIds`. A pin wins over a hide. + const excludeAssetIds = this.#getExcludeAssetIds( + request, + chainsToFetch, + includeAssetIds, + ); + + fetchResult = await this.#fetchV6Balances( + accountIds, + fetchOptions, + request, + includeAssetIds, + excludeAssetIds, + ); + + const validUnprocessedAssetIds = + fetchResult.unprocessedIncludeAssetIds.filter((assetId) => { + try { + parseCaipAssetType(assetId as Caip19AssetId); + return true; + } catch { + return false; + } + }); + if (validUnprocessedAssetIds.length > 0) { + response.unprocessedCustomAssets = [ + ...(response.unprocessedCustomAssets ?? []), + ...(validUnprocessedAssetIds as Caip19AssetId[]), + ]; + } + response.updateMode = 'full'; + } else { + fetchResult = await this.#fetchV5Balances( + accountIds, + fetchOptions, + request, + ); + response.updateMode = 'merge'; + } + + const { unprocessedNetworks, assetsBalance } = fetchResult; // Handle unprocessed networks - these will be passed to next middleware if (unprocessedNetworks.length > 0) { @@ -454,7 +489,6 @@ export class AccountsApiDataSource extends AbstractDataSource< } response.assetsBalance = assetsBalance; - response.updateMode = 'merge'; } catch (error) { log('Fetch FAILED', { error, chains: chainsToFetch }); @@ -482,6 +516,87 @@ export class AccountsApiDataSource extends AbstractDataSource< return response; } + /** + * Collect the pinned EVM assets on the fetched chains to send to the v6 + * endpoint as `includeAssetIds`; malformed IDs are skipped. + * + * @param request - The data request (carries `customAssets`). + * @param chainsToFetch - Chains being requested this fetch. + * @returns Deduplicated asset IDs, or `undefined` when none. + */ + #getIncludeAssetIds( + request: DataRequest, + chainsToFetch: ChainId[], + ): Caip19AssetId[] | undefined { + if (!request.customAssets || request.customAssets.length === 0) { + return undefined; + } + + const chainsToFetchSet = new Set(chainsToFetch); + const includeAssetIds = new Set(); + + for (const assetId of request.customAssets) { + let chainId: ChainId; + try { + chainId = parseCaipAssetType(assetId).chainId; + } catch { + continue; + } + if ( + chainId.startsWith(`${KnownCaipNamespace.Eip155}:`) && + chainsToFetchSet.has(chainId) + ) { + includeAssetIds.add(assetId); + } + } + + return includeAssetIds.size > 0 ? [...includeAssetIds] : undefined; + } + + /** + * Collect the hidden EVM assets on the fetched chains to send to the v6 + * endpoint as `excludeAssetIds`; malformed IDs are skipped and pinned + * assets are left out (a pin wins). + * + * @param request - The data request (carries `excludeAssetIds`). + * @param chainsToFetch - Chains being requested this fetch. + * @param includeAssetIds - Pinned asset IDs that must not be excluded. + * @returns Deduplicated asset IDs, or `undefined` when none. + */ + #getExcludeAssetIds( + request: DataRequest, + chainsToFetch: ChainId[], + includeAssetIds: Caip19AssetId[] | undefined, + ): Caip19AssetId[] | undefined { + if (!request.excludeAssetIds || request.excludeAssetIds.length === 0) { + return undefined; + } + + const chainsToFetchSet = new Set(chainsToFetch); + const includeSet = new Set(includeAssetIds ?? []); + const excludeAssetIds = new Set(); + + for (const assetId of request.excludeAssetIds) { + if (includeSet.has(assetId)) { + continue; + } + let chainId: ChainId; + try { + chainId = parseCaipAssetType(assetId).chainId; + } catch { + continue; + } + if ( + chainId.startsWith(`${KnownCaipNamespace.Eip155}:`) && + chainsToFetchSet.has(chainId) + ) { + excludeAssetIds.add(assetId); + } + } + + return excludeAssetIds.size > 0 ? [...excludeAssetIds] : undefined; + } + /** * Fetch balances from the legacy v5 endpoint and process them. * @@ -498,6 +613,7 @@ export class AccountsApiDataSource extends AbstractDataSource< request: DataRequest, ): Promise<{ unprocessedNetworks: string[]; + unprocessedIncludeAssetIds: string[]; assetsBalance: Record>; }> { const apiResponse = await fetchWithTimeout( @@ -517,6 +633,8 @@ export class AccountsApiDataSource extends AbstractDataSource< return { unprocessedNetworks: apiResponse.unprocessedNetworks, + // v5 has no `includeAssetIds` support. + unprocessedIncludeAssetIds: [], assetsBalance, }; } @@ -527,7 +645,10 @@ export class AccountsApiDataSource extends AbstractDataSource< * @param accountIds - CAIP-10 account IDs to fetch balances for. * @param fetchOptions - Cache/fetch options (e.g. force update settings). * @param request - The original data request containing accounts to map. - * @returns Unprocessed networks and processed asset balances by account. + * @param includeAssetIds - Pinned asset IDs the backend must always return. + * @param excludeAssetIds - Hidden asset IDs the backend must drop. + * @returns Unprocessed networks, unprocessed pinned assets, and processed + * asset balances by account. */ async #fetchV6Balances( accountIds: string[], @@ -535,15 +656,26 @@ export class AccountsApiDataSource extends AbstractDataSource< | { staleTime: number; gcTime: number; bypassServerCache?: boolean } | undefined, request: DataRequest, + includeAssetIds: Caip19AssetId[] | undefined, + excludeAssetIds: Caip19AssetId[] | undefined, ): Promise<{ unprocessedNetworks: string[]; + unprocessedIncludeAssetIds: string[]; assetsBalance: Record>; }> { + const params = + includeAssetIds || excludeAssetIds + ? { + ...(includeAssetIds && { includeAssetIds }), + ...(excludeAssetIds && { excludeAssetIds }), + } + : undefined; + const apiResponse = await fetchWithTimeout( () => this.#apiClient.accounts.fetchV6MultiAccountBalances( accountIds, - undefined, + params, fetchOptions, ), this.#fetchTimeoutMs, @@ -556,6 +688,7 @@ export class AccountsApiDataSource extends AbstractDataSource< return { unprocessedNetworks: apiResponse.unprocessedNetworks, + unprocessedIncludeAssetIds: apiResponse.unprocessedIncludeAssetIds, assetsBalance, }; } @@ -753,6 +886,32 @@ export class AccountsApiDataSource extends AbstractDataSource< } } + if (response.updateMode === 'full') { + context.response = { + ...context.response, + updateMode: 'full', + }; + } else if ( + response.updateMode === 'merge' && + context.response.updateMode !== 'full' + ) { + context.response = { + ...context.response, + updateMode: 'merge', + }; + } + + // Forward the asset-axis signal so the RPC fallback recovers these pins. + if ( + response.unprocessedCustomAssets && + response.unprocessedCustomAssets.length > 0 + ) { + context.response.unprocessedCustomAssets = [ + ...(context.response.unprocessedCustomAssets ?? []), + ...response.unprocessedCustomAssets, + ]; + } + // Determine successfully handled chains (exclude unprocessed/error chains) const unprocessedChains = new Set(Object.keys(response.errors ?? {})); successfullyHandledChains = request.chainIds.filter( @@ -798,6 +957,36 @@ export class AccountsApiDataSource extends AbstractDataSource< // SUBSCRIBE // ============================================================================ + /** + * Claim EVM pins on assigned chains (sent to v6 as `includeAssetIds`). + * v5 has no `includeAssetIds`, so with the v6 flag off nothing is claimed + * and pins fall through to RPC. + * + * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. + * @param assignedChains - Chains assigned to this source in the handoff. + * @returns The claimed subset of `customAssets`. + */ + claimCustomAssets( + customAssets: Caip19AssetId[], + assignedChains: ChainId[], + ): Caip19AssetId[] { + if (!this.#isBalanceV6Enabled()) { + return []; + } + const assigned = new Set(assignedChains); + return customAssets.filter((assetId) => { + try { + const parsed = parseCaipAssetType(assetId); + return ( + parsed.chain.namespace === KnownCaipNamespace.Eip155 && + assigned.has(parsed.chainId) + ); + } catch { + return false; + } + }); + } + async subscribe(subscriptionRequest: SubscriptionRequest): Promise { const { request, subscriptionId, isUpdate, skipInitialFetch } = subscriptionRequest; diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 0fbdf5e315d..800d26a7613 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -832,28 +832,38 @@ describe('RpcDataSource', () => { .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') .mockResolvedValue(createBalanceFetchResult()); - await withController(async ({ controller }) => { - const request = createDataRequest({ - customAssets: [customAssetId], - }); - await controller.fetch(request); - - expect(fetchSpy).toHaveBeenCalledWith( - MOCK_CHAIN_ID_HEX, - MOCK_ACCOUNT_ID, - MOCK_ADDRESS, - [ - { - assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, - address: '0x0000000000000000000000000000000000000000', - }, - expect.objectContaining({ - assetId: customAssetId, - address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, }), - ], - ); - }); + }, + }, + async ({ controller }) => { + const request = createDataRequest({ + customAssets: [customAssetId], + }); + await controller.fetch(request); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + expect.objectContaining({ + assetId: customAssetId, + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }), + ], + ); + }, + ); fetchSpy.mockRestore(); }); @@ -868,28 +878,128 @@ describe('RpcDataSource', () => { .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') .mockResolvedValue(createBalanceFetchResult()); - await withController(async ({ controller }) => { - const request = createDataRequest({ - customAssets: [matchingAsset, otherChainAsset], - }); - await controller.fetch(request); + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { + [MOCK_ACCOUNT_ID]: [matchingAsset, otherChainAsset], + }, + }), + }, + }, + async ({ controller }) => { + const request = createDataRequest({ + customAssets: [matchingAsset, otherChainAsset], + }); + await controller.fetch(request); - expect(fetchSpy).toHaveBeenCalledWith( - MOCK_CHAIN_ID_HEX, - MOCK_ACCOUNT_ID, - MOCK_ADDRESS, - [ - { - assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, - address: '0x0000000000000000000000000000000000000000', - }, - expect.objectContaining({ - assetId: matchingAsset, - address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + expect.objectContaining({ + assetId: matchingAsset, + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }), + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); + + it('does not fetch custom assets the fetching account has not pinned', async () => { + const customAssetId = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + options: { isBalanceV6Enabled: (): boolean => true }, + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { 'other-account-id': [customAssetId] }, }), - ], - ); - }); + }, + }, + async ({ controller }) => { + const request = createDataRequest({ + customAssets: [customAssetId], + }); + await controller.fetch(request); + + // The request's customAssets list is flat; ownership comes from + // state. MOCK_ACCOUNT_ID did not pin the asset, so its fetch + // carries only the native entry. + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); + + it('fetches request custom assets on v5 even when another account owns the pin', async () => { + const customAssetId = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { 'other-account-id': [customAssetId] }, + }), + }, + }, + async ({ controller }) => { + const request = createDataRequest({ + customAssets: [customAssetId], + }); + await controller.fetch(request); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + expect.objectContaining({ + assetId: customAssetId, + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }), + ], + ); + }, + ); fetchSpy.mockRestore(); }); @@ -1381,6 +1491,211 @@ describe('RpcDataSource', () => { expect(detectionStopSpy).toHaveBeenCalled(); }); }); + + it('starts an asset-scoped poll (explicit assetIds) for pinned assets on chains not assigned to RPC', async () => { + const balanceStartSpy = jest.spyOn( + BalanceFetcher.prototype, + 'startPolling', + ); + const detectionStartSpy = jest.spyOn( + TokenDetector.prototype, + 'startPolling', + ); + const customAssetId = + `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + + await withController( + { + options: { isBalanceV6Enabled: (): boolean => true }, + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, + }), + }, + }, + async ({ controller }) => { + // The chain axis assigned nothing to RPC (chainIds is empty — e.g. + // the websocket claimed the chain), but RPC claimed the pinned asset. + await controller.subscribe({ + request: createDataRequest({ + chainIds: [], + customAssets: [customAssetId], + }), + subscriptionId: 'test-sub', + isUpdate: false, + onAssetsUpdate: jest.fn(), + }); + + expect(balanceStartSpy).toHaveBeenCalledWith({ + chainId: MOCK_CHAIN_ID_HEX, + accountId: MOCK_ACCOUNT_ID, + accountAddress: MOCK_ADDRESS, + assetIds: [customAssetId], + }); + // No regular chain coverage — detection must not run. + expect(detectionStartSpy).not.toHaveBeenCalled(); + await controller.unsubscribe('test-sub'); + }, + ); + }); + + it('does not start an asset-scoped poll for accounts without pinned assets on the supplemental chain', async () => { + const balanceStartSpy = jest.spyOn( + BalanceFetcher.prototype, + 'startPolling', + ); + const customAssetId = + `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { 'other-account-id': [customAssetId] }, + }), + }, + }, + async ({ controller }) => { + await controller.subscribe({ + request: createDataRequest({ + chainIds: [], + customAssets: [customAssetId], + }), + subscriptionId: 'test-sub', + isUpdate: false, + onAssetsUpdate: jest.fn(), + }); + + expect(balanceStartSpy).not.toHaveBeenCalled(); + await controller.unsubscribe('test-sub'); + }, + ); + }); + + it('does not start an asset-scoped poll for chains already covered by regular polling', async () => { + const balanceStartSpy = jest.spyOn( + BalanceFetcher.prototype, + 'startPolling', + ); + const customAssetId = + `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, + }), + }, + }, + async ({ controller }) => { + // Chain assigned to RPC: the regular poll already includes + // state.customAssets, so no supplemental poll must start. + await controller.subscribe({ + request: createDataRequest({ + customAssets: [customAssetId], + }), + subscriptionId: 'test-sub', + isUpdate: false, + onAssetsUpdate: jest.fn(), + }); + + expect(balanceStartSpy).toHaveBeenCalledTimes(1); + expect(balanceStartSpy).toHaveBeenCalledWith({ + chainId: MOCK_CHAIN_ID_HEX, + accountId: MOCK_ACCOUNT_ID, + accountAddress: MOCK_ADDRESS, + }); + await controller.unsubscribe('test-sub'); + }, + ); + }); + + it('unsubscribe stops asset-scoped polling', async () => { + const balanceStopSpy = jest.spyOn( + BalanceFetcher.prototype, + 'stopPollingByPollingToken', + ); + const customAssetId = + `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + + await withController( + { + options: { isBalanceV6Enabled: (): boolean => true }, + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, + }), + }, + }, + async ({ controller }) => { + await controller.subscribe({ + request: createDataRequest({ + chainIds: [], + customAssets: [customAssetId], + }), + subscriptionId: 'test-sub', + isUpdate: false, + onAssetsUpdate: jest.fn(), + }); + await controller.unsubscribe('test-sub'); + expect(balanceStopSpy).toHaveBeenCalled(); + }, + ); + }); + }); + + describe('claimCustomAssets', () => { + const availableChainAsset = + `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + const unavailableChainAsset = + 'eip155:999/erc20:0x2222222222222222222222222222222222222222' as Caip19AssetId; + const nonEvmAsset = + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFW' as Caip19AssetId; + + it('claims EVM assets on active chains even when the chain was not assigned to RPC', async () => { + await withController(async ({ controller }) => { + expect( + controller.claimCustomAssets([availableChainAsset], []), + ).toStrictEqual([availableChainAsset]); + }); + }); + + it('does not claim assets on chains RPC cannot serve, non-EVM assets, or malformed IDs', async () => { + await withController(async ({ controller }) => { + expect( + controller.claimCustomAssets( + [ + unavailableChainAsset, + nonEvmAsset, + 'not-a-caip-asset' as Caip19AssetId, + ], + [], + ), + ).toStrictEqual([]); + }); + }); + + it('falls back to assigned chains when network state has not been applied yet', async () => { + const networkState = createMockNetworkState(NetworkStatus.Degraded); + await withController({ networkState }, async ({ controller }) => { + // eslint-disable-next-line n/no-sync -- testing sync API used by AssetsController + expect(controller.getActiveChainsSync()).toStrictEqual([]); + expect( + controller.claimCustomAssets( + [availableChainAsset], + [MOCK_CHAIN_ID_CAIP], + ), + ).toStrictEqual([availableChainAsset]); + expect( + controller.claimCustomAssets([availableChainAsset], []), + ).toStrictEqual([]); + }); + }); }); describe('unsubscribe', () => { diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index 93f8cb5b6ae..2b9cd12d752 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -15,11 +15,11 @@ import type { import { isStrictHexString, isCaipChainId, + KnownCaipNamespace, parseCaipAssetType, parseCaipChainId, hexToNumber, toCaipChainId, - KnownCaipNamespace, } from '@metamask/utils'; import type { Hex } from '@metamask/utils'; import { BigNumber as BigNumberJS } from 'bignumber.js'; @@ -145,6 +145,11 @@ export type RpcDataSourceOptions = { /** Returns the asset type ('native' | 'erc20' | 'spl') for the given CAIP-19 asset ID */ getAssetType: (assetId: Caip19AssetId) => 'native' | 'erc20' | 'spl'; + /** + * Whether Accounts API v6 pin filtering and asset-scoped polls are enabled. + * Injected by AssetsController; defaults to v5 when omitted. + */ + isBalanceV6Enabled?: () => boolean; }; /** @@ -224,6 +229,8 @@ export class RpcDataSource extends AbstractDataSource< readonly #isOnboarded: () => boolean; + readonly #isBalanceV6Enabled: () => boolean; + /** Currently active chains */ #activeChains: ChainId[] = []; @@ -261,6 +268,8 @@ export class RpcDataSource extends AbstractDataSource< this.#useExternalService = options.useExternalService ?? ((): boolean => true); this.#isOnboarded = options.isOnboarded ?? ((): boolean => true); + this.#isBalanceV6Enabled = + options.isBalanceV6Enabled ?? ((): boolean => false); const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL; const detectionInterval = @@ -1015,6 +1024,12 @@ export class RpcDataSource extends AbstractDataSource< const assetsInfo: Record = {}; const failedChains: ChainId[] = []; + // request.customAssets is flat. v6 resolves pin ownership from state so + // each account only fetches its own pins; v5 applies the flat list as on main. + const customAssetsByAccount = request.customAssets + ? this.#getCustomAssetsByAccount() + : {}; + // Fetch balances for each account and its supported chains (pre-computed in request) for (const { account, @@ -1042,29 +1057,23 @@ export class RpcDataSource extends AbstractDataSource< if (request.customAssets) { const existingMetadata = this.#getExistingAssetsMetadata(); - - for (const assetId of request.customAssets) { - try { - const parsed = parseCaipAssetType(assetId); - const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`; - if ( - assetChainId === chainId && - this.#getAssetType(assetId) === 'erc20' - ) { - const tokenAddress = - parsed.assetReference.toLowerCase() as Address; - const normalizedId = normalizeAssetId(assetId); - const decimals = existingMetadata[normalizedId]?.decimals; - - assetsToFetch.push({ - assetId, - address: tokenAddress, - decimals, - }); - } - } catch { - // Skip unparseable asset IDs - } + if (this.#isBalanceV6Enabled()) { + this.#appendRequestCustomErc20sV6( + assetsToFetch, + request.customAssets, + chainId, + existingMetadata, + new Set( + (customAssetsByAccount[accountId] ?? []).map(normalizeAssetId), + ), + ); + } else { + this.#appendRequestCustomErc20sV5( + assetsToFetch, + request.customAssets, + chainId, + existingMetadata, + ); } } @@ -1370,6 +1379,37 @@ export class RpcDataSource extends AbstractDataSource< }; } + /** + * RPC is the terminal claimer on the asset axis: it claims every EVM pin it + * has a provider for, even on chains claimed by higher-priority sources. + * Pins outside the regular RPC assignment get an asset-scoped poll (see + * `subscribe`). + * + * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. + * @param assignedChains - Chains assigned to RPC; availability fallback + * before network state is applied. + * @returns The claimed subset of `customAssets`. + */ + claimCustomAssets( + customAssets: Caip19AssetId[], + assignedChains: ChainId[], + ): Caip19AssetId[] { + const available = new Set( + this.#activeChains.length > 0 ? this.#activeChains : assignedChains, + ); + return customAssets.filter((assetId) => { + try { + const parsed = parseCaipAssetType(assetId); + return ( + parsed.chain.namespace === KnownCaipNamespace.Eip155 && + available.has(parsed.chainId) + ); + } catch { + return false; + } + }); + } + /** * Subscribe to updates for the given request. * Starts polling through BalanceFetcher and TokenDetector. @@ -1393,15 +1433,23 @@ export class RpcDataSource extends AbstractDataSource< ) : request.chainIds; + // Pins claimed on chains outside the regular RPC assignment get an + // asset-scoped poll below. + const supplementalChains = this.#getSupplementalCustomAssetChains( + request, + chainsToSubscribe, + ); + log('Subscribe requested', { subscriptionId, isUpdate, accounts: request.accountsWithSupportedChains.map((a) => a.account.id), chainsToSubscribe, + supplementalChains, activeChainsFallback: this.#activeChains.length === 0, }); - if (chainsToSubscribe.length === 0) { + if (chainsToSubscribe.length === 0 && supplementalChains.length === 0) { log('No active chains to subscribe'); return; } @@ -1453,8 +1501,6 @@ export class RpcDataSource extends AbstractDataSource< const balanceToken = this.#balanceFetcher.startPolling(balanceInput); balancePollingTokens.push(balanceToken); - // Token detection is only relevant for "regular" subscriptions — - // a customAssetsOnly subscription should never run detection. if ( request.customAssetsOnly !== true && this.#tokenDetectionEnabled() && @@ -1472,6 +1518,53 @@ export class RpcDataSource extends AbstractDataSource< } } + // Asset-scoped polls on chains another source claimed: poll ONLY the + // claimed pins to avoid double-polling tracked balances. Pin changes + // re-run the subscription pass, which rebuilds these polls. + // Asset-scoped polls on chains another source claimed (v6 only). + if (this.#isBalanceV6Enabled() && supplementalChains.length > 0) { + const supplemental = new Set(supplementalChains); + const claimedAssetsByChain = new Map(); + for (const assetId of request.customAssets ?? []) { + try { + const { chainId } = parseCaipAssetType(assetId); + if (supplemental.has(chainId)) { + const chainAssets = claimedAssetsByChain.get(chainId) ?? []; + chainAssets.push(assetId); + claimedAssetsByChain.set(chainId, chainAssets); + } + } catch { + // Skip unparseable asset IDs + } + } + // request.customAssets is flat; ownership comes from controller state. + const customAssetsByAccount = this.#getCustomAssetsByAccount(); + for (const { account } of request.accountsWithSupportedChains) { + const pinned = new Set(customAssetsByAccount[account.id] ?? []); + if (pinned.size === 0) { + continue; + } + for (const [chainId, chainAssets] of claimedAssetsByChain) { + // Sorted so the polling input (the dedupe key) is deterministic. + const assetIds = chainAssets + .filter((assetId) => pinned.has(assetId)) + .sort(); + if (assetIds.length === 0) { + continue; + } + const balanceInput: BalancePollingInput = { + chainId: caipChainIdToHex(chainId), + accountId: account.id, + accountAddress: account.address as Address, + assetIds, + }; + balancePollingTokens.push( + this.#balanceFetcher.startPolling(balanceInput), + ); + } + } + } + // Store subscription data const accounts = request.accountsWithSupportedChains.map( (entry) => entry.account, @@ -1515,6 +1608,143 @@ export class RpcDataSource extends AbstractDataSource< } } + /** + * Chains needing a supplemental asset-scoped poll: chains of pins not + * covered by the regular RPC polling. Only EVM chains RPC can serve; + * malformed IDs are skipped. + * + * @param request - The subscription's data request (carries `customAssets`). + * @param chainsToSubscribe - Chains covered by the regular polling loop. + * @returns Chains requiring an asset-scoped poll. + */ + #getSupplementalCustomAssetChains( + request: DataRequest, + chainsToSubscribe: ChainId[], + ): ChainId[] { + if (!request.customAssets || request.customAssets.length === 0) { + return []; + } + + const covered = new Set(chainsToSubscribe); + const chains = new Set(); + + for (const assetId of request.customAssets) { + let parsed: ReturnType; + try { + parsed = parseCaipAssetType(assetId); + } catch { + continue; + } + const { chainId } = parsed; + if ( + parsed.chain.namespace === KnownCaipNamespace.Eip155 && + !covered.has(chainId) && + (this.#activeChains.length === 0 || + this.#activeChains.includes(chainId)) + ) { + chains.add(chainId); + } + } + + return [...chains]; + } + + /** + * v5: include every `request.customAssets` ERC-20 on this chain (main behavior). + * Delete with the rest of the v5 path when `assetsAccountsApiV6` is the default. + * + * @param assetsToFetch - Native/custom entries for this account-chain fetch. + * @param customAssets - Flat pin list from the data request. + * @param chainId - Chain being fetched. + * @param existingMetadata - Metadata already in AssetsController state. + */ + #appendRequestCustomErc20sV5( + assetsToFetch: AssetFetchEntry[], + customAssets: Caip19AssetId[], + chainId: ChainId, + existingMetadata: Record, + ): void { + for (const assetId of customAssets) { + try { + const parsed = parseCaipAssetType(assetId); + const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`; + if ( + assetChainId === chainId && + this.#getAssetType(assetId) === 'erc20' + ) { + const tokenAddress = parsed.assetReference.toLowerCase() as Address; + const normalizedId = normalizeAssetId(assetId); + const decimals = existingMetadata[normalizedId]?.decimals; + + assetsToFetch.push({ + assetId, + address: tokenAddress, + decimals, + }); + } + } catch { + // Skip unparseable asset IDs + } + } + } + + /** + * v6: include only pins owned by this account on this chain. + * + * @param assetsToFetch - Native/custom entries for this account-chain fetch. + * @param customAssets - Flat pin list from the data request. + * @param chainId - Chain being fetched. + * @param existingMetadata - Metadata already in AssetsController state. + * @param pinnedByAccount - This account's pins from controller state. + */ + #appendRequestCustomErc20sV6( + assetsToFetch: AssetFetchEntry[], + customAssets: Caip19AssetId[], + chainId: ChainId, + existingMetadata: Record, + pinnedByAccount: Set, + ): void { + for (const assetId of customAssets) { + try { + const parsed = parseCaipAssetType(assetId); + const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`; + const normalizedId = normalizeAssetId(assetId); + if ( + assetChainId === chainId && + pinnedByAccount.has(normalizedId) && + this.#getAssetType(assetId) === 'erc20' + ) { + const tokenAddress = parsed.assetReference.toLowerCase() as Address; + const decimals = existingMetadata[normalizedId]?.decimals; + + assetsToFetch.push({ + assetId, + address: tokenAddress, + decimals, + }); + } + } catch { + // Skip unparseable asset IDs + } + } + } + + /** + * Get per-account pins from AssetsController state — the request's flat + * `customAssets` list carries no account association. + * + * @returns Record of account ID to pinned CAIP-19 asset IDs. + */ + #getCustomAssetsByAccount(): Record { + try { + const state = this.#messenger.call('AssetsController:getState'); + return (state.customAssets ?? {}) as Record; + } catch (error) { + log('Failed to get customAssets from state', { error }); + return {}; + } + } + /** * Get existing assets metadata from AssetsController state. * Used to include metadata for ERC20 tokens when returning balance updates. diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts index 795b6f92b9b..4c10eba6aa9 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts @@ -248,12 +248,7 @@ describe('BalanceFetcher', () => { ); }); - it('polls custom assets even when they have no entry in assetsBalance yet', async () => { - // Regression: custom assets must be polled by RPC because RPC is the - // sole balance fetcher for them. Previously #getAssetsToFetch only - // looked at state.assetsBalance, so a freshly added custom asset - // (no balance row yet, e.g. zero balance or first fetch failed) - // would never be polled. + it('includes state.customAssets on the regular poll even without an assetsBalance row', async () => { const mockState: AssetsBalanceState = { assetsBalance: { [TEST_ACCOUNT_ID]: { @@ -283,12 +278,7 @@ describe('BalanceFetcher', () => { true, '1000000000000000000', ), - createMockBalanceResponse( - TEST_TOKEN_1.toLowerCase() as Address, - TEST_ACCOUNT, - true, - '500', - ), + createMockBalanceResponse(TEST_TOKEN_1, TEST_ACCOUNT, true, '0'), ]); const input: BalancePollingInput = { @@ -299,9 +289,6 @@ describe('BalanceFetcher', () => { await controller._executePoll(input); - // The multicall batch should include both the native asset and - // the custom ERC-20 token, even though the custom token has no - // entry in assetsBalance. const [, batchedRequests] = mockMulticallClient.batchBalanceOf.mock.calls[0]; const requestedTokens = ( @@ -310,16 +297,17 @@ describe('BalanceFetcher', () => { .map((req) => req.tokenAddress.toLowerCase()) .sort(); expect(requestedTokens).toStrictEqual( - [ZERO_ADDRESS.toLowerCase(), TEST_TOKEN_1.toLowerCase()].sort(), + [ZERO_ADDRESS, TEST_TOKEN_1] + .map((addr) => addr.toLowerCase()) + .sort(), ); }, ); }); - it('in customAssetsOnly mode skips state.assetsBalance and only fetches state.customAssets', async () => { - // The supplemental subscription path: another data source covers the - // chain for regular balances, but RPC must still poll the user's - // customAssets. We must NOT also poll the regular tracked balances. + it('with explicit assetIds fetches exactly those assets and ignores tracked state', async () => { + // Asset-scoped poll path: RPC claimed the pins on a chain another + // source owns — it must NOT also poll the tracked balances. const mockState: AssetsBalanceState = { assetsBalance: { [TEST_ACCOUNT_ID]: { @@ -354,7 +342,7 @@ describe('BalanceFetcher', () => { chainId: MAINNET_CHAIN_ID, accountId: TEST_ACCOUNT_ID, accountAddress: TEST_ACCOUNT, - customAssetsOnly: true, + assetIds: [TOKEN_1_ASSET_ID], }; await controller._executePoll(input); @@ -366,8 +354,8 @@ describe('BalanceFetcher', () => { ) .map((req) => req.tokenAddress.toLowerCase()) .sort(); - // ONLY the custom token — not the native and not TOKEN_2 from - // assetsBalance. + // ONLY the pinned asset — not the native and not TOKEN_2 from + // assetsBalance, even though both are tracked in state. expect(requestedTokens).toStrictEqual([TEST_TOKEN_1.toLowerCase()]); }, ); diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts index 44d8af36fa1..b9320a16d41 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts @@ -45,11 +45,16 @@ export type BalancePollingInput = { accountId: AccountId; /** Account address */ accountAddress: Address; + /** + * When present, fetch exactly these assets instead of the tracked + * `assetsBalance` entries (Accounts API v6 asset-scoped RPC poll). Must be + * deterministically ordered — the polling input is the dedupe key. + */ + assetIds?: CaipAssetType[]; /** * When true, only fetch balances for entries in `state.customAssets`, * skipping `state.assetsBalance`. Used by the supplemental RPC - * subscription on chains that another data source is already covering - * for regular balance refreshes. + * subscription on the Accounts API v5 path. */ customAssetsOnly?: boolean; }; @@ -121,6 +126,7 @@ export class BalanceFetcher extends StaticIntervalPollingControllerOnly { - const assets = this.#getAssetsToFetch(chainId, accountId, customAssetsOnly); + const assets = this.#getAssetsToFetch( + chainId, + accountId, + assetIds, + customAssetsOnly, + ); return this.fetchBalancesForAssets( chainId, diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts index af114458eaf..85f99ef54e2 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts @@ -55,8 +55,9 @@ export type AssetsBalanceState = { assetsBalance: Record>; /** * User-added custom assets per account: accountId -> CAIP-19 asset IDs. - * Used to ensure RPC polling refreshes custom assets even when they have - * no entry in `assetsBalance` yet (e.g. zero balance, first fetch failed). + * Not read by asset-scoped polls (`BalancePollingInput.assetIds`). Regular + * polls still include these so v5 supplemental/`customAssetsOnly` refreshes + * pins that have no `assetsBalance` row yet. */ customAssets?: Record; }; diff --git a/packages/assets-controller/src/middlewares/ParallelMiddleware.ts b/packages/assets-controller/src/middlewares/ParallelMiddleware.ts index 8b6fceed491..d38fe358aad 100644 --- a/packages/assets-controller/src/middlewares/ParallelMiddleware.ts +++ b/packages/assets-controller/src/middlewares/ParallelMiddleware.ts @@ -53,6 +53,17 @@ export function mergeDataResponses(responses: DataResponse[]): DataResponse { ...response.errors, }; } + if ( + response.unprocessedCustomAssets && + response.unprocessedCustomAssets.length > 0 + ) { + merged.unprocessedCustomAssets = [ + ...new Set([ + ...(merged.unprocessedCustomAssets ?? []), + ...response.unprocessedCustomAssets, + ]), + ]; + } if (response.detectedAssets) { merged.detectedAssets = { ...(merged.detectedAssets ?? {}), diff --git a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts index 6677f31e5cd..c8161574813 100644 --- a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts +++ b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts @@ -15,14 +15,10 @@ const MOCK_ACCOUNT_ID = 'mock-account-id'; const MOCK_ASSET_MAINNET = 'eip155:1/slip44:60' as Caip19AssetId; const MOCK_ASSET_POLYGON = 'eip155:137/slip44:966' as Caip19AssetId; const MOCK_ASSET_BSC = 'eip155:56/slip44:714' as Caip19AssetId; -const MOCK_ERC20_MAINNET = - 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; -const MOCK_ERC20_POLYGON = - 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; -const MOCK_STAKING_ASSET_MAINNET = - 'eip155:1/erc20:0x4fef9d741011476750a243ac70b9789a63dd47df' as Caip19AssetId; -const MOCK_NON_EVM_ASSET = - 'bip122:000000000019d6689c085ae165831e93/slip44:0' as Caip19AssetId; +const MOCK_TOKEN_POLYGON = + 'eip155:137/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; +const MOCK_TOKEN_MAINNET = + 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7' as Caip19AssetId; function createMockAccount(id: string = MOCK_ACCOUNT_ID): InternalAccount { return { @@ -100,7 +96,10 @@ describe('RpcFallbackMiddleware', () => { it('passes through when there are no errors in the response', async () => { const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:1']), { assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1' } }, @@ -121,7 +120,10 @@ describe('RpcFallbackMiddleware', () => { }, }; const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:1', 'eip155:137']), { assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1' } }, @@ -144,7 +146,10 @@ describe('RpcFallbackMiddleware', () => { }, }; const { source } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:1', 'eip155:137']), { assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1' } }, @@ -169,7 +174,10 @@ describe('RpcFallbackMiddleware', () => { }, }; const { source } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:137']), { errors: { 'eip155:137': 'Fetch failed: oops' }, }); @@ -183,7 +191,10 @@ describe('RpcFallbackMiddleware', () => { it('keeps errors for chains RPC could not recover', async () => { const { source } = createMockRpcSource({}); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:137']), { errors: { 'eip155:137': 'Fetch failed: oops' }, }); @@ -203,7 +214,10 @@ describe('RpcFallbackMiddleware', () => { // would still have its error cleared. The check must look at what RPC // actually returned. const { source } = createMockRpcSource({}); // RPC fails — empty response - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext(createDataRequest(['eip155:137']), { assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_POLYGON]: { amount: '7' } }, @@ -222,7 +236,10 @@ describe('RpcFallbackMiddleware', () => { it('does not run for non-balance data types', async () => { const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext( { ...createDataRequest(['eip155:1']), @@ -248,7 +265,10 @@ describe('RpcFallbackMiddleware', () => { }, }; const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); const ctx = createContext( createDataRequest(['eip155:1', 'eip155:137', 'eip155:56']), { @@ -270,406 +290,126 @@ describe('RpcFallbackMiddleware', () => { expect(finalCtx.response.errors).toStrictEqual({}); }); - describe('assets tracked in state that the response left empty', () => { - it('passes through when tracked assets all have a positive balance in the response', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '12' } }, - }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).not.toHaveBeenCalled(); - expect(next).toHaveBeenCalledWith(ctx); - }); - - it('matches response asset IDs case-insensitively', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ERC20_MAINNET.toLowerCase()]: { amount: '12' }, - }, - }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).not.toHaveBeenCalled(); + it('recovers unprocessedCustomAssets with an RPC call scoped to just those assets (via customAssets), not a whole-chain fetch', async () => { + const rpcResponse: DataResponse = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { [MOCK_TOKEN_POLYGON]: { amount: '3' } }, + }, + }; + const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, }); - - it('fetches tracked assets the response omitted via RPC', async () => { - const rpcResponse: DataResponse = { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '42' } }, - }, - }; - const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1' } }, - }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_MAINNET]: { amount: '1' }, - [MOCK_ERC20_MAINNET]: { amount: '1000' }, - }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).toHaveBeenCalledTimes(1); - const [rpcCtx] = rpcMw.mock.calls[0]; - expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:1']); - expect(rpcCtx.request.customAssets).toStrictEqual([MOCK_ERC20_MAINNET]); - expect( - next.mock.calls[0][0].response.assetsBalance[MOCK_ACCOUNT_ID], - ).toStrictEqual({ - [MOCK_ASSET_MAINNET]: { amount: '1' }, - [MOCK_ERC20_MAINNET]: { amount: '42' }, - }); + const ctx = createContext(createDataRequest(['eip155:1', 'eip155:137']), { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1' } }, + }, + unprocessedCustomAssets: [MOCK_TOKEN_POLYGON], }); + const next = jest.fn(async (innerCtx) => innerCtx); - it('fetches tracked assets the response reports as zero via RPC', async () => { - const rpcResponse: DataResponse = { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '9' } }, - }, - }; - const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '0' } }, - }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); + await mw.assetsMiddleware(ctx, next); - expect(rpcMw).toHaveBeenCalledTimes(1); - expect( - next.mock.calls[0][0].response.assetsBalance[MOCK_ACCOUNT_ID][ - MOCK_ERC20_MAINNET - ], - ).toStrictEqual({ amount: '9' }); - }); + expect(rpcMw).toHaveBeenCalledTimes(1); + const [rpcCtx] = rpcMw.mock.calls[0]; + expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:137']); + expect(rpcCtx.request.customAssets).toStrictEqual([MOCK_TOKEN_POLYGON]); - it('fetches custom assets from state that the response left empty', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - {}, - { customAssets: { [MOCK_ACCOUNT_ID]: [MOCK_ERC20_MAINNET] } }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw.mock.calls[0][0].request.customAssets).toStrictEqual([ - MOCK_ERC20_MAINNET, - ]); + const finalCtx = next.mock.calls[0][0]; + expect(finalCtx.response.assetsBalance[MOCK_ACCOUNT_ID]).toStrictEqual({ + [MOCK_ASSET_MAINNET]: { amount: '1' }, + [MOCK_TOKEN_POLYGON]: { amount: '3' }, }); + // Recovered — removed from the asset axis. + expect(finalCtx.response.unprocessedCustomAssets).toBeUndefined(); + }); - it('keeps custom assets already on the request', async () => { - const otherCustom = - 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7' as Caip19AssetId; - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - { ...createDataRequest(['eip155:1']), customAssets: [otherCustom] }, - {}, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw.mock.calls[0][0].request.customAssets).toStrictEqual([ - otherCustom, - MOCK_ERC20_MAINNET, - ]); + it('skips asset-scoped recovery for assets whose chain was already retried on the chain axis', async () => { + // The chain-axis fetch (native + custom assets) already covers the token, so + // there must be no second, asset-scoped RPC call for the same chain. + const rpcResponse: DataResponse = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { [MOCK_TOKEN_POLYGON]: { amount: '3' } }, + }, + }; + const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, }); - - it('skips staking contract assets', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - {}, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_STAKING_ASSET_MAINNET]: { amount: '1000' }, - }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).not.toHaveBeenCalled(); + const ctx = createContext(createDataRequest(['eip155:137']), { + errors: { 'eip155:137': 'Unprocessed networks' }, + unprocessedCustomAssets: [MOCK_TOKEN_POLYGON], }); + const next = jest.fn(async (innerCtx) => innerCtx); - it('skips non-EVM tracked assets', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - {}, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_NON_EVM_ASSET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).not.toHaveBeenCalled(); - }); + await mw.assetsMiddleware(ctx, next); - it('skips tracked assets on chains outside the request', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1'], ['eip155:1', 'eip155:137']), - {}, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_POLYGON]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); + // Only the chain-axis call — it uses the original request (no customAssets + // override to the unresolved subset). + expect(rpcMw).toHaveBeenCalledTimes(1); + const [rpcCtx] = rpcMw.mock.calls[0]; + expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:137']); + expect(rpcCtx.request.customAssets).toBeUndefined(); - await mw.assetsMiddleware(ctx, next); + const finalCtx = next.mock.calls[0][0]; + expect(finalCtx.response.errors).toStrictEqual({}); + expect(finalCtx.response.unprocessedCustomAssets).toBeUndefined(); + }); - expect(rpcMw).not.toHaveBeenCalled(); + it('keeps unprocessedCustomAssets that RPC could not recover', async () => { + const { source } = createMockRpcSource({}); // RPC returns nothing + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, }); - - it('skips tracked assets on chains the account does not support', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1', 'eip155:137'], ['eip155:1']), - {}, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_POLYGON]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw).not.toHaveBeenCalled(); + const ctx = createContext(createDataRequest(['eip155:137']), { + unprocessedCustomAssets: [MOCK_TOKEN_POLYGON], }); + const next = jest.fn(async (innerCtx) => innerCtx); - it('fetches both errored chains and chains of stale tracked assets', async () => { - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1', 'eip155:137']), - { - errors: { 'eip155:137': 'Unprocessed by Accounts API' }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); + await mw.assetsMiddleware(ctx, next); - expect(new Set(rpcMw.mock.calls[0][0].request.chainIds)).toStrictEqual( - new Set(['eip155:137', 'eip155:1']), - ); - }); + const finalCtx = next.mock.calls[0][0]; + expect(finalCtx.response.unprocessedCustomAssets).toStrictEqual([ + MOCK_TOKEN_POLYGON, + ]); + }); - it('discards failed RPC results for stale-asset chains so upstream balances survive', async () => { - // Regression: RpcDataSource writes a native `0` stub for chains it fails - // on. For a chain fetched only because of a stale tracked asset (the - // upstream source succeeded on it), merging that stub would overwrite - // the correct native amount and, with replaceCoveredChainBalances, wipe - // the chain's token slice from state. - const rpcFailureResponse: DataResponse = { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '0' } }, - }, - errors: { 'eip155:1': 'Fetch failed: provider down' }, - }; - const { source } = createMockRpcSource(rpcFailureResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '5' } }, - }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_MAINNET]: { amount: '5' }, - [MOCK_ERC20_MAINNET]: { amount: '1000' }, - }, - }, + it('recovers both errored chains and unprocessed assets in separate RPC calls', async () => { + const rpcResponse: DataResponse = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_ASSET_BSC]: { amount: '9' }, + [MOCK_TOKEN_MAINNET]: { amount: '4' }, }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - const finalCtx = next.mock.calls[0][0]; - expect(finalCtx.response.assetsBalance[MOCK_ACCOUNT_ID]).toStrictEqual({ - [MOCK_ASSET_MAINNET]: { amount: '5' }, - }); - expect(finalCtx.response.errors?.['eip155:1']).toBeUndefined(); + }, + }; + const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, }); - - it('drops failure stubs but keeps the error for chains already errored upstream', async () => { - // The stub must not count as a "recovered" balance either — the chain - // stays errored so the slow pipeline retries it. - const rpcFailureResponse: DataResponse = { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_POLYGON]: { amount: '0' } }, - }, - errors: { 'eip155:137': 'Fetch failed: provider down' }, - }; - const { source } = createMockRpcSource(rpcFailureResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext(createDataRequest(['eip155:137']), { - errors: { 'eip155:137': 'Unprocessed by Accounts API' }, - }); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - const finalCtx = next.mock.calls[0][0]; - expect( - finalCtx.response.assetsBalance?.[MOCK_ACCOUNT_ID], - ).toBeUndefined(); - expect(finalCtx.response.errors?.['eip155:137']).toBe( - 'Fetch failed: provider down', - ); + const ctx = createContext(createDataRequest(['eip155:1', 'eip155:56']), { + errors: { 'eip155:56': 'Fetch failed' }, + unprocessedCustomAssets: [MOCK_TOKEN_MAINNET], }); + const next = jest.fn(async (innerCtx) => innerCtx); - it('merges recovered errored chains while discarding a failed stale-asset chain', async () => { - const rpcResponse: DataResponse = { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { - [MOCK_ASSET_POLYGON]: { amount: '7' }, - [MOCK_ASSET_MAINNET]: { amount: '0' }, - }, - }, - errors: { 'eip155:1': 'Fetch failed: provider down' }, - }; - const { source } = createMockRpcSource(rpcResponse); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const ctx = createContext( - createDataRequest(['eip155:1', 'eip155:137']), - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '5' } }, - }, - errors: { 'eip155:137': 'Unprocessed by Accounts API' }, - }, - { - assetsBalance: { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - }, - }, - ); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); + await mw.assetsMiddleware(ctx, next); - const finalCtx = next.mock.calls[0][0]; - expect(finalCtx.response.assetsBalance[MOCK_ACCOUNT_ID]).toStrictEqual({ - [MOCK_ASSET_MAINNET]: { amount: '5' }, - [MOCK_ASSET_POLYGON]: { amount: '7' }, - }); - expect(finalCtx.response.errors).toStrictEqual({}); - }); + // One call for the errored chain (whole chain), one scoped call for the pin. + expect(rpcMw).toHaveBeenCalledTimes(2); + const chainCall = rpcMw.mock.calls[0][0]; + expect(chainCall.request.chainIds).toStrictEqual(['eip155:56']); + expect(chainCall.request.customAssets).toBeUndefined(); + const assetCall = rpcMw.mock.calls[1][0]; + expect(assetCall.request.chainIds).toStrictEqual(['eip155:1']); + expect(assetCall.request.customAssets).toStrictEqual([MOCK_TOKEN_MAINNET]); - it('deduplicates stale assets shared by several accounts', async () => { - const secondAccountId = 'second-account-id'; - const stateBalances = { - [MOCK_ACCOUNT_ID]: { [MOCK_ERC20_MAINNET]: { amount: '1000' } }, - [secondAccountId]: { [MOCK_ERC20_MAINNET]: { amount: '5' } }, - }; - const { source, middleware: rpcMw } = createMockRpcSource(); - const mw = new RpcFallbackMiddleware({ rpcDataSource: source }); - const request = { - ...createDataRequest(['eip155:1']), - accountsWithSupportedChains: [ - { - account: createMockAccount(), - supportedChains: ['eip155:1'] as ChainId[], - }, - { - account: createMockAccount(secondAccountId), - supportedChains: ['eip155:1'] as ChainId[], - }, - ], - }; - const ctx = createContext(request, {}, { assetsBalance: stateBalances }); - const next = jest.fn(async (innerCtx) => innerCtx); - - await mw.assetsMiddleware(ctx, next); - - expect(rpcMw.mock.calls[0][0].request.customAssets).toStrictEqual([ - MOCK_ERC20_MAINNET, - ]); - }); + const finalCtx = next.mock.calls[0][0]; + expect(finalCtx.response.errors).toStrictEqual({}); + expect(finalCtx.response.unprocessedCustomAssets).toBeUndefined(); }); }); diff --git a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts index 32377f1d1f2..e9b94773d04 100644 --- a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts +++ b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts @@ -9,9 +9,12 @@ import type { Caip19AssetId, ChainId, Context, + DataRequest, DataResponse, Middleware, + NextFunction, } from '../types.js'; +import { normalizeAssetId } from '../utils/index.js'; import { mergeDataResponses } from './ParallelMiddleware.js'; const CONTROLLER_NAME = 'RpcFallbackMiddleware'; @@ -21,33 +24,35 @@ const log = createModuleLogger(projectLogger, CONTROLLER_NAME); export type RpcFallbackMiddlewareOptions = { /** The RPC data source to use as a fallback. */ rpcDataSource: AssetsDataSource; + /** + * When true, recover `unprocessedCustomAssets` (Accounts API v6). When false, + * re-read stale tracked assets the v5 API omitted (legacy path). + */ + isBalanceV6Enabled?: () => boolean; }; +const noopNext = async (ctx: Context): Promise => ctx; + /** - * RpcFallbackMiddleware re-reads balances from the RPC data source in two - * cases: + * RpcFallbackMiddleware recovers what upstream sources left outstanding on RPC. * - * 1. Chains present in `response.errors` (network error, unprocessedNetworks, - * timeout, …). Successful RPC results are merged into the response and - * their entries are cleared from `response.errors`. - * 2. EVM assets tracked in state (`state.assetsBalance` or - * `state.customAssets`) that this balance response left empty. The Accounts - * API omits tokens it does not index, and a returned `0` is - * indistinguishable from "not indexed", so the `merge` state update would - * otherwise keep a stale amount forever. They are passed to RPC as - * `customAssets` so the balance fetcher includes them in its multicall. + * Accounts API v5: chains in `response.errors`, plus EVM assets tracked in + * state that this response left empty (the API omits tokens it does not index). * - * Place this immediately after `createParallelBalanceMiddleware` in the fast - * pipeline, after `CustomAssetGraduationMiddleware` so the custom assets RPC - * carries never trigger graduation. + * Accounts API v6: chains in `response.errors`, plus pins in + * `response.unprocessedCustomAssets`. */ export class RpcFallbackMiddleware { readonly name = CONTROLLER_NAME; readonly #rpcDataSource: AssetsDataSource; + readonly #isBalanceV6Enabled: () => boolean; + constructor(options: RpcFallbackMiddlewareOptions) { this.#rpcDataSource = options.rpcDataSource; + this.#isBalanceV6Enabled = + options.isBalanceV6Enabled ?? ((): boolean => false); } getName(): string { @@ -56,117 +61,239 @@ export class RpcFallbackMiddleware { get assetsMiddleware(): Middleware { return forDataTypes(['balance'], async (ctx, next) => { - const erroredChains = new Set( - Object.keys(ctx.response.errors ?? {}) as ChainId[], - ); - const staleAssets = collectStaleTrackedAssets(ctx); - - const chainsToFetch = [ - ...new Set([ - ...ctx.request.chainIds.filter((id) => erroredChains.has(id)), - // Already restricted to requested chains. Their chain may not be - // errored: the Accounts API can answer for a chain while omitting a - // token it does not index. - ...staleAssets.map((assetId) => assetId.split('/')[0] as ChainId), - ]), - ]; - - if (chainsToFetch.length === 0) { - return next(ctx); + if (this.#isBalanceV6Enabled()) { + return this.#recoverV6(ctx, next); } + return this.#recoverV5(ctx, next); + }); + } - log('Re-reading balances on RPC', { - erroredChains: [...erroredChains], - staleAssets, - chains: chainsToFetch, - }); - - const filteredRequest = { - ...ctx.request, - chainIds: chainsToFetch, - customAssets: [ - ...new Set([...(ctx.request.customAssets ?? []), ...staleAssets]), - ], - }; - - const noopNext = async (inner: typeof ctx): Promise => inner; - const rpcResult = await this.#rpcDataSource.assetsMiddleware( - { - ...ctx, - request: filteredRequest, - response: {}, - }, - noopNext, - ); + async #recoverV6(ctx: Context, next: NextFunction): Promise { + const erroredChains = new Set( + Object.keys(ctx.response.errors ?? {}) as ChainId[], + ); + const unprocessedCustomAssets = [ + ...new Set(ctx.response.unprocessedCustomAssets ?? []), + ]; - // A chain RPC itself failed on contributed nothing trustworthy: its - // balances are failure stubs (native 0) that would overwrite correct - // upstream amounts and, with replaceCoveredChainBalances, wipe the - // chain's token slice from state. Drop them before merging — this also - // keeps failed chains from counting as "recovered" below. - const rpcFailedChains = new Set( - Object.keys(rpcResult.response.errors ?? {}) as ChainId[], - ); - const rpcAssetsBalance = filterOutChainBalances( - rpcResult.response.assetsBalance, - rpcFailedChains, - ); + if (erroredChains.size === 0 && unprocessedCustomAssets.length === 0) { + return next(ctx); + } + + let merged: DataResponse = ctx.response; - // RPC errors are kept only for chains that were already errored - // upstream. For chains fetched solely for stale tracked assets the - // upstream response succeeded and stays authoritative — the stale asset - // keeps its previous amount and is retried on the next pass. - const rpcErrors = Object.fromEntries( - Object.entries(rpcResult.response.errors ?? {}).filter(([chainId]) => - erroredChains.has(chainId as ChainId), - ), + if (erroredChains.size > 0) { + merged = await this.#recoverErroredChains(ctx, merged, erroredChains); + } + + const assetsToRecover = unprocessedCustomAssets.filter( + (assetId) => !erroredChains.has(chainIdOfAsset(assetId)), + ); + if (assetsToRecover.length > 0) { + merged = await this.#recoverUnprocessedAssets( + ctx, + merged, + assetsToRecover, ); + } + + merged = clearRecoveredAssetIds(merged); + + return next({ ...ctx, response: merged }); + } + + async #recoverV5(ctx: Context, next: NextFunction): Promise { + const erroredChains = new Set( + Object.keys(ctx.response.errors ?? {}) as ChainId[], + ); + const staleAssets = collectStaleTrackedAssets(ctx); + + const chainsToFetch = [ + ...new Set([ + ...ctx.request.chainIds.filter((id) => erroredChains.has(id)), + ...staleAssets.map((assetId) => assetId.split('/')[0] as ChainId), + ]), + ]; + + if (chainsToFetch.length === 0) { + return next(ctx); + } + + log('Re-reading balances on RPC', { + erroredChains: [...erroredChains], + staleAssets, + chains: chainsToFetch, + }); + + const filteredRequest = { + ...ctx.request, + chainIds: chainsToFetch, + customAssets: [ + ...new Set([...(ctx.request.customAssets ?? []), ...staleAssets]), + ], + }; + + const rpcResult = await this.#rpcDataSource.assetsMiddleware( + { + ...ctx, + request: filteredRequest, + response: {}, + }, + noopNext, + ); + + const rpcFailedChains = new Set( + Object.keys(rpcResult.response.errors ?? {}) as ChainId[], + ); + const rpcAssetsBalance = filterOutChainBalances( + rpcResult.response.assetsBalance, + rpcFailedChains, + ); + + const rpcErrors = Object.fromEntries( + Object.entries(rpcResult.response.errors ?? {}).filter(([chainId]) => + erroredChains.has(chainId as ChainId), + ), + ); + + const merged: DataResponse = mergeDataResponses([ + ctx.response, + { + ...rpcResult.response, + assetsBalance: rpcAssetsBalance, + errors: rpcErrors, + }, + ]); - const merged: DataResponse = mergeDataResponses([ - ctx.response, - { - ...rpcResult.response, - assetsBalance: rpcAssetsBalance, - errors: rpcErrors, - }, - ]); - - // Clear errors only for chains RPC actually recovered a balance for. - // We must inspect the (filtered) RPC balances — NOT merged — because - // merged also contains balances from the upstream sources (AccountsApi / - // Websocket / Staked). If those sources returned partial data for - // a chain that they also flagged as errored (e.g. via - // unprocessedNetworks), and RPC then failed for that same chain, - // looking at merged would incorrectly mark the error as recovered. - if (merged.errors && rpcAssetsBalance) { - const chainsRecoveredByRpc = new Set(); - for (const accountBalances of Object.values(rpcAssetsBalance)) { - for (const assetId of Object.keys(accountBalances)) { - chainsRecoveredByRpc.add(assetId.split('/')[0]); - } + if (merged.errors && rpcAssetsBalance) { + const chainsRecoveredByRpc = new Set(); + for (const accountBalances of Object.values(rpcAssetsBalance)) { + for (const assetId of Object.keys(accountBalances)) { + chainsRecoveredByRpc.add(assetId.split('/')[0]); } - for (const chainId of erroredChains) { - if (chainsRecoveredByRpc.has(chainId)) { - delete merged.errors[chainId]; - } + } + for (const chainId of erroredChains) { + if (chainsRecoveredByRpc.has(chainId)) { + delete merged.errors[chainId]; } } + } - return next({ ...ctx, response: merged }); + return next({ ...ctx, response: merged }); + } + + async #recoverErroredChains( + ctx: Context, + currentResponse: DataResponse, + erroredChains: Set, + ): Promise { + log('Retrying failed chains on RPC', { chains: [...erroredChains] }); + + const chainRequest: DataRequest = { + ...ctx.request, + chainIds: ctx.request.chainIds.filter((id) => erroredChains.has(id)), + }; + const rpcResult = await this.#rpcDataSource.assetsMiddleware( + { ...ctx, request: chainRequest, response: {} }, + noopNext, + ); + + const rpcFailedChains = new Set( + Object.keys(rpcResult.response.errors ?? {}) as ChainId[], + ); + const rpcAssetsBalance = filterOutChainBalances( + rpcResult.response.assetsBalance, + rpcFailedChains, + ); + + const merged = mergeDataResponses([ + currentResponse, + { + ...rpcResult.response, + assetsBalance: rpcAssetsBalance, + }, + ]); + + if (merged.errors && rpcAssetsBalance) { + const chainsRecoveredByRpc = new Set(); + for (const accountBalances of Object.values(rpcAssetsBalance)) { + for (const assetId of Object.keys(accountBalances)) { + chainsRecoveredByRpc.add(assetId.split('/')[0]); + } + } + for (const chainId of erroredChains) { + if (chainsRecoveredByRpc.has(chainId)) { + delete merged.errors[chainId]; + } + } + } + + return merged; + } + + async #recoverUnprocessedAssets( + ctx: Context, + currentResponse: DataResponse, + assetsToRecover: Caip19AssetId[], + ): Promise { + const assetChains = [ + ...new Set(assetsToRecover.map((assetId) => chainIdOfAsset(assetId))), + ]; + + log('Recovering unprocessed pinned assets on RPC', { + assetIds: assetsToRecover, }); + + const assetRequest: DataRequest = { + ...ctx.request, + chainIds: assetChains, + customAssets: assetsToRecover, + }; + const rpcResult = await this.#rpcDataSource.assetsMiddleware( + { ...ctx, request: assetRequest, response: {} }, + noopNext, + ); + + return mergeDataResponses([currentResponse, rpcResult.response]); } } -/** - * Remove all balances that belong to the given chains. - * - * Used to discard results for chains the RPC source itself failed on, whose - * entries are failure stubs (native `0`) rather than real readings. - * - * @param assetsBalance - Balances by account from the RPC response. - * @param chainIds - Chains whose balances should be dropped. - * @returns The filtered balance map, without accounts left empty. - */ +function chainIdOfAsset(assetId: Caip19AssetId): ChainId { + return assetId.split('/')[0] as ChainId; +} + +function clearRecoveredAssetIds(response: DataResponse): DataResponse { + if ( + !response.unprocessedCustomAssets || + response.unprocessedCustomAssets.length === 0 + ) { + return response; + } + + const recovered = new Set(); + for (const accountBalances of Object.values(response.assetsBalance ?? {})) { + for (const assetId of Object.keys(accountBalances)) { + recovered.add(normalizeAssetId(assetId as Caip19AssetId)); + } + } + + const stillUnprocessed = response.unprocessedCustomAssets.filter( + (assetId) => !recovered.has(normalizeAssetId(assetId)), + ); + + if (stillUnprocessed.length === response.unprocessedCustomAssets.length) { + return response; + } + + const next = { ...response }; + if (stillUnprocessed.length === 0) { + delete next.unprocessedCustomAssets; + } else { + next.unprocessedCustomAssets = stillUnprocessed; + } + return next; +} + function filterOutChainBalances( assetsBalance: DataResponse['assetsBalance'], chainIds: Set, @@ -189,17 +316,6 @@ function filterOutChainBalances( return filtered; } -/** - * EVM assets tracked in state that this balance response left empty and RPC - * should re-read. - * - * Limited to chains both requested and supported by the owning account: - * RpcDataSource fetches per account and skips chains outside its supported - * set, so anything else would be queued and then silently dropped. - * - * @param ctx - Pipeline context. - * @returns Asset IDs to hand to the RPC data source. - */ function collectStaleTrackedAssets(ctx: Context): Caip19AssetId[] { const { assetsBalance: stateAssetsBalance, customAssets: stateCustomAssets } = ctx.getAssetsState(); @@ -221,8 +337,6 @@ function collectStaleTrackedAssets(ctx: Context): Caip19AssetId[] { for (const assetId of trackedAssetIds) { if ( isEvmAssetOnChains(assetId, chainsForAccount) && - // Staked vault balances belong to StakedBalanceDataSource; an RPC - // ERC-20 read of the share token would clobber them. !isStakingContractAssetId(assetId) && isBalanceEmpty(ctx.response.assetsBalance?.[accountId], assetId) ) { @@ -234,16 +348,6 @@ function collectStaleTrackedAssets(ctx: Context): Caip19AssetId[] { return [...staleAssets]; } -/** - * Whether a balance response carries no positive amount for an asset. A - * returned `0` cannot be distinguished from "not indexed", so both count as - * empty. Asset IDs are matched case-insensitively: state keys ERC-20 assets by - * checksummed address, while some data sources return them lower-cased. - * - * @param balances - Balance map for a single account from the response. - * @param assetId - Asset ID to check. - * @returns True when the response holds no positive amount for the asset. - */ function isBalanceEmpty( balances: Record | undefined, assetId: Caip19AssetId, @@ -258,13 +362,6 @@ function isBalanceEmpty( return !(Number(amount) > 0); } -/** - * Whether an asset is an EVM asset on one of the given chains. - * - * @param assetId - CAIP-19 asset ID. - * @param chainIds - Chains to match against. - * @returns True for EVM assets whose chain is in `chainIds`. - */ function isEvmAssetOnChains( assetId: Caip19AssetId, chainIds: ChainId[], diff --git a/packages/assets-controller/src/types.ts b/packages/assets-controller/src/types.ts index 501220b6e5f..4fce55fef55 100644 --- a/packages/assets-controller/src/types.ts +++ b/packages/assets-controller/src/types.ts @@ -342,9 +342,15 @@ export type DataRequest = { * When true, the data source should poll only the user's `customAssets` * for the requested chains and skip refreshing the regular tracked * balances. Used by the AssetsController to issue a supplemental RPC - * subscription on chains that another data source is already covering. + * subscription on chains that another data source is already covering + * (Accounts API v5 path). Ignored when Accounts API v6 is enabled. */ customAssetsOnly?: boolean; + /** + * User-hidden CAIP-19 asset IDs, sent to the Accounts API v6 endpoint as + * `excludeAssetIds` so they are dropped from the response. + */ + excludeAssetIds?: Caip19AssetId[]; /** Force fresh fetch, bypass cache */ forceUpdate?: boolean; /** @@ -371,8 +377,14 @@ export type DataResponse = { assetsPrice?: Record; /** Balance data per account */ assetsBalance?: Record>; - /** Errors encountered, keyed by chain ID */ + /** Errors encountered, keyed by chain ID (chain-axis fallback + telemetry) */ errors?: Record; + /** + * Pinned asset IDs the source could not resolve (asset-axis fallback). + * Unlike `errors` the chain succeeded — only these assets still need a + * downstream (RPC) fetch. + */ + unprocessedCustomAssets?: Caip19AssetId[]; /** Detected assets (assets that do not have metadata) */ detectedAssets?: Record; /** @@ -384,8 +396,8 @@ export type DataResponse = { * When set with `updateMode: 'merge'`, balances on chains present in * `assetsBalance` replace the prior chain slice (stale tokens on those chains * are dropped). Custom assets on covered chains are preserved. Used for - * `getAssets({ forceUpdate: true })` so unlock/startup reflects the API snapshot - * without switching to `updateMode: 'full'`. + * Accounts API v5 `getAssets({ forceUpdate: true })`. Accounts API v6 uses + * `updateMode: 'full'` instead. */ replaceCoveredChainBalances?: boolean; }; @@ -393,20 +405,18 @@ export type DataResponse = { /** * Type of {@link DataResponse.updateMode}: how the controller applies the response to state. * - * - **full**: Response is the full set for the scope. Assets in state but not in the - * response are cleared (except custom assets). Use for initial fetch or full refresh. - * - **merge**: By default only assets present in the response are updated; - * nothing is removed. When {@link DataResponse.replaceCoveredChainBalances} - * is true, balances on chains present in the response replace the prior chain - * slice (stale tokens on those chains are dropped; custom assets preserved). - * Metadata and prices from the response are applied. Use for event-driven updates. - * - **update**: Balance-only overlay — incoming balance amounts are patched in place; - * existing balances, metadata, and prices are never removed or overwritten. - * Missing metadata and prices from the response are seeded so RPC-only chains - * can render on first fetch. Use for force refresh when the API may return a - * partial chain snapshot. - */ -export type AssetsUpdateMode = 'full' | 'merge' | 'update'; + * - **full**: Response is the full set for covered chains (those present in + * `assetsBalance`). Assets in state on those chains but not in the response + * are cleared, including custom assets (Accounts API v6 returns pins via + * `includeAssetIds`). The only exception is {@link DataResponse.unprocessedCustomAssets} + * that RPC fallback also could not recover — those prior balances are kept + * until a later successful fetch. Use for Accounts API v6 snapshots. + * - **merge**: Only assets present in the response are updated; nothing is + * removed, unless {@link DataResponse.replaceCoveredChainBalances} is set + * (Accounts API v5 force refresh). Metadata and prices from the response + * are applied. Use for event-driven updates and Accounts API v5. + */ +export type AssetsUpdateMode = 'full' | 'merge'; // ============================================================================ // DATA SOURCE <-> CONTROLLER (DIRECT CALLS, NO MESSENGER PER SOURCE) From 9887e84f978143b8e06be37e6a5a44efc913d94d Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Fri, 4 Sep 2026 10:40:47 +0200 Subject: [PATCH 02/25] add rpcFallbackMiddleware in v6 --- packages/assets-controller/CHANGELOG.md | 1 + .../architecture/15.0.0/CHANGES.md | 161 ++++++++++++++++++ .../src/AssetsController.test.ts | 19 +-- .../assets-controller/src/AssetsController.ts | 28 +-- .../assets-controller/tsconfig.build.json | 2 +- 5 files changed, 187 insertions(+), 24 deletions(-) create mode 100644 packages/assets-controller/architecture/15.0.0/CHANGES.md diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 14054f7c3dc..8d74e8d623d 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - When `assetsAccountsApiV6` is enabled, Accounts API fetch and middleware report `updateMode: 'full'` so assets on chains in the snapshot (including custom assets returned via `includeAssetIds`) are replaced; pins left in `unprocessedCustomAssets` after RPC fallback keep their prior balances. The v5 path keeps `updateMode: 'merge'` with `replaceCoveredChainBalances` so custom assets are preserved ([#9651](https://github.com/MetaMask/core/pull/9651)) +- When `assetsAccountsApiV6` is enabled, the `getAssets` force-update fast pipeline runs `RpcFallbackMiddleware` after Accounts API so `unprocessedIncludeAssetIds` are recovered on RPC before state is committed (same as poll enrichment). Chains that still have unresolved pins are also kept on the slow RPC lane. - **BREAKING:** Remove the unused `updateMode` option from `AssetsController.getAssets`. Apply mode comes only from `DataResponse.updateMode` (data sources). Remove `'update'` from `AssetsUpdateMode` — it was never produced; use `'merge'` to overlay or `'full'` to replace a covered chain slice ([#9651](https://github.com/MetaMask/core/pull/9651)) ## [16.0.0] diff --git a/packages/assets-controller/architecture/15.0.0/CHANGES.md b/packages/assets-controller/architecture/15.0.0/CHANGES.md new file mode 100644 index 00000000000..a186261a77a --- /dev/null +++ b/packages/assets-controller/architecture/15.0.0/CHANGES.md @@ -0,0 +1,161 @@ +# AssetsController 15.0.0 - architecture change and AccountsAPI v5/v6 paths + +This branch keeps the previous balance behavior and the new Accounts API v6 +behavior side by side behind the `assetsAccountsApiV6` remote feature flag. + +- Flag off, missing, or unreadable: use the legacy **v5** path. +- `assetsAccountsApiV6: { value: true }`: use the new **v6** path. + +The flag is read only in `AssetsController.#isBalanceV6Enabled()` and injected +into `AccountsApiDataSource`, `RpcFallbackMiddleware`, and `RpcDataSource`. + +## Architectural change + +The controller now has two explicit orchestration paths instead of one mixed +flow with many conditional branches: + +- **v5 path** preserves the old behavior so rollout-off matches existing + production semantics. +- **v6 path** isolates the new behavior so rollout-on can be evaluated and the + old path can be deleted cleanly later. + +This split exists in three main places: + +1. Force-update orchestration from `getAssets(..., { forceUpdate: true })` +2. Balance subscription setup +3. Balance update enrichment and merge + +## Path overview + +```mermaid +flowchart TD + A[getAssets forceUpdate / subscribe / handleAssetsUpdate] --> F{assetsAccountsApiV6} + F -->|false| V5[v5 path] + F -->|true| V6[v6 path] +``` + +## Force-update path + +Both paths share the same broad shape: run a fast lane, commit state, then run +the slower background fetch. + +```mermaid +flowchart TB + subgraph request ["Request shaping"] + R5["v5 request
every pinned asset for requested accounts
unscoped
no excludeAssetIds"] + R6["v6 request
pins scoped to requested chains
optional customAssets override
hidden assets as excludeAssetIds"] + end + + subgraph v5fast ["v5 fast lane"] + direction TB + V5P["Accounts API v5 || Staked"] + V5G[CustomAssetGraduation] + V5F[RpcFallback] + V5D[Detection] + V5T["Token || Price"] + V5P --> V5G --> V5F --> V5D --> V5T + V5S["State update
merge + replaceCoveredChainBalances"] + V5T --> V5S + end + + subgraph v6fast ["v6 fast lane"] + direction TB + V6P["Accounts API v6 || Staked
includeAssetIds / excludeAssetIds"] + V6F["RpcFallback
errored chains + unprocessedIncludeAssetIds"] + V6D[Detection] + V6T["Token || Price"] + V6P --> V6F --> V6D --> V6T + V6S["State update
Accounts API drives updateMode full"] + V6T --> V6S + end + + subgraph bg ["Background lane"] + B1["Snap || RPC"] + B2[Detection] + B3["Token || Price"] + B4["State update
merge"] + B1 --> B2 --> B3 --> B4 + end + + R5 --> v5fast --> bg + R6 --> v6fast --> bg +``` + +When basic functionality is off, both fast lanes reduce to `Staked -> Detection` +and the background lane is RPC only. + +## Subscribe path + +```mermaid +flowchart LR + subgraph v5sub ["v5 subscribe"] + S5A[Chain handoff by source priority] + S5B["RPC customAssetsOnly supplement
for pins on chains another source owns"] + S5A --> S5B + end + + subgraph v6sub ["v6 subscribe"] + S6A[Chain handoff by source priority] + S6B["claimCustomAssets per source
Accounts API claims EVM pins as includeAssetIds"] + S6C["RPC asset-scoped polls
for unclaimed claimed pins"] + S6A --> S6B --> S6C + end +``` + +`AccountsApiDataSource.claimCustomAssets()` returns `[]` on v5. + +## Update enrichment path + +```mermaid +flowchart TB + subgraph v5update ["v5 handleAssetsUpdate"] + U5G["CustomAssetGraduation
for Accounts API / AccountActivity"] + U5D[Detection] + U5T["Token || Price"] + U5S["State update
merge; honor replaceCoveredChainBalances"] + U5G --> U5D --> U5T --> U5S + end + + subgraph v6update ["v6 handleAssetsUpdate"] + U6F["RpcFallback when basic on
errored chains + unprocessedCustomAssets"] + U6D[Detection] + U6T["Token || Price"] + U6S["State update
full when Accounts API marks it full"] + U6F --> U6D --> U6T --> U6S + end +``` + +v5 does not run `RpcFallbackMiddleware` on this subscribe/update path. v6 does +not run `CustomAssetGraduationMiddleware`. + +## Behavioral intent + +| Concern | v5 | v6 | +| ------------------------- | ------------------------------------------ | ------------------------------------------------- | +| Accounts API endpoint | `fetchV5MultiAccountBalances` | `fetchV6MultiAccountBalances` | +| Accounts API update mode | `merge` | `full` | +| Covered-chain merge | Preserve old behavior | Replace covered chain slice | +| Custom asset preservation | Keep custom + staked pins in v5 merge path | Keep `unprocessedCustomAssets` until RPC resolves | +| Hidden assets | Not sent to v5 endpoint | Sent as `excludeAssetIds` | +| RPC token fetch | Flat `request.customAssets` on the chain | Only pins owned by that account | + +## Code map + +| Concern | v5 implementation | v6 implementation | +| ------------------------ | ----------------------------------------- | ----------------------------------------- | +| Force-update request | `#buildForceUpdateRequestV5` | `#buildForceUpdateRequestV6` | +| Force-update pipeline | `#forceUpdateAssetsV5`, `#runFastFetchV5` | `#forceUpdateAssetsV6`, `#runFastFetchV6` | +| Subscribe | `#subscribeAssetsBalanceV5` | `#subscribeAssetsBalanceV6` | +| Update enrichment | `#handleAssetsUpdateV5` | `#handleAssetsUpdateV6` | +| Balance merge | `mergeAccountBalancesV5` | `mergeAccountBalancesV6` | +| Accounts API fetch | `#fetchV5Balances` | `#fetchV6Balances` | +| RPC fallback | `#recoverV5` | `#recoverV6` | +| RPC custom ERC-20 append | `#appendRequestCustomErc20sV5` | `#appendRequestCustomErc20sV6` | + +## Deletion plan after rollout + +Once v6 is accepted as the only behavior: + +1. Remove the v5 methods and `!this.#isBalanceV6Enabled()` branches. +2. Keep the v6 methods as the only orchestration path. +3. Remove transitional docs/tables that compare v5 and v6. diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index 1e19332fcdd..421fa6a8b91 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -1801,7 +1801,7 @@ describe('AssetsController', () => { ); }); - it('routes chains carrying unprocessed pinned assets (unprocessedCustomAssets) to the slow-pipeline RPC fetch', async () => { + it('falls back to RPC on the force-update fast path for unprocessed include asset ids', async () => { const customToken = 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; @@ -1826,9 +1826,9 @@ describe('AssetsController', () => { }, } as unknown as ApiPlatformClient; - const rpcRequestChainIds: ChainId[][] = []; + const rpcRequestCustomAssets: (Caip19AssetId[] | undefined)[] = []; const rpcMiddleware = jest.fn(async (ctx, next) => { - rpcRequestChainIds.push(ctx.request.chainIds); + rpcRequestCustomAssets.push(ctx.request.customAssets); return next(ctx); }); const rpcMiddlewareGetter = jest @@ -1850,22 +1850,21 @@ describe('AssetsController', () => { await controller.addCustomAsset(MOCK_ACCOUNT_ID, customToken); + rpcMiddleware.mockClear(); await controller.getAssets([createMockInternalAccount()], { chainIds: ['eip155:1'], forceUpdate: true, }); - - // Slow pipeline is fire-and-forget; let it run. - await flushPromises(); }, ); - // The chain of the unresolved pin (eip155:1) — a chain AccountsApi - // handled and did NOT flag as errored — is still routed to RPC in the - // slow pipeline so the pin gets fetched. + // RpcFallbackMiddleware runs in the awaited fast lane, scoped to the + // pins Accounts API listed in unprocessedIncludeAssetIds. expect(rpcMiddleware).toHaveBeenCalled(); expect( - rpcRequestChainIds.some((chains) => chains.includes('eip155:1')), + rpcRequestCustomAssets.some((customAssets) => + customAssets?.includes(customToken), + ), ).toBe(true); rpcMiddlewareGetter.mockRestore(); diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 5917800101c..603ce2c7cfc 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1889,6 +1889,7 @@ export class AssetsController extends BaseController< this.#accountsApiDataSource, this.#stakedBalanceDataSource, ]), + this.#rpcFallbackMiddleware, this.#detectionMiddleware, createParallelMiddleware([ this.#tokenDataSource, @@ -2612,19 +2613,20 @@ export class AssetsController extends BaseController< * @returns `true` when the v6 remote flag is on. */ #isBalanceV6Enabled(): boolean { - try { - const { remoteFeatureFlags } = this.messenger.call( - 'RemoteFeatureFlagController:getState', - ); - const flag = remoteFeatureFlags?.assetsAccountsApiV6; - return ( - typeof flag === 'object' && - flag !== null && - Boolean((flag as { value?: unknown }).value) - ); - } catch { - return false; - } + return true; + // try { + // const { remoteFeatureFlags } = this.messenger.call( + // 'RemoteFeatureFlagController:getState', + // ); + // const flag = remoteFeatureFlags?.assetsAccountsApiV6; + // return ( + // typeof flag === 'object' && + // flag !== null && + // Boolean((flag as { value?: unknown }).value) + // ); + // } catch { + // return false; + // } } // ============================================================================ diff --git a/packages/assets-controller/tsconfig.build.json b/packages/assets-controller/tsconfig.build.json index a5960f7760f..73b031aff4d 100644 --- a/packages/assets-controller/tsconfig.build.json +++ b/packages/assets-controller/tsconfig.build.json @@ -61,5 +61,5 @@ } ], "include": ["../../types", "./src"], - "exclude": ["**/*.test.ts", "**/__fixtures__/"] + "exclude": ["**/*.test.ts", "**/__fixtures__/", "./architecture"] } From e1241d66a1b6a806e8c9e8c200eac84fe7a7ad42 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 7 Sep 2026 22:51:57 +0200 Subject: [PATCH 03/25] Not fetching hidden tokens --- packages/assets-controller/CHANGELOG.md | 1 + .../src/AssetsController.test.ts | 134 +++++++++++++++++- .../assets-controller/src/AssetsController.ts | 77 +++++++++- .../AccountsApiDataSource.test.ts | 6 +- .../src/data-sources/AccountsApiDataSource.ts | 33 ++--- 5 files changed, 224 insertions(+), 27 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 8d74e8d623d..613695c8347 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- A hide now wins over a pin when an asset is both in `customAssets` and marked `hidden` in `assetPreferences`. Hidden pins are dropped from the `customAssets`/`includeAssetIds` attached to `getAssets` force updates, balance subscriptions, and the supplemental RPC custom-asset poll, so a hidden token is no longer fetched. `hideAsset` still leaves the pin in `customAssets` to record that the token was imported, and `unhideAsset` restores it on the next subscription ([#9651](https://github.com/MetaMask/core/pull/9651)) - When `assetsAccountsApiV6` is enabled, Accounts API fetch and middleware report `updateMode: 'full'` so assets on chains in the snapshot (including custom assets returned via `includeAssetIds`) are replaced; pins left in `unprocessedCustomAssets` after RPC fallback keep their prior balances. The v5 path keeps `updateMode: 'merge'` with `replaceCoveredChainBalances` so custom assets are preserved ([#9651](https://github.com/MetaMask/core/pull/9651)) - When `assetsAccountsApiV6` is enabled, the `getAssets` force-update fast pipeline runs `RpcFallbackMiddleware` after Accounts API so `unprocessedIncludeAssetIds` are recovered on RPC before state is committed (same as poll enrichment). Chains that still have unresolved pins are also kept on the slow RPC lane. - **BREAKING:** Remove the unused `updateMode` option from `AssetsController.getAssets`. Apply mode comes only from `DataResponse.updateMode` (data sources). Remove `'update'` from `AssetsUpdateMode` — it was never produced; use `'merge'` to overlay or `'full'` to replace a covered chain slice ([#9651](https://github.com/MetaMask/core/pull/9651)) diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index 421fa6a8b91..9f905cb50d7 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -27,7 +27,10 @@ import type { PriceDataSourceConfig } from './data-sources/PriceDataSource.js'; import { PriceDataSource } from './data-sources/PriceDataSource.js'; import { RpcDataSource } from './data-sources/RpcDataSource.js'; import { TokenDataSource } from './data-sources/TokenDataSource.js'; -import { buildDefaultAssetsInfo } from './defaults.js'; +import { + buildDefaultAssetsInfo, + getDefaultTrackedAssetsForChain, +} from './defaults.js'; import type { Assets3346MigrationState } from './migrations/healAssetsInfoMetadata.js'; import type { Caip19AssetId, @@ -102,6 +105,10 @@ const MOCK_ASSET_ID = const MOCK_ASSET_ID_LOWERCASE = 'eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' as Caip19AssetId; const MOCK_NATIVE_ASSET_ID = 'eip155:1/slip44:60' as Caip19AssetId; +/** mUSD on mainnet — a controller-managed default tracked asset. */ +const [MOCK_DEFAULT_TRACKED_ASSET_ID] = getDefaultTrackedAssetsForChain( + 'eip155:1' as ChainId, +); /** * Activate asset tracking by marking the UI open, the keyring unlocked, and @@ -1464,6 +1471,67 @@ describe('AssetsController', () => { ); }); + it('stops forwarding a pinned custom asset as includeAssetIds once it is hidden', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + await withController( + { + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + }, + async ({ controller }) => { + await flushPromises(); + + await controller.addCustomAsset(MOCK_ACCOUNT_ID, customToken); + controller.hideAsset(customToken); + + // The pin is preserved so the import is remembered. + expect(controller.getCustomAssets(MOCK_ACCOUNT_ID)).toContain( + customToken, + ); + + fetchV6MultiAccountBalances.mockClear(); + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + + expect(fetchV6MultiAccountBalances).toHaveBeenCalledWith( + expect.any(Array), + expect.objectContaining({ + excludeAssetIds: expect.arrayContaining([customToken]), + }), + expect.anything(), + ); + for (const [, params] of fetchV6MultiAccountBalances.mock.calls) { + expect(params?.includeAssetIds ?? []).not.toContain(customToken); + } + }, + ); + }); + it('includes every pinned asset on the v5 force-update request, including other chains', async () => { const mainnetToken = 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; @@ -3092,6 +3160,70 @@ describe('AssetsController', () => { }); }); + it('keeps default tracked assets at zero when a full update omits them', async () => { + // Regression: a force refresh (e.g. "Refresh list") replaces the chain + // slice, so mUSD was dropped from the token list for accounts holding + // none. Default tracked assets are re-asserted just like natives. + const initialState: Partial = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_DEFAULT_TRACKED_ASSET_ID]: { amount: '0' }, + [MOCK_NATIVE_ASSET_ID]: { amount: '0.5' }, + }, + }, + }; + + await withController({ state: initialState }, async ({ controller }) => { + await controller.handleAssetsUpdate( + { + updateMode: 'full', + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_NATIVE_ASSET_ID]: { amount: '2' }, + }, + }, + }, + 'TestSource', + ); + + expect( + controller.state.assetsBalance[MOCK_ACCOUNT_ID]?.[ + MOCK_DEFAULT_TRACKED_ASSET_ID + ], + ).toStrictEqual({ amount: '0' }); + }); + }); + + it('does not overwrite a default tracked asset balance returned by a full update', async () => { + const initialState: Partial = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_DEFAULT_TRACKED_ASSET_ID]: { amount: '5' }, + }, + }, + }; + + await withController({ state: initialState }, async ({ controller }) => { + await controller.handleAssetsUpdate( + { + updateMode: 'full', + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_DEFAULT_TRACKED_ASSET_ID]: { amount: '7' }, + }, + }, + }, + 'TestSource', + ); + + expect( + controller.state.assetsBalance[MOCK_ACCOUNT_ID]?.[ + MOCK_DEFAULT_TRACKED_ASSET_ID + ], + ).toStrictEqual({ amount: '7' }); + }); + }); + it('preserves unprocessed custom assets that RPC fallback could not recover', async () => { const initialState: Partial = { assetsBalance: { diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 603ce2c7cfc..2d2020e50fd 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -109,6 +109,7 @@ import { DEFAULT_TRACKED_ASSETS_BY_CHAIN, buildDefaultAssetsInfo, getDefaultAssetMetadata, + getDefaultTrackedAssetsForChain, } from './defaults.js'; import { AssetsDataSourceError } from './errors.js'; import { projectLogger, createModuleLogger } from './logger.js'; @@ -1760,7 +1761,7 @@ export class AssetsController extends BaseController< ): DataRequest { const customAssets: Caip19AssetId[] = []; for (const account of accounts) { - customAssets.push(...this.getCustomAssets(account.id)); + customAssets.push(...this.#getVisibleCustomAssets(account.id)); } return this.#buildDataRequest(accounts, chainIds, { @@ -1803,7 +1804,8 @@ export class AssetsController extends BaseController< try { const normalizedAssetId = normalizeAssetId(assetId); if ( - requestedChains.has(parseCaipAssetType(normalizedAssetId).chainId) + requestedChains.has(parseCaipAssetType(normalizedAssetId).chainId) && + !this.state.assetPreferences[normalizedAssetId]?.hidden ) { customAssetsSet.add(normalizedAssetId); } @@ -2606,6 +2608,21 @@ export class AssetsController extends BaseController< return hidden; } + /** + * An account's pins minus the ones the user has hidden. A hide wins over a + * pin on requests, so a hidden asset is never fetched; the pin stays in + * `customAssets` to record that the token was imported, and unhiding it + * restores the pin on the next subscription. + * + * @param accountId - The account whose pins should be collected. + * @returns The account's pinned asset IDs that are not hidden. + */ + #getVisibleCustomAssets(accountId: AccountId): Caip19AssetId[] { + return this.getCustomAssets(accountId).filter( + (assetId) => !this.state.assetPreferences[assetId]?.hidden, + ); + } + /** * Whether Accounts API v6 (and the v6 custom-asset path) is enabled. * Injected into AccountsApiDataSource and RpcFallbackMiddleware. @@ -2907,6 +2924,25 @@ export class AssetsController extends BaseController< ); } + /** + * Returns the controller-managed default tracked asset IDs (e.g. mUSD) for + * the chains this account supports (account scopes ∩ enabled chains). + * Non-EVM accounts resolve to an empty list because every chain in the + * defaults registry is EVM today. + * + * @param account - The account (scopes determine which chains apply). + * @returns Array of default tracked asset IDs across the supported chains. + */ + #getDefaultTrackedAssetIdsForAccount( + account: InternalAccount, + ): Caip19AssetId[] { + const ids: Caip19AssetId[] = []; + for (const chainId of this.#getEnabledChainsForAccount(account)) { + ids.push(...getDefaultTrackedAssetsForChain(chainId)); + } + return ids; + } + /** * Chains for the post-commit slow pipeline (Snap + RPC). Excludes chains the * fast Accounts API path already handled without error so stale RPC data cannot @@ -3185,6 +3221,22 @@ export class AssetsController extends BaseController< } } + // Default tracked assets (mUSD) are controller-managed and, like + // natives, must render at zero balance. An authoritative + // chain-slice replace omits them whenever the account holds none, + // so re-assert them here — otherwise a force refresh (e.g. the + // "Refresh list" action) would drop mUSD from the token list. + const defaultTrackedAssetIdsForAccount = account + ? this.#getDefaultTrackedAssetIdsForAccount(account) + : []; + for (const defaultAssetId of defaultTrackedAssetIdsForAccount) { + if ( + !Object.prototype.hasOwnProperty.call(effective, defaultAssetId) + ) { + effective[defaultAssetId] = { amount: '0' } as AssetBalance; + } + } + for (const [assetId, balance] of Object.entries(effective)) { const previousBalance = previousBalances[ assetId as Caip19AssetId @@ -3205,11 +3257,14 @@ export class AssetsController extends BaseController< ); effective[assetId] = { ...balance, amount: newAmount }; const oldAmount = previousBalance?.amount; - const isNewDefaultNativeZero = + const isNewSeededZero = oldAmount === undefined && newAmount === '0' && - nativeAssetIdsForAccount.includes(assetId as Caip19AssetId); - if (oldAmount !== newAmount && !isNewDefaultNativeZero) { + (nativeAssetIdsForAccount.includes(assetId as Caip19AssetId) || + defaultTrackedAssetIdsForAccount.includes( + assetId as Caip19AssetId, + )); + if (oldAmount !== newAmount && !isNewSeededZero) { changedBalances.push({ accountId, assetId, @@ -3677,7 +3732,7 @@ export class AssetsController extends BaseController< const remainingChains = new Set(chainToAccounts.keys()); const remainingCustomAssets = new Set(); for (const account of accounts) { - for (const assetId of this.getCustomAssets(account.id)) { + for (const assetId of this.#getVisibleCustomAssets(account.id)) { try { if (remainingChains.has(parseCaipAssetType(assetId).chainId)) { remainingCustomAssets.add(assetId); @@ -3777,9 +3832,17 @@ export class AssetsController extends BaseController< const rpc = this.#rpcDataSource; const supplementalKey = `ds:${rpc.getName()}:custom`; + const visibleCustomAssetsByAccount: Record = {}; + for (const account of accounts) { + const visibleCustomAssets = this.#getVisibleCustomAssets(account.id); + if (visibleCustomAssets.length > 0) { + visibleCustomAssetsByAccount[account.id] = visibleCustomAssets; + } + } + const decision = pickRpcCustomAssetsSupplement({ accountIds: accounts.map((account) => account.id), - customAssetsByAccount: this.state.customAssets, + customAssetsByAccount: visibleCustomAssetsByAccount, rpcAssignedChains, rpcAvailableChains: new Set(rpc.getActiveChainsSync()), enabledChains: new Set(chainToAccounts.keys()), diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts index 7776e216372..bddff6e62d6 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts @@ -1161,7 +1161,7 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); - it('lets a pinned asset win when it also appears in the hidden list', async () => { + it('lets a hidden asset win when it also appears in the pinned list', async () => { const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, }); @@ -1176,12 +1176,12 @@ describe('AccountsApiDataSource', () => { }), ); - // The asset is pinned, so it is included and never excluded. + // The asset is hidden, so it is excluded and never included. expect( apiClient.accounts.fetchV6MultiAccountBalances, ).toHaveBeenCalledWith( [`eip155:1:${MOCK_ADDRESS}`], - { includeAssetIds: [token] }, + { excludeAssetIds: [token] }, undefined, ); diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts index 3409cccbb38..c44bc96e2be 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts @@ -426,19 +426,20 @@ export class AccountsApiDataSource extends AbstractDataSource< }; if (isV6) { - // User-pinned assets on the fetched chains, sent to v6 as - // `includeAssetIds` so the backend returns them even at zero balance. - const includeAssetIds = this.#getIncludeAssetIds( + // User-hidden assets on the fetched chains, sent to v6 as + // `excludeAssetIds`. + const excludeAssetIds = this.#getExcludeAssetIds( request, chainsToFetch, ); - // User-hidden assets on the fetched chains, sent to v6 as - // `excludeAssetIds`. A pin wins over a hide. - const excludeAssetIds = this.#getExcludeAssetIds( + // User-pinned assets on the fetched chains, sent to v6 as + // `includeAssetIds` so the backend returns them even at zero balance. + // A hide wins over a pin, so hidden assets are never fetched. + const includeAssetIds = this.#getIncludeAssetIds( request, chainsToFetch, - includeAssetIds, + excludeAssetIds, ); fetchResult = await this.#fetchV6Balances( @@ -518,24 +519,31 @@ export class AccountsApiDataSource extends AbstractDataSource< /** * Collect the pinned EVM assets on the fetched chains to send to the v6 - * endpoint as `includeAssetIds`; malformed IDs are skipped. + * endpoint as `includeAssetIds`; malformed IDs are skipped and hidden + * assets are left out (a hide wins). * * @param request - The data request (carries `customAssets`). * @param chainsToFetch - Chains being requested this fetch. + * @param excludeAssetIds - Hidden asset IDs that must not be included. * @returns Deduplicated asset IDs, or `undefined` when none. */ #getIncludeAssetIds( request: DataRequest, chainsToFetch: ChainId[], + excludeAssetIds: Caip19AssetId[] | undefined, ): Caip19AssetId[] | undefined { if (!request.customAssets || request.customAssets.length === 0) { return undefined; } const chainsToFetchSet = new Set(chainsToFetch); + const excludeSet = new Set(excludeAssetIds ?? []); const includeAssetIds = new Set(); for (const assetId of request.customAssets) { + if (excludeSet.has(assetId)) { + continue; + } let chainId: ChainId; try { chainId = parseCaipAssetType(assetId).chainId; @@ -555,31 +563,24 @@ export class AccountsApiDataSource extends AbstractDataSource< /** * Collect the hidden EVM assets on the fetched chains to send to the v6 - * endpoint as `excludeAssetIds`; malformed IDs are skipped and pinned - * assets are left out (a pin wins). + * endpoint as `excludeAssetIds`; malformed IDs are skipped. * * @param request - The data request (carries `excludeAssetIds`). * @param chainsToFetch - Chains being requested this fetch. - * @param includeAssetIds - Pinned asset IDs that must not be excluded. * @returns Deduplicated asset IDs, or `undefined` when none. */ #getExcludeAssetIds( request: DataRequest, chainsToFetch: ChainId[], - includeAssetIds: Caip19AssetId[] | undefined, ): Caip19AssetId[] | undefined { if (!request.excludeAssetIds || request.excludeAssetIds.length === 0) { return undefined; } const chainsToFetchSet = new Set(chainsToFetch); - const includeSet = new Set(includeAssetIds ?? []); const excludeAssetIds = new Set(); for (const assetId of request.excludeAssetIds) { - if (includeSet.has(assetId)) { - continue; - } let chainId: ChainId; try { chainId = parseCaipAssetType(assetId).chainId; From ff6e6f34aff391e63366e088984bc86cc8d173c4 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 7 Sep 2026 23:16:07 +0200 Subject: [PATCH 04/25] fix bypassServerCache --- packages/assets-controller/CHANGELOG.md | 4 + .../architecture/v1}/CHANGES.md | 2 +- .../src/AssetsController.test.ts | 73 ++++++++++++++---- .../assets-controller/src/AssetsController.ts | 30 ++++---- .../AccountsApiDataSource.test.ts | 74 +++++++------------ 5 files changed, 106 insertions(+), 77 deletions(-) rename packages/assets-controller/{architecture/15.0.0 => docs/architecture/v1}/CHANGES.md (98%) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 613695c8347..ef0a06ad9fb 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - When `assetsAccountsApiV6` is enabled, the `getAssets` force-update fast pipeline runs `RpcFallbackMiddleware` after Accounts API so `unprocessedIncludeAssetIds` are recovered on RPC before state is committed (same as poll enrichment). Chains that still have unresolved pins are also kept on the slow RPC lane. - **BREAKING:** Remove the unused `updateMode` option from `AssetsController.getAssets`. Apply mode comes only from `DataResponse.updateMode` (data sources). Remove `'update'` from `AssetsUpdateMode` — it was never produced; use `'merge'` to overlay or `'full'` to replace a covered chain slice ([#9651](https://github.com/MetaMask/core/pull/9651)) +### Fixed + +- Treat `assetsAccountsApiV6` as enabled when it is `true` ([#9651](https://github.com/MetaMask/core/pull/9651)) + ## [16.0.0] ### Changed diff --git a/packages/assets-controller/architecture/15.0.0/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md similarity index 98% rename from packages/assets-controller/architecture/15.0.0/CHANGES.md rename to packages/assets-controller/docs/architecture/v1/CHANGES.md index a186261a77a..71dd3253075 100644 --- a/packages/assets-controller/architecture/15.0.0/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -4,7 +4,7 @@ This branch keeps the previous balance behavior and the new Accounts API v6 behavior side by side behind the `assetsAccountsApiV6` remote feature flag. - Flag off, missing, or unreadable: use the legacy **v5** path. -- `assetsAccountsApiV6: { value: true }`: use the new **v6** path. +- `assetsAccountsApiV6: true`: use the new **v6** path. The flag is read only in `AssetsController.#isBalanceV6Enabled()` and injected into `AccountsApiDataSource`, `RpcFallbackMiddleware`, and `RpcDataSource`. diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index 9f905cb50d7..29ff8dc4d33 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -733,7 +733,7 @@ describe('AssetsController', () => { await withController( { - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); @@ -1404,7 +1404,7 @@ describe('AssetsController', () => { await withController( { queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await flushPromises(); @@ -1448,7 +1448,7 @@ describe('AssetsController', () => { await withController( { queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await flushPromises(); @@ -1499,7 +1499,7 @@ describe('AssetsController', () => { await withController( { queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await flushPromises(); @@ -1595,7 +1595,7 @@ describe('AssetsController', () => { await withController( { - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await controller.addCustomAsset(MOCK_ACCOUNT_ID, mainnetToken); @@ -1641,7 +1641,7 @@ describe('AssetsController', () => { await withController( { - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await controller.addCustomAsset(MOCK_ACCOUNT_ID, pinnedToken); @@ -1684,7 +1684,7 @@ describe('AssetsController', () => { await withController( { - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await controller.getAssets([createMockInternalAccount()], { @@ -1722,7 +1722,7 @@ describe('AssetsController', () => { await withController( { - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await controller.getAssets([createMockInternalAccount()], { @@ -1769,7 +1769,7 @@ describe('AssetsController', () => { await withController( { queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await flushPromises(); @@ -1792,6 +1792,51 @@ describe('AssetsController', () => { ); }); + it('forwards bypassServerCache on Accounts API v6 force updates', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + await withController( + { + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: true }, + }, + async ({ controller }) => { + await flushPromises(); + + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + bypassServerCache: true, + }); + + expect(fetchV6MultiAccountBalances).toHaveBeenCalledWith( + expect.any(Array), + undefined, + expect.objectContaining({ bypassServerCache: true }), + ); + }, + ); + }); + describe('pipeline splitting', () => { it('returns from getAssets before background pipelines complete', async () => { // Spy on handleAssetsUpdate to count how many times state is written. @@ -1911,7 +1956,7 @@ describe('AssetsController', () => { await withController( { queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { await flushPromises(); @@ -2442,7 +2487,7 @@ describe('AssetsController', () => { }; await withController( - { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + { remoteFeatureFlags: { assetsAccountsApiV6: true } }, async ({ controller }) => { rpcMiddlewareGetter.mockClear(); @@ -2483,7 +2528,7 @@ describe('AssetsController', () => { }; await withController( - { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + { remoteFeatureFlags: { assetsAccountsApiV6: true } }, async ({ controller }) => { rpcMiddlewareGetter.mockClear(); @@ -2714,7 +2759,7 @@ describe('AssetsController', () => { .mockResolvedValue(undefined); await withController( - { remoteFeatureFlags: { assetsAccountsApiV6: { value: true } } }, + { remoteFeatureFlags: { assetsAccountsApiV6: true } }, async ({ controller }) => { await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); @@ -3896,7 +3941,7 @@ describe('AssetsController', () => { { clientControllerState: { isUiOpen: true }, queryApiClient, - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, state: { assetsBalance: { [MOCK_ACCOUNT_ID]: { diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 2d2020e50fd..94f788b0dad 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1746,6 +1746,7 @@ export class AssetsController extends BaseController< * @param requestOptions.assetTypes - Asset types to fetch. * @param requestOptions.dataTypes - Data types to fetch. * @param requestOptions.forceUpdate - Always `true` to bypass caches. + * @param requestOptions.bypassServerCache - Also bypass server-side HTTP caches. * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. * @returns The v5 data request. */ @@ -1756,6 +1757,7 @@ export class AssetsController extends BaseController< assetTypes: AssetType[]; dataTypes: DataType[]; forceUpdate: true; + bypassServerCache?: boolean; assetsForPriceUpdate?: Caip19AssetId[]; }, ): DataRequest { @@ -1780,6 +1782,7 @@ export class AssetsController extends BaseController< * @param requestOptions.assetTypes - Asset types to fetch. * @param requestOptions.dataTypes - Data types to fetch. * @param requestOptions.forceUpdate - Always `true` to bypass caches. + * @param requestOptions.bypassServerCache - Also bypass server-side HTTP caches. * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. * @param requestOptions.customAssetsOverride - Pinned assets to use instead of the stored custom assets. * @returns The v6 data request. @@ -1791,6 +1794,7 @@ export class AssetsController extends BaseController< assetTypes: AssetType[]; dataTypes: DataType[]; forceUpdate: true; + bypassServerCache?: boolean; assetsForPriceUpdate?: Caip19AssetId[]; customAssetsOverride?: Caip19AssetId[]; }, @@ -1820,6 +1824,7 @@ export class AssetsController extends BaseController< assetTypes: requestOptions.assetTypes, dataTypes: requestOptions.dataTypes, forceUpdate: requestOptions.forceUpdate, + bypassServerCache: requestOptions.bypassServerCache, assetsForPriceUpdate: requestOptions.assetsForPriceUpdate, customAssets: customAssets.length > 0 ? customAssets : undefined, excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined, @@ -2627,23 +2632,20 @@ export class AssetsController extends BaseController< * Whether Accounts API v6 (and the v6 custom-asset path) is enabled. * Injected into AccountsApiDataSource and RpcFallbackMiddleware. * + * `RemoteFeatureFlagController` resolves a threshold-scoped flag to the + * selected group's `value`, so processed state is a boolean. + * * @returns `true` when the v6 remote flag is on. */ #isBalanceV6Enabled(): boolean { - return true; - // try { - // const { remoteFeatureFlags } = this.messenger.call( - // 'RemoteFeatureFlagController:getState', - // ); - // const flag = remoteFeatureFlags?.assetsAccountsApiV6; - // return ( - // typeof flag === 'object' && - // flag !== null && - // Boolean((flag as { value?: unknown }).value) - // ); - // } catch { - // return false; - // } + try { + const { remoteFeatureFlags } = this.messenger.call( + 'RemoteFeatureFlagController:getState', + ); + return remoteFeatureFlags?.assetsAccountsApiV6 === true; + } catch { + return false; + } } // ============================================================================ diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts index bddff6e62d6..932abb0dc28 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts @@ -37,12 +37,7 @@ const MOCK_ADDRESS = '0x1234567890123456789012345678901234567890'; function isBalanceV6EnabledFromFlags( remoteFeatureFlags: Record, ): boolean { - const flag = remoteFeatureFlags.assetsAccountsApiV6; - return ( - typeof flag === 'object' && - flag !== null && - Boolean((flag as { value?: unknown }).value) - ); + return remoteFeatureFlags.assetsAccountsApiV6 === true; } type MockApiClient = { @@ -674,7 +669,7 @@ describe('AccountsApiDataSource', () => { it('claims EVM assets on assigned chains when the v6 flag is enabled', async () => { const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); expect( @@ -694,7 +689,7 @@ describe('AccountsApiDataSource', () => { it('claims nothing when the v6 flag is disabled (v5 has no includeAssetIds support)', async () => { const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: false } }, + remoteFeatureFlags: { assetsAccountsApiV6: false }, }); expect( @@ -725,7 +720,7 @@ describe('AccountsApiDataSource', () => { it('uses the v6 endpoint when the assetsAccountsApiV6 remote flag is enabled', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); await controller.fetch(createDataRequest()); @@ -742,7 +737,7 @@ describe('AccountsApiDataSource', () => { it('sets updateMode to full for v6 fetches', async () => { const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const response = await controller.fetch(createDataRequest()); @@ -754,24 +749,7 @@ describe('AccountsApiDataSource', () => { it('uses the v5 endpoint when the assetsAccountsApiV6 remote flag is disabled', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: false } }, - }); - - await controller.fetch(createDataRequest()); - - expect( - apiClient.accounts.fetchV5MultiAccountBalances, - ).toHaveBeenCalledTimes(1); - expect( - apiClient.accounts.fetchV6MultiAccountBalances, - ).not.toHaveBeenCalled(); - - controller.destroy(); - }); - - it('uses the v5 endpoint when the flag is a plain boolean instead of the JSON value shape', async () => { - const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: true }, + remoteFeatureFlags: { assetsAccountsApiV6: false }, }); await controller.fetch(createDataRequest()); @@ -788,7 +766,7 @@ describe('AccountsApiDataSource', () => { it('calls the v6 endpoint without extra params when enabled', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); await controller.fetch(createDataRequest()); @@ -809,7 +787,7 @@ describe('AccountsApiDataSource', () => { it('reads the flag per fetch so it can revert to v5 at runtime', async () => { const remoteFeatureFlags = { - assetsAccountsApiV6: { value: true }, + assetsAccountsApiV6: true, }; const { controller, apiClient } = await setupController({ remoteFeatureFlags, @@ -820,7 +798,7 @@ describe('AccountsApiDataSource', () => { apiClient.accounts.fetchV6MultiAccountBalances, ).toHaveBeenCalledTimes(1); - remoteFeatureFlags.assetsAccountsApiV6 = { value: false }; + remoteFeatureFlags.assetsAccountsApiV6 = false; await controller.fetch(createDataRequest()); expect( apiClient.accounts.fetchV5MultiAccountBalances, @@ -832,7 +810,7 @@ describe('AccountsApiDataSource', () => { it('processes v6 token balances grouped by account', async () => { const accountId = `eip155:1:${MOCK_ADDRESS}`; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, v6Balances: [ createMockV6BalanceItem( accountId, @@ -857,7 +835,7 @@ describe('AccountsApiDataSource', () => { it('ignores v6 defi positions', async () => { const accountId = `eip155:1:${MOCK_ADDRESS}`; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, v6Balances: [ createMockV6BalanceItem( accountId, @@ -889,7 +867,7 @@ describe('AccountsApiDataSource', () => { const stakingAssetId = 'eip155:1/erc20:0x4fef9d741011476750a243ac70b9789a63dd47df'; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, v6Balances: [ createMockV6BalanceItem( accountId, @@ -919,7 +897,7 @@ describe('AccountsApiDataSource', () => { it('marks v6 unprocessed networks as errors', async () => { const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, unprocessedNetworks: ['eip155:1'], }); @@ -934,7 +912,7 @@ describe('AccountsApiDataSource', () => { it('handles v6 API errors', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); apiClient.accounts.fetchV6MultiAccountBalances.mockRejectedValueOnce( @@ -950,7 +928,7 @@ describe('AccountsApiDataSource', () => { it('passes EVM custom assets on requested chains to v6 as includeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const customToken = @@ -973,7 +951,7 @@ describe('AccountsApiDataSource', () => { it('omits custom assets that are not on a requested chain from includeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); // Custom asset on Polygon while only Mainnet is being fetched. @@ -1003,7 +981,7 @@ describe('AccountsApiDataSource', () => { 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, unprocessedIncludeAssetIds: [customToken], }); @@ -1024,7 +1002,7 @@ describe('AccountsApiDataSource', () => { 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, unprocessedIncludeAssetIds: [ customToken, 'not-a-caip-asset' as Caip19AssetId, @@ -1042,7 +1020,7 @@ describe('AccountsApiDataSource', () => { it('skips non-EVM and malformed custom assets when building includeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const solanaToken = @@ -1070,7 +1048,7 @@ describe('AccountsApiDataSource', () => { 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, unprocessedIncludeAssetIds: ['not-a-caip-asset'], }); @@ -1088,7 +1066,7 @@ describe('AccountsApiDataSource', () => { it('passes EVM hidden assets on requested chains to v6 as excludeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const hiddenToken = @@ -1111,7 +1089,7 @@ describe('AccountsApiDataSource', () => { it('omits hidden assets that are not on a requested chain from excludeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); // Hidden asset on Polygon while only Mainnet is being fetched. @@ -1138,7 +1116,7 @@ describe('AccountsApiDataSource', () => { it('skips non-EVM and malformed hidden assets when building excludeAssetIds', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const solanaToken = @@ -1163,7 +1141,7 @@ describe('AccountsApiDataSource', () => { it('lets a hidden asset win when it also appears in the pinned list', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const token = @@ -1190,7 +1168,7 @@ describe('AccountsApiDataSource', () => { it('sends both includeAssetIds and excludeAssetIds when pins and hidden assets differ', async () => { const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const pinned = @@ -1295,7 +1273,7 @@ describe('AccountsApiDataSource', () => { it('middleware forwards full updateMode from v6 fetches', async () => { const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: { value: true } }, + remoteFeatureFlags: { assetsAccountsApiV6: true }, }); const next = jest.fn().mockResolvedValue(undefined); From f67925e6c45efa1a8bf6a07e05f4cd54d06a9179 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Wed, 16 Sep 2026 23:05:15 +0200 Subject: [PATCH 05/25] update test threshold --- packages/assets-controller/jest.config.cjs | 2 +- .../src/data-sources/AccountActivityDataSource.ts | 3 --- .../src/data-sources/evm-rpc-services/types/state.ts | 5 ++--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/assets-controller/jest.config.cjs b/packages/assets-controller/jest.config.cjs index 795b4b105c0..1782d6db10e 100644 --- a/packages/assets-controller/jest.config.cjs +++ b/packages/assets-controller/jest.config.cjs @@ -18,7 +18,7 @@ module.exports = merge(baseConfig, { coverageThreshold: { global: { branches: 82.17, - functions: 90.06, + functions: 90.01, lines: 90.56, statements: 90.56, }, diff --git a/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts b/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts index 80230efa359..99516d72690 100644 --- a/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountActivityDataSource.ts @@ -251,9 +251,6 @@ export class AccountActivityDataSource extends AbstractDataSource< // SUBSCRIBE / UNSUBSCRIBE // ============================================================================ - // Pins on active chains are claimed via the inherited `claimCustomAssets`: - // the activity stream pushes all activity for the address, pins included. - /** * AADS is event-driven and chain-agnostic: it never participates in the * controller's subscribe/unsubscribe handoff. Incoming `balanceUpdated` diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts index 85f99ef54e2..af114458eaf 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/types/state.ts @@ -55,9 +55,8 @@ export type AssetsBalanceState = { assetsBalance: Record>; /** * User-added custom assets per account: accountId -> CAIP-19 asset IDs. - * Not read by asset-scoped polls (`BalancePollingInput.assetIds`). Regular - * polls still include these so v5 supplemental/`customAssetsOnly` refreshes - * pins that have no `assetsBalance` row yet. + * Used to ensure RPC polling refreshes custom assets even when they have + * no entry in `assetsBalance` yet (e.g. zero balance, first fetch failed). */ customAssets?: Record; }; From 4d37b2f76b0c9fa5454f484f7abeb4c3b8ec0d52 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 21 Sep 2026 14:48:50 +0200 Subject: [PATCH 06/25] clean code --- .../docs/architecture/v1/CHANGES.md | 204 ++++++++---------- .../src/AssetsController.test.ts | 61 ++++++ .../assets-controller/src/AssetsController.ts | 31 +-- ...c-spam-token-filtering.integration.test.ts | 2 +- .../pipeline/buildFastFetchSources.test.ts | 30 ++- .../src/pipeline/buildFastFetchSources.ts | 13 +- 6 files changed, 206 insertions(+), 135 deletions(-) diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 71dd3253075..385b9d0aeb6 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -1,161 +1,143 @@ -# AssetsController 15.0.0 - architecture change and AccountsAPI v5/v6 paths +# AssetsController 15.0.0 - Accounts API v5 and v6 side by side -This branch keeps the previous balance behavior and the new Accounts API v6 -behavior side by side behind the `assetsAccountsApiV6` remote feature flag. +## What this change is about -- Flag off, missing, or unreadable: use the legacy **v5** path. -- `assetsAccountsApiV6: true`: use the new **v6** path. +The AssetsController collects token balances, metadata, and prices for every +account and chain, and stores the result for the UI to render. -The flag is read only in `AssetsController.#isBalanceV6Enabled()` and injected -into `AccountsApiDataSource`, `RpcFallbackMiddleware`, and `RpcDataSource`. +This release adds support for a new version of the Accounts API (**v6**) while +keeping the current one (**v5**) fully intact. Which one runs is decided at +runtime by the `assetsAccountsApiV6` remote feature flag: -## Architectural change +- flag off, missing, or unreadable: the legacy **v5** path (today's production + behavior) +- `assetsAccountsApiV6: true`: the new **v6** path -The controller now has two explicit orchestration paths instead of one mixed -flow with many conditional branches: +The flag is read in exactly one place, `AssetsController.#isBalanceV6Enabled()`, +and passed down to `AccountsApiDataSource`, `RpcFallbackMiddleware`, and +`RpcDataSource`. -- **v5 path** preserves the old behavior so rollout-off matches existing - production semantics. -- **v6 path** isolates the new behavior so rollout-on can be evaluated and the - old path can be deleted cleanly later. +## Vocabulary used below -This split exists in three main places: +| Term | Meaning | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Pinned asset (custom asset) | A token the user added manually (Manage Token flow). We always want to fetch it, even when the API does not return it on its own. | +| Hidden asset | A token the user chose to hide, so it should not be fetched or shown. | +| Data source | Where balances come from: the Accounts API, RPC nodes, a Snap, or staking. | +| Middleware | A step that enriches or repairs data after it is fetched (token detection, prices, metadata, RPC fallback). | +| Fast lane | The first, quick round of fetching. Its result is written to state right away so the UI can render. | +| Background lane | The slower sources that run afterwards; their results are merged in. | +| Update mode `merge` vs `full` | `merge` keeps assets already in state that the response did not mention. `full` replaces the whole slice the source covers. | +| Basic functionality | The user setting that turns off network calls to MetaMask services. | -1. Force-update orchestration from `getAssets(..., { forceUpdate: true })` -2. Balance subscription setup -3. Balance update enrichment and merge +## Why there are two paths -## Path overview +Rather than scattering flag checks through one shared flow, the controller now +has two named flows: + +- the **v5 path** preserves the old behavior exactly, so turning the flag off + matches production +- the **v6 path** isolates the new behavior, so it can be evaluated on its own + and the old path can later be deleted in one clean sweep + +The split shows up in three places: a forced refresh, setting up live updates, +and handling an update once it arrives. ```mermaid -flowchart TD - A[getAssets forceUpdate / subscribe / handleAssetsUpdate] --> F{assetsAccountsApiV6} - F -->|false| V5[v5 path] - F -->|true| V6[v6 path] +flowchart LR + A["Refresh · Subscribe · Incoming update"] --> F{assetsAccountsApiV6} + F -->|false| V5["v5 path"] + F -->|true| V6["v6 path"] ``` -## Force-update path +## 1. Forced refresh -Both paths share the same broad shape: run a fast lane, commit state, then run -the slower background fetch. +Triggered by `getAssets(..., { forceUpdate: true })`. Both paths have the same +shape: build a request, run the fast lane, write state, then run the background +lane and merge its results. ```mermaid flowchart TB - subgraph request ["Request shaping"] - R5["v5 request
every pinned asset for requested accounts
unscoped
no excludeAssetIds"] - R6["v6 request
pins scoped to requested chains
optional customAssets override
hidden assets as excludeAssetIds"] - end - subgraph v5fast ["v5 fast lane"] direction TB - V5P["Accounts API v5 || Staked"] - V5G[CustomAssetGraduation] - V5F[RpcFallback] - V5D[Detection] - V5T["Token || Price"] - V5P --> V5G --> V5F --> V5D --> V5T - V5S["State update
merge + replaceCoveredChainBalances"] - V5T --> V5S + V5P["Accounts API v5 + Staked"] --> V5G[CustomAssetGraduation] --> V5F[RpcFallback] --> V5D[Detection] --> V5T["Token + Price"] --> V5S["State: merge, replaceCoveredChainBalances"] end - subgraph v6fast ["v6 fast lane"] direction TB - V6P["Accounts API v6 || Staked
includeAssetIds / excludeAssetIds"] - V6F["RpcFallback
errored chains + unprocessedIncludeAssetIds"] - V6D[Detection] - V6T["Token || Price"] - V6P --> V6F --> V6D --> V6T - V6S["State update
Accounts API drives updateMode full"] - V6T --> V6S + V6P["Accounts API v6 + Staked
includeAssetIds / excludeAssetIds"] --> V6F["RpcFallback
errored chains + unprocessedIncludeAssetIds"] --> V6D[Detection] --> V6T["Token + Price"] --> V6S["State: full where the Accounts API has coverage"] end - - subgraph bg ["Background lane"] - B1["Snap || RPC"] - B2[Detection] - B3["Token || Price"] - B4["State update
merge"] - B1 --> B2 --> B3 --> B4 + subgraph bg ["Background lane (same for both)"] + direction TB + B1["Snap + RPC"] --> B2[Detection] --> B3["Token + Price"] --> B4["State: merge"] end - - R5 --> v5fast --> bg - R6 --> v6fast --> bg + v5fast --> bg + v6fast --> bg ``` -When basic functionality is off, both fast lanes reduce to `Staked -> Detection` -and the background lane is RPC only. +The requests differ as well: -## Subscribe path +- **v5** asks for every pinned asset of the requested accounts, without scoping + them to chains, and does not mention hidden assets. +- **v6** scopes pinned assets to the requested chains (or uses the explicit + `customAssets` override) and sends hidden assets as `excludeAssetIds`. -```mermaid -flowchart LR - subgraph v5sub ["v5 subscribe"] - S5A[Chain handoff by source priority] - S5B["RPC customAssetsOnly supplement
for pins on chains another source owns"] - S5A --> S5B - end +When basic functionality is off, both fast lanes shrink to +`Staked -> Detection`. The background lane is RPC only in both paths. - subgraph v6sub ["v6 subscribe"] - S6A[Chain handoff by source priority] - S6B["claimCustomAssets per source
Accounts API claims EVM pins as includeAssetIds"] - S6C["RPC asset-scoped polls
for unclaimed claimed pins"] - S6A --> S6B --> S6C - end -``` +## 2. Setting up live updates (subscribe) -`AccountsApiDataSource.claimCustomAssets()` returns `[]` on v5. +Both paths first hand each chain to the data source with the highest priority +for it. They differ in how pinned assets on those chains are covered: -## Update enrichment path +- **v5** adds a separate RPC poll (`customAssetsOnly`) for pins that sit on a + chain another source already owns. +- **v6** asks each source which pins it can take, via `claimCustomAssets()` - + the Accounts API claims EVM pins and sends them as `includeAssetIds`. RPC then + polls only the pins nobody claimed. -```mermaid -flowchart TB - subgraph v5update ["v5 handleAssetsUpdate"] - U5G["CustomAssetGraduation
for Accounts API / AccountActivity"] - U5D[Detection] - U5T["Token || Price"] - U5S["State update
merge; honor replaceCoveredChainBalances"] - U5G --> U5D --> U5T --> U5S - end +On v5, `AccountsApiDataSource.claimCustomAssets()` simply returns `[]`. - subgraph v6update ["v6 handleAssetsUpdate"] - U6F["RpcFallback when basic on
errored chains + unprocessedCustomAssets"] - U6D[Detection] - U6T["Token || Price"] - U6S["State update
full when Accounts API marks it full"] - U6F --> U6D --> U6T --> U6S - end -``` +## 3. Handling an incoming update + +- **v5** (`#handleAssetsUpdateV5`): CustomAssetGraduation (for the Accounts API + and AccountActivity) -> Detection -> Token + Price -> state written with + `merge`, honoring `replaceCoveredChainBalances`. +- **v6** (`#handleAssetsUpdateV6`): RpcFallback when basic functionality is on + (for errored chains and `unprocessedCustomAssets`) -> Detection -> Token + + Price -> state written as `full` when the Accounts API marks it so. -v5 does not run `RpcFallbackMiddleware` on this subscribe/update path. v6 does -not run `CustomAssetGraduationMiddleware`. +In other words: v5 never runs `RpcFallbackMiddleware` here, and v6 never runs +`CustomAssetGraduationMiddleware` at all. -## Behavioral intent +## Behavior differences at a glance -| Concern | v5 | v6 | -| ------------------------- | ------------------------------------------ | ------------------------------------------------- | -| Accounts API endpoint | `fetchV5MultiAccountBalances` | `fetchV6MultiAccountBalances` | -| Accounts API update mode | `merge` | `full` | -| Covered-chain merge | Preserve old behavior | Replace covered chain slice | -| Custom asset preservation | Keep custom + staked pins in v5 merge path | Keep `unprocessedCustomAssets` until RPC resolves | -| Hidden assets | Not sent to v5 endpoint | Sent as `excludeAssetIds` | -| RPC token fetch | Flat `request.customAssets` on the chain | Only pins owned by that account | +| Concern | v5 | v6 | +| ------------------------- | ------------------------------------------- | ------------------------------------------------------ | +| Accounts API endpoint | `fetchV5MultiAccountBalances` | `fetchV6MultiAccountBalances` | +| Accounts API update mode | `merge` | `full` | +| Covered-chain merge | Preserve old behavior | Replace the covered chain slice | +| Pinned asset preservation | Keep custom + staked pins in the merge path | Keep `unprocessedCustomAssets` until RPC resolves them | +| Hidden assets | Not sent to the endpoint | Sent as `excludeAssetIds` | +| RPC token fetch | Flat `request.customAssets` for the chain | Only the pins owned by that account | -## Code map +## Where the code lives -| Concern | v5 implementation | v6 implementation | +| Concern | v5 | v6 | | ------------------------ | ----------------------------------------- | ----------------------------------------- | | Force-update request | `#buildForceUpdateRequestV5` | `#buildForceUpdateRequestV6` | | Force-update pipeline | `#forceUpdateAssetsV5`, `#runFastFetchV5` | `#forceUpdateAssetsV6`, `#runFastFetchV6` | +| Fast lane composition | `buildFastFetchSources` (graduation on) | `buildFastFetchSources` (graduation off) | | Subscribe | `#subscribeAssetsBalanceV5` | `#subscribeAssetsBalanceV6` | -| Update enrichment | `#handleAssetsUpdateV5` | `#handleAssetsUpdateV6` | +| Update handling | `#handleAssetsUpdateV5` | `#handleAssetsUpdateV6` | | Balance merge | `mergeAccountBalancesV5` | `mergeAccountBalancesV6` | | Accounts API fetch | `#fetchV5Balances` | `#fetchV6Balances` | | RPC fallback | `#recoverV5` | `#recoverV6` | | RPC custom ERC-20 append | `#appendRequestCustomErc20sV5` | `#appendRequestCustomErc20sV6` | -## Deletion plan after rollout +## Deleting v5 after rollout Once v6 is accepted as the only behavior: -1. Remove the v5 methods and `!this.#isBalanceV6Enabled()` branches. -2. Keep the v6 methods as the only orchestration path. -3. Remove transitional docs/tables that compare v5 and v6. +1. Remove the v5 methods and every `!this.#isBalanceV6Enabled()` branch. +2. Keep the v6 methods as the single orchestration path. +3. Remove this document's v5/v6 comparison tables. diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index fd4a0d624f4..7e0bc8e52d9 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -2016,6 +2016,67 @@ describe('AssetsController', () => { tokenMiddlewareGetter.mockRestore(); priceMiddlewareGetter.mockRestore(); }); + + it('does not call Accounts API v6 on force update when isBasicFunctionality is false', async () => { + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); + const tokenMiddlewareGetter = jest.spyOn( + TokenDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) as unknown as jest.SpyInstance; + const priceMiddlewareGetter = jest.spyOn( + PriceDataSource.prototype, + 'assetsMiddleware', + // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. + 'get', + ) as unknown as jest.SpyInstance; + + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; + + await withController( + { + isBasicFunctionality: () => false, + queryApiClient, + remoteFeatureFlags: { assetsAccountsApiV6: true }, + }, + async ({ controller }) => { + tokenMiddlewareGetter.mockClear(); + priceMiddlewareGetter.mockClear(); + fetchV6MultiAccountBalances.mockClear(); + + await controller.getAssets([createMockInternalAccount()], { + chainIds: ['eip155:1'], + forceUpdate: true, + }); + await flushPromises(); + }, + ); + + expect(fetchV6MultiAccountBalances).not.toHaveBeenCalled(); + expect(tokenMiddlewareGetter).not.toHaveBeenCalled(); + expect(priceMiddlewareGetter).not.toHaveBeenCalled(); + + tokenMiddlewareGetter.mockRestore(); + priceMiddlewareGetter.mockRestore(); + }); }); it('filters by chainIds option', async () => { diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 281c00c4262..d448283112a 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1734,7 +1734,7 @@ export class AssetsController extends BaseController< tokenDataSource: this.#tokenDataSource, priceDataSource: this.#priceDataSource, }, - { isBasicFunctionality }, + { isBasicFunctionality, includeCustomAssetGraduation: true }, ); const fastResponse = await this.#runFastFetchV5({ @@ -1768,20 +1768,21 @@ export class AssetsController extends BaseController< pipelineTrace?: TraceCallback; }): Promise { const isBasicFunctionality = this.#isBasicFunctionality(); - const fastSources = isBasicFunctionality - ? [ - createParallelBalanceMiddleware([ - this.#accountsApiDataSource, - this.#stakedBalanceDataSource, - ]), - this.#rpcFallbackMiddleware, - this.#detectionMiddleware, - createParallelMiddleware([ - this.#tokenDataSource, - this.#priceDataSource, - ]), - ] - : [this.#stakedBalanceDataSource, this.#detectionMiddleware]; + const fastSources = buildFastFetchSources( + { + accountsApiDataSource: this.#accountsApiDataSource, + stakedBalanceDataSource: this.#stakedBalanceDataSource, + customAssetGraduationMiddleware: this.#customAssetGraduationMiddleware, + rpcFallbackMiddleware: this.#rpcFallbackMiddleware, + detectionMiddleware: this.#detectionMiddleware, + tokenDataSource: this.#tokenDataSource, + priceDataSource: this.#priceDataSource, + }, + { + isBasicFunctionality, + includeCustomAssetGraduation: false, + }, + ); const fastResponse = await this.#runFastFetchV6({ accounts, diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts index e1e0f6b1a87..b9a0093ab41 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts @@ -165,7 +165,7 @@ async function runPipeline( tokenDataSource, priceDataSource, }, - { isBasicFunctionality: true }, + { isBasicFunctionality: true, includeCustomAssetGraduation: true }, ); const { response } = await executeAssetsPipeline({ diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts index 632cc6c616f..05477263fc0 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts @@ -37,6 +37,7 @@ describe('buildFastFetchSources', () => { title: 'orders the lane balances → graduation → rpc fallback → detection → enrichment', isBasicFunctionality: true, + includeCustomAssetGraduation: true, expected: [ 'ParallelBalanceMiddleware', 'CustomAssetGraduationMiddleware', @@ -45,17 +46,34 @@ describe('buildFastFetchSources', () => { 'ParallelMiddleware', ], }, + { + title: 'drops graduation from the lane', + isBasicFunctionality: true, + // The Accounts API v6 lane resolves pins through `includeAssetIds`. + includeCustomAssetGraduation: false, + expected: [ + 'ParallelBalanceMiddleware', + 'RpcFallbackMiddleware', + 'DetectionMiddleware', + 'ParallelMiddleware', + ], + }, { title: 'runs only the staking balance and detection', isBasicFunctionality: false, + includeCustomAssetGraduation: true, // No network-backed source may run when the user has opted out. expected: ['StakedBalanceDataSource', 'DetectionMiddleware'], }, - ])('$title', ({ isBasicFunctionality, expected }) => { - const sources = buildFastFetchSources(buildSources(), { - isBasicFunctionality, - }); + ])( + '$title', + ({ isBasicFunctionality, includeCustomAssetGraduation, expected }) => { + const sources = buildFastFetchSources(buildSources(), { + isBasicFunctionality, + includeCustomAssetGraduation, + }); - expect(sources.map((source) => source.getName())).toStrictEqual(expected); - }); + expect(sources.map((source) => source.getName())).toStrictEqual(expected); + }, + ); }); diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.ts index b81db374d23..dc70075d189 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.ts @@ -40,11 +40,18 @@ export type FastFetchSources = { * @param options - Lane options. * @param options.isBasicFunctionality - When false, only the staking balance and * detection run; no network-backed source is used. + * @param options.includeCustomAssetGraduation - `true` on the Accounts API v5 + * lane. The v6 lane never graduates custom assets: it sends the pins to the + * endpoint as `includeAssetIds` and keeps the ones it could not resolve as + * `unprocessedCustomAssets`. * @returns The composed source list, ready for `executeAssetsPipeline`. */ export function buildFastFetchSources( sources: FastFetchSources, - options: { isBasicFunctionality: boolean }, + options: { + isBasicFunctionality: boolean; + includeCustomAssetGraduation: boolean; + }, ): AssetsDataSource[] { const { accountsApiDataSource, @@ -65,7 +72,9 @@ export function buildFastFetchSources( accountsApiDataSource, stakedBalanceDataSource, ]), - customAssetGraduationMiddleware, + ...(options.includeCustomAssetGraduation + ? [customAssetGraduationMiddleware] + : []), rpcFallbackMiddleware, detectionMiddleware, createParallelMiddleware([tokenDataSource, priceDataSource]), From 7626b4f6935f5a513755d74b4a694aa9b72fea99 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 21 Sep 2026 15:48:34 +0200 Subject: [PATCH 07/25] clean code --- .../docs/architecture/v1/CHANGES.md | 5 +- .../src/data-sources/RpcDataSource.test.ts | 187 +++--------------- .../src/data-sources/RpcDataSource.ts | 117 +---------- 3 files changed, 34 insertions(+), 275 deletions(-) diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 385b9d0aeb6..1d163127ddf 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -92,8 +92,9 @@ for it. They differ in how pinned assets on those chains are covered: - **v5** adds a separate RPC poll (`customAssetsOnly`) for pins that sit on a chain another source already owns. - **v6** asks each source which pins it can take, via `claimCustomAssets()` - - the Accounts API claims EVM pins and sends them as `includeAssetIds`. RPC then - polls only the pins nobody claimed. + the Accounts API claims EVM pins and sends them as `includeAssetIds`. RPC + claims leftover EVM pins only on chains assigned to it. Pins the API could + not resolve are recovered by `RpcFallbackMiddleware` on that update. On v5, `AccountsApiDataSource.claimCustomAssets()` simply returns `[]`. diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 8186dce9d80..1b0862aacfa 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -1495,55 +1495,7 @@ describe('RpcDataSource', () => { }); }); - it('starts an asset-scoped poll (explicit assetIds) for pinned assets on chains not assigned to RPC', async () => { - const balanceStartSpy = jest.spyOn( - BalanceFetcher.prototype, - 'startPolling', - ); - const detectionStartSpy = jest.spyOn( - TokenDetector.prototype, - 'startPolling', - ); - const customAssetId = - `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; - - await withController( - { - options: { isBalanceV6Enabled: (): boolean => true }, - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - // The chain axis assigned nothing to RPC (chainIds is empty — e.g. - // the websocket claimed the chain), but RPC claimed the pinned asset. - await controller.subscribe({ - request: createDataRequest({ - chainIds: [], - customAssets: [customAssetId], - }), - subscriptionId: 'test-sub', - isUpdate: false, - onAssetsUpdate: jest.fn(), - }); - - expect(balanceStartSpy).toHaveBeenCalledWith({ - chainId: MOCK_CHAIN_ID_HEX, - accountId: MOCK_ACCOUNT_ID, - accountAddress: MOCK_ADDRESS, - assetIds: [customAssetId], - }); - // No regular chain coverage — detection must not run. - expect(detectionStartSpy).not.toHaveBeenCalled(); - await controller.unsubscribe('test-sub'); - }, - ); - }); - - it('does not start an asset-scoped poll for accounts without pinned assets on the supplemental chain', async () => { + it('does not poll when no chains are assigned even if customAssets are present', async () => { const balanceStartSpy = jest.spyOn( BalanceFetcher.prototype, 'startPolling', @@ -1551,104 +1503,20 @@ describe('RpcDataSource', () => { const customAssetId = `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; - await withController( - { - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { 'other-account-id': [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - await controller.subscribe({ - request: createDataRequest({ - chainIds: [], - customAssets: [customAssetId], - }), - subscriptionId: 'test-sub', - isUpdate: false, - onAssetsUpdate: jest.fn(), - }); - - expect(balanceStartSpy).not.toHaveBeenCalled(); - await controller.unsubscribe('test-sub'); - }, - ); - }); - - it('does not start an asset-scoped poll for chains already covered by regular polling', async () => { - const balanceStartSpy = jest.spyOn( - BalanceFetcher.prototype, - 'startPolling', - ); - const customAssetId = - `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; - - await withController( - { - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - // Chain assigned to RPC: the regular poll already includes - // state.customAssets, so no supplemental poll must start. - await controller.subscribe({ - request: createDataRequest({ - customAssets: [customAssetId], - }), - subscriptionId: 'test-sub', - isUpdate: false, - onAssetsUpdate: jest.fn(), - }); - - expect(balanceStartSpy).toHaveBeenCalledTimes(1); - expect(balanceStartSpy).toHaveBeenCalledWith({ - chainId: MOCK_CHAIN_ID_HEX, - accountId: MOCK_ACCOUNT_ID, - accountAddress: MOCK_ADDRESS, - }); - await controller.unsubscribe('test-sub'); - }, - ); - }); - - it('unsubscribe stops asset-scoped polling', async () => { - const balanceStopSpy = jest.spyOn( - BalanceFetcher.prototype, - 'stopPollingByPollingToken', - ); - const customAssetId = - `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; + await withController(async ({ controller }) => { + await controller.subscribe({ + request: createDataRequest({ + chainIds: [], + customAssets: [customAssetId], + }), + subscriptionId: 'test-sub', + isUpdate: false, + onAssetsUpdate: jest.fn(), + }); - await withController( - { - options: { isBalanceV6Enabled: (): boolean => true }, - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { [MOCK_ACCOUNT_ID]: [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - await controller.subscribe({ - request: createDataRequest({ - chainIds: [], - customAssets: [customAssetId], - }), - subscriptionId: 'test-sub', - isUpdate: false, - onAssetsUpdate: jest.fn(), - }); - await controller.unsubscribe('test-sub'); - expect(balanceStopSpy).toHaveBeenCalled(); - }, - ); + expect(balanceStartSpy).not.toHaveBeenCalled(); + await controller.unsubscribe('test-sub'); + }); }); }); @@ -1660,15 +1528,21 @@ describe('RpcDataSource', () => { const nonEvmAsset = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFW' as Caip19AssetId; - it('claims EVM assets on active chains even when the chain was not assigned to RPC', async () => { + it('claims EVM assets only on chains assigned to RPC', async () => { await withController(async ({ controller }) => { expect( controller.claimCustomAssets([availableChainAsset], []), + ).toStrictEqual([]); + expect( + controller.claimCustomAssets( + [availableChainAsset], + [MOCK_CHAIN_ID_CAIP], + ), ).toStrictEqual([availableChainAsset]); }); }); - it('does not claim assets on chains RPC cannot serve, non-EVM assets, or malformed IDs', async () => { + it('does not claim assets on unassigned chains, non-EVM assets, or malformed IDs', async () => { await withController(async ({ controller }) => { expect( controller.claimCustomAssets( @@ -1677,25 +1551,8 @@ describe('RpcDataSource', () => { nonEvmAsset, 'not-a-caip-asset' as Caip19AssetId, ], - [], - ), - ).toStrictEqual([]); - }); - }); - - it('falls back to assigned chains when network state has not been applied yet', async () => { - const networkState = createMockNetworkState(NetworkStatus.Degraded); - await withController({ networkState }, async ({ controller }) => { - // eslint-disable-next-line n/no-sync -- testing sync API used by AssetsController - expect(controller.getActiveChainsSync()).toStrictEqual([]); - expect( - controller.claimCustomAssets( - [availableChainAsset], [MOCK_CHAIN_ID_CAIP], ), - ).toStrictEqual([availableChainAsset]); - expect( - controller.claimCustomAssets([availableChainAsset], []), ).toStrictEqual([]); }); }); diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index 2b9cd12d752..926dbcd193e 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -146,7 +146,7 @@ export type RpcDataSourceOptions = { /** Returns the asset type ('native' | 'erc20' | 'spl') for the given CAIP-19 asset ID */ getAssetType: (assetId: Caip19AssetId) => 'native' | 'erc20' | 'spl'; /** - * Whether Accounts API v6 pin filtering and asset-scoped polls are enabled. + * Whether Accounts API v6 pin filtering is enabled. * Injected by AssetsController; defaults to v5 when omitted. */ isBalanceV6Enabled?: () => boolean; @@ -1380,29 +1380,26 @@ export class RpcDataSource extends AbstractDataSource< } /** - * RPC is the terminal claimer on the asset axis: it claims every EVM pin it - * has a provider for, even on chains claimed by higher-priority sources. - * Pins outside the regular RPC assignment get an asset-scoped poll (see - * `subscribe`). + * Claim leftover EVM pins on chains assigned to RPC. Pins on chains owned by + * Account Activity or the Accounts API stay with those sources (v6 + * `includeAssetIds` / websocket). Unresolved pins on those chains are + * recovered by `RpcFallbackMiddleware`, not a second RPC subscription. * * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. - * @param assignedChains - Chains assigned to RPC; availability fallback - * before network state is applied. + * @param assignedChains - Chains assigned to RPC in this handoff. * @returns The claimed subset of `customAssets`. */ claimCustomAssets( customAssets: Caip19AssetId[], assignedChains: ChainId[], ): Caip19AssetId[] { - const available = new Set( - this.#activeChains.length > 0 ? this.#activeChains : assignedChains, - ); + const assigned = new Set(assignedChains); return customAssets.filter((assetId) => { try { const parsed = parseCaipAssetType(assetId); return ( parsed.chain.namespace === KnownCaipNamespace.Eip155 && - available.has(parsed.chainId) + assigned.has(parsed.chainId) ); } catch { return false; @@ -1433,23 +1430,15 @@ export class RpcDataSource extends AbstractDataSource< ) : request.chainIds; - // Pins claimed on chains outside the regular RPC assignment get an - // asset-scoped poll below. - const supplementalChains = this.#getSupplementalCustomAssetChains( - request, - chainsToSubscribe, - ); - log('Subscribe requested', { subscriptionId, isUpdate, accounts: request.accountsWithSupportedChains.map((a) => a.account.id), chainsToSubscribe, - supplementalChains, activeChainsFallback: this.#activeChains.length === 0, }); - if (chainsToSubscribe.length === 0 && supplementalChains.length === 0) { + if (chainsToSubscribe.length === 0) { log('No active chains to subscribe'); return; } @@ -1518,53 +1507,6 @@ export class RpcDataSource extends AbstractDataSource< } } - // Asset-scoped polls on chains another source claimed: poll ONLY the - // claimed pins to avoid double-polling tracked balances. Pin changes - // re-run the subscription pass, which rebuilds these polls. - // Asset-scoped polls on chains another source claimed (v6 only). - if (this.#isBalanceV6Enabled() && supplementalChains.length > 0) { - const supplemental = new Set(supplementalChains); - const claimedAssetsByChain = new Map(); - for (const assetId of request.customAssets ?? []) { - try { - const { chainId } = parseCaipAssetType(assetId); - if (supplemental.has(chainId)) { - const chainAssets = claimedAssetsByChain.get(chainId) ?? []; - chainAssets.push(assetId); - claimedAssetsByChain.set(chainId, chainAssets); - } - } catch { - // Skip unparseable asset IDs - } - } - // request.customAssets is flat; ownership comes from controller state. - const customAssetsByAccount = this.#getCustomAssetsByAccount(); - for (const { account } of request.accountsWithSupportedChains) { - const pinned = new Set(customAssetsByAccount[account.id] ?? []); - if (pinned.size === 0) { - continue; - } - for (const [chainId, chainAssets] of claimedAssetsByChain) { - // Sorted so the polling input (the dedupe key) is deterministic. - const assetIds = chainAssets - .filter((assetId) => pinned.has(assetId)) - .sort(); - if (assetIds.length === 0) { - continue; - } - const balanceInput: BalancePollingInput = { - chainId: caipChainIdToHex(chainId), - accountId: account.id, - accountAddress: account.address as Address, - assetIds, - }; - balancePollingTokens.push( - this.#balanceFetcher.startPolling(balanceInput), - ); - } - } - } - // Store subscription data const accounts = request.accountsWithSupportedChains.map( (entry) => entry.account, @@ -1608,47 +1550,6 @@ export class RpcDataSource extends AbstractDataSource< } } - /** - * Chains needing a supplemental asset-scoped poll: chains of pins not - * covered by the regular RPC polling. Only EVM chains RPC can serve; - * malformed IDs are skipped. - * - * @param request - The subscription's data request (carries `customAssets`). - * @param chainsToSubscribe - Chains covered by the regular polling loop. - * @returns Chains requiring an asset-scoped poll. - */ - #getSupplementalCustomAssetChains( - request: DataRequest, - chainsToSubscribe: ChainId[], - ): ChainId[] { - if (!request.customAssets || request.customAssets.length === 0) { - return []; - } - - const covered = new Set(chainsToSubscribe); - const chains = new Set(); - - for (const assetId of request.customAssets) { - let parsed: ReturnType; - try { - parsed = parseCaipAssetType(assetId); - } catch { - continue; - } - const { chainId } = parsed; - if ( - parsed.chain.namespace === KnownCaipNamespace.Eip155 && - !covered.has(chainId) && - (this.#activeChains.length === 0 || - this.#activeChains.includes(chainId)) - ) { - chains.add(chainId); - } - } - - return [...chains]; - } - /** * v5: include every `request.customAssets` ERC-20 on this chain (main behavior). * Delete with the rest of the v5 path when `assetsAccountsApiV6` is the default. From e1ee0030c910a6afb0f9920ce59573d76ecb893c Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 21 Sep 2026 16:14:22 +0200 Subject: [PATCH 08/25] clean code --- packages/assets-controller/CHANGELOG.md | 2 +- .../docs/architecture/v1/CHANGES.md | 6 +- .../assets-controller/src/AssetsController.ts | 1 - .../src/data-sources/RpcDataSource.test.ts | 88 --------------- .../src/data-sources/RpcDataSource.ts | 104 ++---------------- 5 files changed, 13 insertions(+), 188 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 59710e15960..51a665eff2a 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add an optional `customAssets` option to `AssetsController.getAssets`, used only when `assetsAccountsApiV6` is enabled. It overrides which pinned assets are attached to the fetch (sent as `includeAssetIds` and to RPC). When the flag is off, `getAssets` still attaches every pin of the requested accounts, unscoped, matching the previous v5 request ([#9651](https://github.com/MetaMask/core/pull/9651)) -- Add an optional `isBalanceV6Enabled` getter to `AccountsApiDataSource` and `RpcDataSource`. `AssetsController` injects it so the `assetsAccountsApiV6` flag is read in one place; both default to v5 when the getter is omitted([#9651](https://github.com/MetaMask/core/pull/9651)) +- Add an optional `isBalanceV6Enabled` getter to `AccountsApiDataSource`. `AssetsController` injects it so the `assetsAccountsApiV6` flag is read in one place; it defaults to v5 when the getter is omitted ([#9651](https://github.com/MetaMask/core/pull/9651)) ### Changed diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 1d163127ddf..9dd1644f431 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -14,8 +14,7 @@ runtime by the `assetsAccountsApiV6` remote feature flag: - `assetsAccountsApiV6: true`: the new **v6** path The flag is read in exactly one place, `AssetsController.#isBalanceV6Enabled()`, -and passed down to `AccountsApiDataSource`, `RpcFallbackMiddleware`, and -`RpcDataSource`. +and passed down to `AccountsApiDataSource` and `RpcFallbackMiddleware`. ## Vocabulary used below @@ -119,7 +118,7 @@ In other words: v5 never runs `RpcFallbackMiddleware` here, and v6 never runs | Covered-chain merge | Preserve old behavior | Replace the covered chain slice | | Pinned asset preservation | Keep custom + staked pins in the merge path | Keep `unprocessedCustomAssets` until RPC resolves them | | Hidden assets | Not sent to the endpoint | Sent as `excludeAssetIds` | -| RPC token fetch | Flat `request.customAssets` for the chain | Only the pins owned by that account | +| RPC token fetch | Flat `request.customAssets` for the chain | Same: one EVM account per request | ## Where the code lives @@ -133,7 +132,6 @@ In other words: v5 never runs `RpcFallbackMiddleware` here, and v6 never runs | Balance merge | `mergeAccountBalancesV5` | `mergeAccountBalancesV6` | | Accounts API fetch | `#fetchV5Balances` | `#fetchV6Balances` | | RPC fallback | `#recoverV5` | `#recoverV6` | -| RPC custom ERC-20 append | `#appendRequestCustomErc20sV5` | `#appendRequestCustomErc20sV6` | ## Deleting v5 after rollout diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index d448283112a..569d4169b51 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1046,7 +1046,6 @@ export class AssetsController extends BaseController< isOnboarded: rpcConfig.isOnboarded ?? isOnboarded, getAssetType: (assetId: Caip19AssetId): 'native' | 'erc20' | 'spl' => this.#getAssetType(assetId), - isBalanceV6Enabled: (): boolean => this.#isBalanceV6Enabled(), }); this.#stakedBalanceDataSource = new StakedBalanceDataSource({ messenger: this.messenger, diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 1b0862aacfa..5c49872fed6 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -918,94 +918,6 @@ describe('RpcDataSource', () => { fetchSpy.mockRestore(); }); - - it('does not fetch custom assets the fetching account has not pinned', async () => { - const customAssetId = - 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; - - const fetchSpy = jest - .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') - .mockResolvedValue(createBalanceFetchResult()); - - await withController( - { - options: { isBalanceV6Enabled: (): boolean => true }, - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { 'other-account-id': [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - const request = createDataRequest({ - customAssets: [customAssetId], - }); - await controller.fetch(request); - - // The request's customAssets list is flat; ownership comes from - // state. MOCK_ACCOUNT_ID did not pin the asset, so its fetch - // carries only the native entry. - expect(fetchSpy).toHaveBeenCalledWith( - MOCK_CHAIN_ID_HEX, - MOCK_ACCOUNT_ID, - MOCK_ADDRESS, - [ - { - assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, - address: '0x0000000000000000000000000000000000000000', - }, - ], - ); - }, - ); - - fetchSpy.mockRestore(); - }); - - it('fetches request custom assets on v5 even when another account owns the pin', async () => { - const customAssetId = - 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; - - const fetchSpy = jest - .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') - .mockResolvedValue(createBalanceFetchResult()); - - await withController( - { - actionHandlerOverrides: { - 'AssetsController:getState': () => ({ - ...getDefaultAssetsControllerState(), - customAssets: { 'other-account-id': [customAssetId] }, - }), - }, - }, - async ({ controller }) => { - const request = createDataRequest({ - customAssets: [customAssetId], - }); - await controller.fetch(request); - - expect(fetchSpy).toHaveBeenCalledWith( - MOCK_CHAIN_ID_HEX, - MOCK_ACCOUNT_ID, - MOCK_ADDRESS, - [ - { - assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, - address: '0x0000000000000000000000000000000000000000', - }, - expect.objectContaining({ - assetId: customAssetId, - address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', - }), - ], - ); - }, - ); - - fetchSpy.mockRestore(); - }); }); describe('detectTokens', () => { diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index 926dbcd193e..626cfd55174 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -145,11 +145,6 @@ export type RpcDataSourceOptions = { /** Returns the asset type ('native' | 'erc20' | 'spl') for the given CAIP-19 asset ID */ getAssetType: (assetId: Caip19AssetId) => 'native' | 'erc20' | 'spl'; - /** - * Whether Accounts API v6 pin filtering is enabled. - * Injected by AssetsController; defaults to v5 when omitted. - */ - isBalanceV6Enabled?: () => boolean; }; /** @@ -229,8 +224,6 @@ export class RpcDataSource extends AbstractDataSource< readonly #isOnboarded: () => boolean; - readonly #isBalanceV6Enabled: () => boolean; - /** Currently active chains */ #activeChains: ChainId[] = []; @@ -268,8 +261,6 @@ export class RpcDataSource extends AbstractDataSource< this.#useExternalService = options.useExternalService ?? ((): boolean => true); this.#isOnboarded = options.isOnboarded ?? ((): boolean => true); - this.#isBalanceV6Enabled = - options.isBalanceV6Enabled ?? ((): boolean => false); const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL; const detectionInterval = @@ -1024,12 +1015,6 @@ export class RpcDataSource extends AbstractDataSource< const assetsInfo: Record = {}; const failedChains: ChainId[] = []; - // request.customAssets is flat. v6 resolves pin ownership from state so - // each account only fetches its own pins; v5 applies the flat list as on main. - const customAssetsByAccount = request.customAssets - ? this.#getCustomAssetsByAccount() - : {}; - // Fetch balances for each account and its supported chains (pre-computed in request) for (const { account, @@ -1056,25 +1041,12 @@ export class RpcDataSource extends AbstractDataSource< } if (request.customAssets) { - const existingMetadata = this.#getExistingAssetsMetadata(); - if (this.#isBalanceV6Enabled()) { - this.#appendRequestCustomErc20sV6( - assetsToFetch, - request.customAssets, - chainId, - existingMetadata, - new Set( - (customAssetsByAccount[accountId] ?? []).map(normalizeAssetId), - ), - ); - } else { - this.#appendRequestCustomErc20sV5( - assetsToFetch, - request.customAssets, - chainId, - existingMetadata, - ); - } + this.#appendRequestCustomErc20s( + assetsToFetch, + request.customAssets, + chainId, + this.#getExistingAssetsMetadata(), + ); } try { @@ -1551,15 +1523,16 @@ export class RpcDataSource extends AbstractDataSource< } /** - * v5: include every `request.customAssets` ERC-20 on this chain (main behavior). - * Delete with the rest of the v5 path when `assetsAccountsApiV6` is the default. + * Include every `request.customAssets` ERC-20 on this chain. The selected + * group has at most one EVM account, so there is no per-account ownership + * filter. * * @param assetsToFetch - Native/custom entries for this account-chain fetch. * @param customAssets - Flat pin list from the data request. * @param chainId - Chain being fetched. * @param existingMetadata - Metadata already in AssetsController state. */ - #appendRequestCustomErc20sV5( + #appendRequestCustomErc20s( assetsToFetch: AssetFetchEntry[], customAssets: Caip19AssetId[], chainId: ChainId, @@ -1589,63 +1562,6 @@ export class RpcDataSource extends AbstractDataSource< } } - /** - * v6: include only pins owned by this account on this chain. - * - * @param assetsToFetch - Native/custom entries for this account-chain fetch. - * @param customAssets - Flat pin list from the data request. - * @param chainId - Chain being fetched. - * @param existingMetadata - Metadata already in AssetsController state. - * @param pinnedByAccount - This account's pins from controller state. - */ - #appendRequestCustomErc20sV6( - assetsToFetch: AssetFetchEntry[], - customAssets: Caip19AssetId[], - chainId: ChainId, - existingMetadata: Record, - pinnedByAccount: Set, - ): void { - for (const assetId of customAssets) { - try { - const parsed = parseCaipAssetType(assetId); - const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`; - const normalizedId = normalizeAssetId(assetId); - if ( - assetChainId === chainId && - pinnedByAccount.has(normalizedId) && - this.#getAssetType(assetId) === 'erc20' - ) { - const tokenAddress = parsed.assetReference.toLowerCase() as Address; - const decimals = existingMetadata[normalizedId]?.decimals; - - assetsToFetch.push({ - assetId, - address: tokenAddress, - decimals, - }); - } - } catch { - // Skip unparseable asset IDs - } - } - } - - /** - * Get per-account pins from AssetsController state — the request's flat - * `customAssets` list carries no account association. - * - * @returns Record of account ID to pinned CAIP-19 asset IDs. - */ - #getCustomAssetsByAccount(): Record { - try { - const state = this.#messenger.call('AssetsController:getState'); - return (state.customAssets ?? {}) as Record; - } catch (error) { - log('Failed to get customAssets from state', { error }); - return {}; - } - } - /** * Get existing assets metadata from AssetsController state. * Used to include metadata for ERC20 tokens when returning balance updates. From 9d2a9bdf5ba1b932967fb0d4162f0cedb32688a2 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 21 Sep 2026 16:42:00 +0200 Subject: [PATCH 09/25] clean code --- packages/assets-controller/CHANGELOG.md | 8 +- .../docs/architecture/v1/CHANGES.md | 38 +- .../src/AssetsController.test.ts | 66 ++-- .../assets-controller/src/AssetsController.ts | 262 ++------------ .../data-sources/AbstractDataSource.test.ts | 39 +- .../src/data-sources/AbstractDataSource.ts | 28 -- .../AccountsApiDataSource.test.ts | 332 ++++++++++-------- .../src/data-sources/AccountsApiDataSource.ts | 161 ++++----- .../src/data-sources/RpcDataSource.test.ts | 38 -- .../src/data-sources/RpcDataSource.ts | 28 -- .../services/BalanceFetcher.test.ts | 34 +- .../services/BalanceFetcher.ts | 53 +-- ...c-spam-token-filtering.integration.test.ts | 3 +- packages/assets-controller/src/types.ts | 11 +- .../assets-controller/tsconfig.build.json | 2 +- 15 files changed, 395 insertions(+), 708 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index 51a665eff2a..a0661e5a91e 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -10,14 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add an optional `customAssets` option to `AssetsController.getAssets`, used only when `assetsAccountsApiV6` is enabled. It overrides which pinned assets are attached to the fetch (sent as `includeAssetIds` and to RPC). When the flag is off, `getAssets` still attaches every pin of the requested accounts, unscoped, matching the previous v5 request ([#9651](https://github.com/MetaMask/core/pull/9651)) -- Add an optional `isBalanceV6Enabled` getter to `AccountsApiDataSource`. `AssetsController` injects it so the `assetsAccountsApiV6` flag is read in one place; it defaults to v5 when the getter is omitted ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Add a required `getAssetsState` getter to `AccountsApiDataSource`. `AssetsController` injects `() => this.state` so v6 include/exclude and token-detection filtering read controller state without copying it onto subscribe or fetch requests ### Changed -- **BREAKING:** Remove the unused `updateMode` option from `AssetsController.getAssets`. Apply mode comes only from `DataResponse.updateMode` (data sources). Remove `'update'` from `AssetsUpdateMode` — it was never produced; use `'merge'` to overlay or `'full'` to replace a covered chain slice ([#9651](https://github.com/MetaMask/core/pull/9651)) -- A hide now wins over a pin when an asset is both in `customAssets` and marked `hidden` in `assetPreferences`. Hidden pins are dropped from the `customAssets`/`includeAssetIds` attached to `getAssets` force updates, balance subscriptions, and the supplemental RPC custom-asset poll, so a hidden token is no longer fetched. `hideAsset` still leaves the pin in `customAssets` to record that the token was imported, and `unhideAsset` restores it on the next subscription ([#9651](https://github.com/MetaMask/core/pull/9651)) +- **BREAKING:** Remove `excludeAssetIds` from `DataRequest`. Accounts API v6 reads hidden assets from controller state (`assetPreferences`) when building the v6 `excludeAssetIds` query param. `request.customAssets` remains only as a scoped fetch override (`getAssets({ customAssets })`, `addCustomAsset`, RPC fallback), not a copy of every pin. +- When `assetsAccountsApiV6` is enabled, a hide wins over a pin: Accounts API v6 sends hidden assets as `excludeAssetIds` and skips them in `includeAssetIds`. The v5 path is unchanged (`getAssets` force updates and the RPC custom-asset supplement still attach every pin, including hidden ones). `hideAsset` still leaves the pin in `customAssets` to record that the token was imported ([#9651](https://github.com/MetaMask/core/pull/9651)) - When `assetsAccountsApiV6` is enabled, Accounts API fetch and middleware report `updateMode: 'full'` so assets on chains in the snapshot (including custom assets returned via `includeAssetIds`) are replaced; pins left in `unprocessedCustomAssets` after RPC fallback keep their prior balances. The v5 path keeps `updateMode: 'merge'` with `replaceCoveredChainBalances` so custom assets are preserved ([#9651](https://github.com/MetaMask/core/pull/9651)) -- When `assetsAccountsApiV6` is enabled, the `getAssets` force-update fast pipeline runs `RpcFallbackMiddleware` after Accounts API so `unprocessedIncludeAssetIds` are recovered on RPC before state is committed (same as poll enrichment). Chains that still have unresolved pins are also kept on the slow RPC lane. +- When `assetsAccountsApiV6` is enabled, Accounts API does not filter unknown tokens via `tokenDetectionEnabled`. The v6 snapshot is applied in full; v5 still drops tokens not already in state when detection is off - Bump `@metamask/transaction-controller` from `^70.0.1` to `^70.1.0` ([#10262](https://github.com/MetaMask/core/pull/10262)) ### Fixed diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 9dd1644f431..9aa306e5b54 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -77,8 +77,10 @@ The requests differ as well: - **v5** asks for every pinned asset of the requested accounts, without scoping them to chains, and does not mention hidden assets. -- **v6** scopes pinned assets to the requested chains (or uses the explicit - `customAssets` override) and sends hidden assets as `excludeAssetIds`. +- **v6** does not copy pins or hides onto the request. The Accounts API + reads them from state (`includeAssetIds` / `excludeAssetIds`). A + `customAssets` override still scopes a one-shot fetch (new pin, RPC + fallback). When basic functionality is off, both fast lanes shrink to `Staked -> Detection`. The background lane is RPC only in both paths. @@ -90,12 +92,11 @@ for it. They differ in how pinned assets on those chains are covered: - **v5** adds a separate RPC poll (`customAssetsOnly`) for pins that sit on a chain another source already owns. -- **v6** asks each source which pins it can take, via `claimCustomAssets()` - - the Accounts API claims EVM pins and sends them as `includeAssetIds`. RPC - claims leftover EVM pins only on chains assigned to it. Pins the API could - not resolve are recovered by `RpcFallbackMiddleware` on that update. - -On v5, `AccountsApiDataSource.claimCustomAssets()` simply returns `[]`. +- **v6** subscribe only assigns accounts and chains. The Accounts API reads + pins and hides from state and sends them as `includeAssetIds` / + `excludeAssetIds`. RPC polls `customAssets` from state on its assigned + chains. Account Activity ignores pins/hides. Pins the API could not resolve + are recovered by `RpcFallbackMiddleware` on that update. ## 3. Handling an incoming update @@ -118,20 +119,21 @@ In other words: v5 never runs `RpcFallbackMiddleware` here, and v6 never runs | Covered-chain merge | Preserve old behavior | Replace the covered chain slice | | Pinned asset preservation | Keep custom + staked pins in the merge path | Keep `unprocessedCustomAssets` until RPC resolves them | | Hidden assets | Not sent to the endpoint | Sent as `excludeAssetIds` | +| Token detection filter | Drop unknown tokens when detection is off | Not applied; v6 snapshot is kept in full | | RPC token fetch | Flat `request.customAssets` for the chain | Same: one EVM account per request | ## Where the code lives -| Concern | v5 | v6 | -| ------------------------ | ----------------------------------------- | ----------------------------------------- | -| Force-update request | `#buildForceUpdateRequestV5` | `#buildForceUpdateRequestV6` | -| Force-update pipeline | `#forceUpdateAssetsV5`, `#runFastFetchV5` | `#forceUpdateAssetsV6`, `#runFastFetchV6` | -| Fast lane composition | `buildFastFetchSources` (graduation on) | `buildFastFetchSources` (graduation off) | -| Subscribe | `#subscribeAssetsBalanceV5` | `#subscribeAssetsBalanceV6` | -| Update handling | `#handleAssetsUpdateV5` | `#handleAssetsUpdateV6` | -| Balance merge | `mergeAccountBalancesV5` | `mergeAccountBalancesV6` | -| Accounts API fetch | `#fetchV5Balances` | `#fetchV6Balances` | -| RPC fallback | `#recoverV5` | `#recoverV6` | +| Concern | v5 | v6 | +| --------------------- | ------------------------------------------ | --------------------------------------------------------------------- | +| Force-update request | `#buildForceUpdateRequestV5` | `#buildForceUpdateRequestV6` | +| Force-update pipeline | `#forceUpdateAssetsV5`, `#runFastFetchV5` | `#forceUpdateAssetsV6`, `#runFastFetchV6` | +| Fast lane composition | `buildFastFetchSources` (graduation on) | `buildFastFetchSources` (graduation off) | +| Subscribe | `#subscribeAssetsBalance` + RPC supplement | `#subscribeAssetsBalance`; Accounts API v6 include/exclude from state | +| Update handling | `#handleAssetsUpdateV5` | `#handleAssetsUpdateV6` | +| Balance merge | `mergeAccountBalancesV5` | `mergeAccountBalancesV6` | +| Accounts API fetch | `#fetchV5Balances` | `#fetchV6Balances` | +| RPC fallback | `#recoverV5` | `#recoverV6` | ## Deleting v5 after rollout diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index 7e0bc8e52d9..6e464bd582d 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -1573,35 +1573,44 @@ describe('AssetsController', () => { middlewareGetter.mockRestore(); }); - it('scopes the custom assets on the request to the requested chains', async () => { + it('includes only pins on the requested chains as includeAssetIds', async () => { const mainnetToken = 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const polygonToken = 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; - const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; - const accountsApiMiddleware = jest.fn(async (ctx, next) => { - capturedCustomAssets.push(ctx.request.customAssets); - return next(ctx); + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], }); - const middlewareGetter = jest - .spyOn( - AccountsApiDataSource.prototype, - 'assetsMiddleware', - // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. - 'get', - ) - .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1, 137], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; await withController( { + queryApiClient, remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { + await flushPromises(); + await controller.addCustomAsset(MOCK_ACCOUNT_ID, mainnetToken); await controller.addCustomAsset(MOCK_ACCOUNT_ID, polygonToken); - capturedCustomAssets.length = 0; + fetchV6MultiAccountBalances.mockClear(); await controller.getAssets([createMockInternalAccount()], { chainIds: ['eip155:1'], forceUpdate: true, @@ -1609,14 +1618,11 @@ describe('AssetsController', () => { }, ); - // Pins on chains outside the request are dropped when the request is - // built — every data source would only ignore them at fetch time. - expect(capturedCustomAssets.length).toBeGreaterThan(0); - for (const customAssets of capturedCustomAssets) { - expect(customAssets).toStrictEqual([mainnetToken]); + expect(fetchV6MultiAccountBalances).toHaveBeenCalled(); + for (const [, params] of fetchV6MultiAccountBalances.mock.calls) { + expect(params?.includeAssetIds ?? []).toContain(mainnetToken); + expect(params?.includeAssetIds ?? []).not.toContain(polygonToken); } - - middlewareGetter.mockRestore(); }); it('uses the customAssets option instead of state-pinned assets when provided', async () => { @@ -2806,9 +2812,9 @@ describe('AssetsController', () => { }); describe('two-axis subscription handoff (chains + custom assets)', () => { - it('claims pinned assets on account-activity-claimed chains instead of letting them fall through', async () => { - // Account activity claims eip155:1; its stream covers pins, so they - // stay with its subscription instead of falling through to a poller. + it('does not attach pinned assets to the account-activity subscription', async () => { + // Account activity owns eip155:1. Pins stay in controller state; the + // websocket does not take include/exclude lists. jest .spyOn(AccountActivityDataSource.prototype, 'getActiveChainsSync') .mockReturnValue(['eip155:1' as ChainId]); @@ -2826,17 +2832,15 @@ describe('AssetsController', () => { const wsRequest = wsSubscribeSpy.mock.calls.at(-1)?.[0].request; expect(wsRequest?.chainIds).toStrictEqual(['eip155:1']); - expect(wsRequest?.customAssets).toStrictEqual([MOCK_ASSET_ID]); + expect(wsRequest?.customAssets).toBeUndefined(); - // Nothing was left for lower-priority sources to claim. expect(rpcSubscribeSpy).not.toHaveBeenCalled(); }, ); }); - it('does not create an RPC subscription for pinned assets no source can claim', async () => { - // Account activity is not active on the pin's chain, so the pin falls - // through the whole handoff... + it('does not create an RPC subscription for pinned assets on unassigned chains', async () => { + // Account activity is not active on the pin's chain... jest .spyOn(AccountActivityDataSource.prototype, 'getActiveChainsSync') .mockReturnValue([]); @@ -2849,7 +2853,7 @@ describe('AssetsController', () => { await withController(async ({ controller }) => { // ...and RPC has no provider for the chain (no networks configured in - // the mocked NetworkController), so its real claim returns nothing. + // the mocked NetworkController), so it is assigned no chains. await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); expect(rpcSubscribeSpy).not.toHaveBeenCalled(); @@ -3269,7 +3273,7 @@ describe('AssetsController', () => { it('keeps default tracked assets at zero when a full update omits them', async () => { // Regression: a force refresh (e.g. "Refresh list") replaces the chain // slice, so mUSD was dropped from the token list for accounts holding - // none. Default tracked assets are re-asserted just like natives. + // none. mergeAccountBalancesV6 re-asserts default tracked assets. const initialState: Partial = { assetsBalance: { [MOCK_ACCOUNT_ID]: { diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 569d4169b51..1c6a58de179 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -607,8 +607,8 @@ function normalizeResponse(response: DataResponse): DataResponse { function mergeAccountBalancesV5( previousBalances: Record, accountBalances: Record, - customAssetIds: Caip19AssetId[] = [], - replaceCoveredChains = false, + customAssetIds: Caip19AssetId[], + replaceCoveredChains: boolean, ): Record { if (!replaceCoveredChains) { return { ...previousBalances, ...accountBalances }; @@ -629,8 +629,8 @@ function mergeAccountBalancesV5( for (const customId of customAssetIds) { if (!Object.prototype.hasOwnProperty.call(next, customId)) { - const previous = previousBalances[customId]; - next[customId] = previous ?? ({ amount: '0' } as AssetBalance); + const prev = previousBalances[customId]; + next[customId] = prev ?? ({ amount: '0' } as AssetBalance); } } @@ -692,6 +692,21 @@ function mergeAccountBalancesV6( next[assetId] = balance; } } + // Default tracked assets (mUSD) are controller-managed and must render at + // zero when the account holds none. The v6 snapshot omits them in that + // case, so re-assert them on covered chains — otherwise a force refresh + // would drop them from the token list. + // TODO: seed defaults as visible pins in `customAssets` instead (skip if + // already present or `assetPreferences[assetId].hidden`), then drop this + // merge special case. + for (const chainId of coveredChains) { + for (const assetId of getDefaultTrackedAssetsForChain(chainId as ChainId)) { + if (!Object.prototype.hasOwnProperty.call(next, assetId)) { + next[assetId] = + previousBalances[assetId] ?? ({ amount: '0' } as AssetBalance); + } + } + } return next; } @@ -1024,6 +1039,7 @@ export class AssetsController extends BaseController< onActiveChainsUpdated: this.#onActiveChainsUpdated, ...accountsApiDataSourceConfig, isBalanceV6Enabled: (): boolean => this.#isBalanceV6Enabled(), + getAssetsState: (): AssetsControllerStateInternal => this.state, }); this.#snapDataSource = new SnapDataSource({ messenger: this.messenger, @@ -1643,7 +1659,7 @@ export class AssetsController extends BaseController< ): DataRequest { const customAssets: Caip19AssetId[] = []; for (const account of accounts) { - customAssets.push(...this.#getVisibleCustomAssets(account.id)); + customAssets.push(...this.getCustomAssets(account.id)); } return this.#buildDataRequest(accounts, chainIds, { @@ -1653,18 +1669,18 @@ export class AssetsController extends BaseController< } /** - * v6 force-update request: chain-scoped pins (or `customAssets` override) - * plus hidden assets as `excludeAssetIds`. + * v6 force-update request. Pins and hides are read from state by the + * Accounts API unless `customAssetsOverride` scopes this fetch. * * @param accounts - Accounts in this fetch. * @param chainIds - Chains in this fetch. - * @param requestOptions - Shared force-update request fields and optional pin override. + * @param requestOptions - Shared force-update request fields and optional pin scope. * @param requestOptions.assetTypes - Asset types to fetch. * @param requestOptions.dataTypes - Data types to fetch. * @param requestOptions.forceUpdate - Always `true` to bypass caches. * @param requestOptions.bypassServerCache - Also bypass server-side HTTP caches. * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. - * @param requestOptions.customAssetsOverride - Pinned assets to use instead of the stored custom assets. + * @param requestOptions.customAssetsOverride - When set, fetch only these pins. * @returns The v6 data request. */ #buildForceUpdateRequestV6( @@ -1680,11 +1696,8 @@ export class AssetsController extends BaseController< }, ): DataRequest { const requestedChains = new Set(chainIds); - const candidateCustomAssets = - requestOptions.customAssetsOverride ?? - accounts.flatMap((account) => this.getCustomAssets(account.id)); const customAssetsSet = new Set(); - for (const assetId of candidateCustomAssets) { + for (const assetId of requestOptions.customAssetsOverride ?? []) { try { const normalizedAssetId = normalizeAssetId(assetId); if ( @@ -1698,7 +1711,6 @@ export class AssetsController extends BaseController< } } const customAssets = [...customAssetsSet]; - const hiddenAssets = this.#getHiddenAssetIds(); return this.#buildDataRequest(accounts, chainIds, { assetTypes: requestOptions.assetTypes, @@ -1707,7 +1719,6 @@ export class AssetsController extends BaseController< bypassServerCache: requestOptions.bypassServerCache, assetsForPriceUpdate: requestOptions.assetsForPriceUpdate, customAssets: customAssets.length > 0 ? customAssets : undefined, - excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined, }); } @@ -2473,39 +2484,6 @@ export class AssetsController extends BaseController< this.#subscribeAssets(); } - /** - * Collect globally hidden asset IDs (from `assetPreferences`), forwarded on - * data requests as `excludeAssetIds`. - * - * @returns The CAIP-19 asset IDs the user has hidden. - */ - #getHiddenAssetIds(): Caip19AssetId[] { - const hidden: Caip19AssetId[] = []; - for (const [assetId, prefs] of Object.entries( - this.state.assetPreferences, - )) { - if (prefs.hidden) { - hidden.push(assetId as Caip19AssetId); - } - } - return hidden; - } - - /** - * An account's pins minus the ones the user has hidden. A hide wins over a - * pin on requests, so a hidden asset is never fetched; the pin stays in - * `customAssets` to record that the token was imported, and unhiding it - * restores the pin on the next subscription. - * - * @param accountId - The account whose pins should be collected. - * @returns The account's pinned asset IDs that are not hidden. - */ - #getVisibleCustomAssets(accountId: AccountId): Caip19AssetId[] { - return this.getCustomAssets(accountId).filter( - (assetId) => !this.state.assetPreferences[assetId]?.hidden, - ); - } - /** * Whether Accounts API v6 (and the v6 custom-asset path) is enabled. * Injected into AccountsApiDataSource and RpcFallbackMiddleware. @@ -2804,25 +2782,6 @@ export class AssetsController extends BaseController< ); } - /** - * Returns the controller-managed default tracked asset IDs (e.g. mUSD) for - * the chains this account supports (account scopes ∩ enabled chains). - * Non-EVM accounts resolve to an empty list because every chain in the - * defaults registry is EVM today. - * - * @param account - The account (scopes determine which chains apply). - * @returns Array of default tracked asset IDs across the supported chains. - */ - #getDefaultTrackedAssetIdsForAccount( - account: InternalAccount, - ): Caip19AssetId[] { - const ids: Caip19AssetId[] = []; - for (const chainId of this.#getEnabledChainsForAccount(account)) { - ids.push(...getDefaultTrackedAssetsForChain(chainId)); - } - return ids; - } - /** * Chains for the post-commit slow pipeline (Snap + RPC). Excludes chains the * fast Accounts API path already handled without error so stale RPC data cannot @@ -3106,22 +3065,6 @@ export class AssetsController extends BaseController< } } - // Default tracked assets (mUSD) are controller-managed and, like - // natives, must render at zero balance. An authoritative - // chain-slice replace omits them whenever the account holds none, - // so re-assert them here — otherwise a force refresh (e.g. the - // "Refresh list" action) would drop mUSD from the token list. - const defaultTrackedAssetIdsForAccount = account - ? this.#getDefaultTrackedAssetIdsForAccount(account) - : []; - for (const defaultAssetId of defaultTrackedAssetIdsForAccount) { - if ( - !Object.prototype.hasOwnProperty.call(effective, defaultAssetId) - ) { - effective[defaultAssetId] = { amount: '0' } as AssetBalance; - } - } - for (const [assetId, balance] of Object.entries(effective)) { const previousBalance = previousBalances[ assetId as Caip19AssetId @@ -3152,9 +3095,8 @@ export class AssetsController extends BaseController< oldAmount === undefined && newAmount === '0' && (nativeAssetIdsForAccount.includes(assetId as Caip19AssetId) || - defaultTrackedAssetIdsForAccount.includes( - assetId as Caip19AssetId, - )); + getDefaultAssetMetadata(assetId as Caip19AssetId) !== + undefined); if (oldAmount !== newAmount && !isNewSeededZero) { changedBalances.push({ accountId, @@ -3533,12 +3475,11 @@ export class AssetsController extends BaseController< * Strategy to minimize data source calls: * 1. Collect all chains to subscribe based on enabled networks * 2. Map chains to accounts based on their scopes - * 3. Split by data source (priority order) - each source gets ONE - * subscription, claiming chains AND pinned assets (`claimCustomAssets`); - * unclaimed assets fall through to lower-priority sources. - * - * This ensures we make minimal subscriptions to each data source while covering - * all accounts, chains, and pinned assets. + * 3. Split by data source (priority order) — each source gets one + * subscription for the chains it was assigned (accounts + chains only). + * v6 sources read pins/hides from state themselves (Accounts API sends + * `includeAssetIds` / `excludeAssetIds`). v5 uses a separate RPC + * `customAssetsOnly` supplement for pins on chains another source owns. * * @param accounts - Accounts to subscribe balance updates for. * @param chainIds - Chain IDs to subscribe for. @@ -3549,18 +3490,6 @@ export class AssetsController extends BaseController< accounts: InternalAccount[], chainIds: ChainId[], options?: { skipInitialFetch?: boolean }, - ): void { - if (this.#isBalanceV6Enabled()) { - this.#subscribeAssetsBalanceV6(accounts, chainIds, options); - return; - } - this.#subscribeAssetsBalanceV5(accounts, chainIds, options); - } - - #subscribeAssetsBalanceV5( - accounts: InternalAccount[], - chainIds: ChainId[], - options?: { skipInitialFetch?: boolean }, ): void { const chainToAccounts = this.#buildChainToAccountsMap( accounts, @@ -3609,104 +3538,12 @@ export class AssetsController extends BaseController< } } - this.#subscribeRpcCustomAssetsSupplement( - accounts, - chainToAccounts, - rpcAssignedChains, - ); - } - - #subscribeAssetsBalanceV6( - accounts: InternalAccount[], - chainIds: ChainId[], - options?: { skipInitialFetch?: boolean }, - ): void { - const chainToAccounts = this.#buildChainToAccountsMap( - accounts, - new Set(chainIds), - ); - const remainingChains = new Set(chainToAccounts.keys()); - const remainingCustomAssets = new Set(); - for (const account of accounts) { - for (const assetId of this.#getVisibleCustomAssets(account.id)) { - try { - if (remainingChains.has(parseCaipAssetType(assetId).chainId)) { - remainingCustomAssets.add(assetId); - } - } catch { - // Skip unparseable asset IDs - } - } - } - const balanceDataSources = this.#isBasicFunctionality() - ? this.#allBalanceDataSources - : [this.#rpcDataSource]; - - for (const source of balanceDataSources) { - const availableChains = new Set(source.getActiveChainsSync()); - const assignedChains: ChainId[] = []; - - for (const chainId of remainingChains) { - if (availableChains.has(chainId)) { - assignedChains.push(chainId); - remainingChains.delete(chainId); - } - } - - const claimedAssets = source.claimCustomAssets( - [...remainingCustomAssets], - assignedChains, + if (!this.#isBalanceV6Enabled()) { + this.#subscribeRpcCustomAssetsSupplement( + accounts, + chainToAccounts, + rpcAssignedChains, ); - for (const assetId of claimedAssets) { - remainingCustomAssets.delete(assetId); - } - if (assignedChains.length === 0 && claimedAssets.length === 0) { - this.#unsubscribeDataSource(source); - continue; - } - - const claimedAssetsSet = new Set(claimedAssets); - const seenIds = new Set(); - const accountsForSource = assignedChains - .flatMap((chainId) => chainToAccounts.get(chainId) ?? []) - .filter((account) => { - if (seenIds.has(account.id)) { - return false; - } - seenIds.add(account.id); - return true; - }); - for (const account of accounts) { - if ( - !seenIds.has(account.id) && - this.getCustomAssets(account.id).some((assetId) => - claimedAssetsSet.has(assetId), - ) - ) { - seenIds.add(account.id); - accountsForSource.push(account); - } - } - - if (accountsForSource.length > 0) { - const hiddenAssets = this.#getHiddenAssetIds(); - this.#subscribeDataSource(source, accountsForSource, assignedChains, { - customAssets: claimedAssets, - excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined, - ...(options?.skipInitialFetch && - source === this.#accountsApiDataSource - ? { skipInitialFetch: true } - : {}), - }); - } else { - this.#unsubscribeDataSource(source); - } - } - - if (remainingCustomAssets.size > 0) { - log('Custom assets unclaimed by any data source', { - assetIds: [...remainingCustomAssets], - }); } } @@ -3728,17 +3565,9 @@ export class AssetsController extends BaseController< const rpc = this.#rpcDataSource; const supplementalKey = `ds:${rpc.getName()}:custom`; - const visibleCustomAssetsByAccount: Record = {}; - for (const account of accounts) { - const visibleCustomAssets = this.#getVisibleCustomAssets(account.id); - if (visibleCustomAssets.length > 0) { - visibleCustomAssetsByAccount[account.id] = visibleCustomAssets; - } - } - const decision = pickRpcCustomAssetsSupplement({ accountIds: accounts.map((account) => account.id), - customAssetsByAccount: visibleCustomAssetsByAccount, + customAssetsByAccount: this.state.customAssets, rpcAssignedChains, rpcAvailableChains: new Set(rpc.getActiveChainsSync()), enabledChains: new Set(chainToAccounts.keys()), @@ -3847,12 +3676,8 @@ export class AssetsController extends BaseController< * @param chains - Array of chain IDs to subscribe for. * @param options - Optional subscription overrides. * @param options.subscriptionKey - Custom subscription key (default: `ds:`). - * @param options.customAssets - Pinned assets this source claimed - * (`claimCustomAssets`), forwarded on the poll request (Accounts API v6). * @param options.customAssetsOnly - When true, only poll customAssets for these * chains (Accounts API v5 supplemental RPC subscription). - * @param options.excludeAssetIds - Hidden assets forwarded on the poll request - * (Accounts API v6). * @param options.skipInitialFetch - When true, skip the data source's subscribe-time fetch. */ #subscribeDataSource( @@ -3861,8 +3686,6 @@ export class AssetsController extends BaseController< chains: ChainId[], options: { subscriptionKey?: string; - customAssets?: Caip19AssetId[]; - excludeAssetIds?: Caip19AssetId[]; customAssetsOnly?: boolean; skipInitialFetch?: boolean; } = {}, @@ -3871,7 +3694,6 @@ export class AssetsController extends BaseController< const subscriptionKey = options.subscriptionKey ?? `ds:${sourceId}`; const existingSubscription = this.#activeSubscriptions.get(subscriptionKey); const isUpdate = existingSubscription !== undefined; - const customAssets = options.customAssets ?? []; log('Subscribe to data source', { sourceId, @@ -3879,7 +3701,6 @@ export class AssetsController extends BaseController< isUpdate, accountCount: accounts.length, chainCount: chains.length, - customAssetCount: customAssets.length, customAssetsOnly: options.customAssetsOnly === true, skipInitialFetch: options.skipInitialFetch === true, }); @@ -3889,11 +3710,6 @@ export class AssetsController extends BaseController< assetTypes: ['fungible'], dataTypes: ['balance'], updateInterval: this.#defaultUpdateInterval, - customAssets: customAssets.length > 0 ? customAssets : undefined, - excludeAssetIds: - options.excludeAssetIds && options.excludeAssetIds.length > 0 - ? options.excludeAssetIds - : undefined, ...(options.customAssetsOnly === true ? { customAssetsOnly: true } : {}), diff --git a/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts b/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts index b4e11723bf6..98c5262e8e6 100644 --- a/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AbstractDataSource.test.ts @@ -1,4 +1,4 @@ -import type { Caip19AssetId, ChainId } from '../types.js'; +import type { ChainId } from '../types.js'; import type { ActiveSubscription, DataSourceState, @@ -113,43 +113,6 @@ describe('AbstractDataSource', () => { expect(dataSource.getSubscriptions().size).toBe(0); }); - describe('claimCustomAssets', () => { - it('claims assets on assigned chains by default and skips others', () => { - const { dataSource } = setupDataSource(); - - const assignedChainAsset = - `${CHAIN_MAINNET}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; - const unassignedChainAsset = - `${CHAIN_POLYGON}/erc20:0x2222222222222222222222222222222222222222` as Caip19AssetId; - - expect( - dataSource.claimCustomAssets( - [assignedChainAsset, unassignedChainAsset], - [CHAIN_MAINNET], - ), - ).toStrictEqual([assignedChainAsset]); - }); - - it('skips malformed asset IDs and claims nothing without assigned chains', () => { - const { dataSource } = setupDataSource(); - - expect( - dataSource.claimCustomAssets( - ['not-a-caip-asset' as Caip19AssetId], - [CHAIN_MAINNET], - ), - ).toStrictEqual([]); - expect( - dataSource.claimCustomAssets( - [ - `${CHAIN_MAINNET}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId, - ], - [], - ), - ).toStrictEqual([]); - }); - }); - it.each([ { chains: [], expected: [] }, { chains: [CHAIN_MAINNET], expected: [CHAIN_MAINNET] }, diff --git a/packages/assets-controller/src/data-sources/AbstractDataSource.ts b/packages/assets-controller/src/data-sources/AbstractDataSource.ts index be690a116e3..6023b18dfb2 100644 --- a/packages/assets-controller/src/data-sources/AbstractDataSource.ts +++ b/packages/assets-controller/src/data-sources/AbstractDataSource.ts @@ -1,7 +1,4 @@ -import { parseCaipAssetType } from '@metamask/utils'; - import type { - Caip19AssetId, ChainId, DataRequest, DataResponse, @@ -120,31 +117,6 @@ export abstract class AbstractDataSource< return this.state.activeChains; } - /** - * Claim the pinned assets this source commits to serving. Called during the - * subscription handoff; claimed assets are not offered to lower-priority - * sources. Assets a source cannot resolve at fetch time are released via - * `DataResponse.unprocessedCustomAssets`. Default: claim assets on this - * source's assigned chains. - * - * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. - * @param assignedChains - Chains assigned to this source in the handoff. - * @returns The claimed subset of `customAssets`. - */ - claimCustomAssets( - customAssets: Caip19AssetId[], - assignedChains: ChainId[], - ): Caip19AssetId[] { - const assigned = new Set(assignedChains); - return customAssets.filter((assetId) => { - try { - return assigned.has(parseCaipAssetType(assetId).chainId); - } catch { - return false; - } - }); - } - /** * Subscribe to updates for the given request. */ diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts index 97265f35f37..8c6ce69588b 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.test.ts @@ -144,6 +144,20 @@ function createDataRequest( }; } +function createAssetsState( + overrides: Partial = {}, +): AssetsControllerStateInternal { + return { + assetsInfo: {}, + assetsBalance: {}, + assetsPrice: {}, + customAssets: {}, + assetPreferences: {}, + selectedCurrency: 'usd', + ...overrides, + }; +} + function createMiddlewareContext(overrides?: Partial): Context { return { request: createDataRequest(), @@ -171,6 +185,8 @@ async function setupController( fetchTimeoutMs?: number; v6Balances?: V6BalanceItem[]; remoteFeatureFlags?: Record; + getAssetsState?: () => AssetsControllerStateInternal; + tokenDetectionEnabled?: () => boolean; } = {}, ): Promise { const { @@ -182,6 +198,8 @@ async function setupController( fetchTimeoutMs, v6Balances = [], remoteFeatureFlags = {}, + getAssetsState = (): AssetsControllerStateInternal => createAssetsState(), + tokenDetectionEnabled, } = options; const rootMessenger = new Messenger({ @@ -235,7 +253,9 @@ async function setupController( activeChainsUpdateHandler(dataSourceName, chains, previousChains), isBalanceV6Enabled: (): boolean => isBalanceV6EnabledFromFlags(remoteFeatureFlags), + getAssetsState, ...(fetchTimeoutMs === undefined ? {} : { fetchTimeoutMs }), + ...(tokenDetectionEnabled === undefined ? {} : { tokenDetectionEnabled }), }); // Wait for async initialization @@ -792,48 +812,6 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); - describe('claimCustomAssets', () => { - const assignedChainAsset = - 'eip155:1/erc20:0x1111111111111111111111111111111111111111'; - const unassignedChainAsset = - 'eip155:137/erc20:0x2222222222222222222222222222222222222222'; - const nonEvmAsset = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFW'; - - it('claims EVM assets on assigned chains when the v6 flag is enabled', async () => { - const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }); - - expect( - controller.claimCustomAssets( - [ - assignedChainAsset, - unassignedChainAsset, - nonEvmAsset, - 'not-a-caip-asset', - ] as Caip19AssetId[], - ['eip155:1' as ChainId], - ), - ).toStrictEqual([assignedChainAsset]); - - controller.destroy(); - }); - - it('claims nothing when the v6 flag is disabled (v5 has no includeAssetIds support)', async () => { - const { controller } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: false }, - }); - - expect( - controller.claimCustomAssets([assignedChainAsset] as Caip19AssetId[], [ - 'eip155:1' as ChainId, - ]), - ).toStrictEqual([]); - - controller.destroy(); - }); - }); - describe('assetsAccountsApiV6 feature flag', () => { it('uses the v5 endpoint by default', async () => { const { controller, apiClient } = await setupController(); @@ -1277,16 +1255,17 @@ describe('AccountsApiDataSource', () => { }); it('passes EVM hidden assets on requested chains to v6 as excludeAssetIds', async () => { + const hiddenToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + assetPreferences: { [hiddenToken]: { hidden: true } }, + }), }); - const hiddenToken = - 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; - - await controller.fetch( - createDataRequest({ excludeAssetIds: [hiddenToken] }), - ); + await controller.fetch(createDataRequest()); expect( apiClient.accounts.fetchV6MultiAccountBalances, @@ -1300,20 +1279,17 @@ describe('AccountsApiDataSource', () => { }); it('omits hidden assets that are not on a requested chain from excludeAssetIds', async () => { + const polygonToken = + 'eip155:137/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + assetPreferences: { [polygonToken]: { hidden: true } }, + }), }); - // Hidden asset on Polygon while only Mainnet is being fetched. - const polygonToken = - 'eip155:137/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; - - await controller.fetch( - createDataRequest({ - chainIds: [CHAIN_MAINNET], - excludeAssetIds: [polygonToken], - }), - ); + await controller.fetch(createDataRequest({ chainIds: [CHAIN_MAINNET] })); expect( apiClient.accounts.fetchV6MultiAccountBalances, @@ -1327,19 +1303,22 @@ describe('AccountsApiDataSource', () => { }); it('skips non-EVM and malformed hidden assets when building excludeAssetIds', async () => { - const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }); - const solanaToken = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as Caip19AssetId; const malformed = 'not-a-caip-asset' as Caip19AssetId; + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + assetPreferences: { + [solanaToken]: { hidden: true }, + [malformed]: { hidden: true }, + }, + }), + }); - await controller.fetch( - createDataRequest({ excludeAssetIds: [solanaToken, malformed] }), - ); + await controller.fetch(createDataRequest()); - // No EVM hidden asset on a requested chain -> excludeAssetIds omitted. expect( apiClient.accounts.fetchV6MultiAccountBalances, ).toHaveBeenCalledWith( @@ -1351,22 +1330,44 @@ describe('AccountsApiDataSource', () => { controller.destroy(); }); - it('lets a hidden asset win when it also appears in the pinned list', async () => { + it('reads visible pins from controller state as includeAssetIds when the request has none', async () => { + const customToken = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const { controller, apiClient } = await setupController({ remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + customAssets: { 'mock-account-id': [customToken] }, + }), }); + await controller.fetch(createDataRequest()); + + expect( + apiClient.accounts.fetchV6MultiAccountBalances, + ).toHaveBeenCalledWith( + [`eip155:1:${MOCK_ADDRESS}`], + { includeAssetIds: [customToken] }, + undefined, + ); + + controller.destroy(); + }); + + it('does not include a state pin that is also hidden', async () => { const token = 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + customAssets: { 'mock-account-id': [token] }, + assetPreferences: { [token]: { hidden: true } }, + }), + }); - await controller.fetch( - createDataRequest({ - customAssets: [token], - excludeAssetIds: [token], - }), - ); + await controller.fetch(createDataRequest()); - // The asset is hidden, so it is excluded and never included. expect( apiClient.accounts.fetchV6MultiAccountBalances, ).toHaveBeenCalledWith( @@ -1379,21 +1380,20 @@ describe('AccountsApiDataSource', () => { }); it('sends both includeAssetIds and excludeAssetIds when pins and hidden assets differ', async () => { - const { controller, apiClient } = await setupController({ - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }); - const pinned = 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; const hidden = 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7' as Caip19AssetId; + const { controller, apiClient } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + getAssetsState: () => + createAssetsState({ + customAssets: { 'mock-account-id': [pinned] }, + assetPreferences: { [hidden]: { hidden: true } }, + }), + }); - await controller.fetch( - createDataRequest({ - customAssets: [pinned], - excludeAssetIds: [hidden], - }), - ); + await controller.fetch(createDataRequest()); expect( apiClient.accounts.fetchV6MultiAccountBalances, @@ -1679,6 +1679,8 @@ describe('AccountsApiDataSource', () => { balances?: V5BalanceItem[]; unprocessedNetworks?: string[]; tokenDetectionEnabled?: boolean; + getAssetsState?: () => AssetsControllerStateInternal; + remoteFeatureFlags?: Record; } = {}, ): Promise { const { @@ -1686,6 +1688,9 @@ describe('AccountsApiDataSource', () => { balances = [], unprocessedNetworks = [], tokenDetectionEnabled, + getAssetsState = (): AssetsControllerStateInternal => + createAssetsState(), + remoteFeatureFlags = {}, } = options; const rootMessenger = new Messenger< @@ -1711,7 +1716,7 @@ describe('AccountsApiDataSource', () => { registerActionHandler: (a: string, h: () => unknown) => void; } ).registerActionHandler('RemoteFeatureFlagController:getState', () => ({ - remoteFeatureFlags: {}, + remoteFeatureFlags, cacheTimestamp: 0, })); @@ -1737,6 +1742,9 @@ describe('AccountsApiDataSource', () => { apiClient as unknown as AccountsApiDataSourceOptions['queryApiClient'], onActiveChainsUpdated: (dataSourceName, chains, previousChains): void => activeChainsUpdateHandler(dataSourceName, chains, previousChains), + isBalanceV6Enabled: (): boolean => + isBalanceV6EnabledFromFlags(remoteFeatureFlags), + getAssetsState, }; if (tokenDetectionEnabled !== undefined) { @@ -1786,17 +1794,6 @@ describe('AccountsApiDataSource', () => { request: createDataRequest(), isUpdate: false, onAssetsUpdate: assetsUpdateHandler, - getAssetsState: () => ({ - assetsInfo: {}, - assetsBalance: { - [ACCOUNT_ID]: { - [KNOWN_ASSET]: { amount: '500' }, - }, - }, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, - }), }); expect(assetsUpdateHandler).toHaveBeenCalledTimes(1); @@ -1825,6 +1822,14 @@ describe('AccountsApiDataSource', () => { '2000', ), ], + getAssetsState: () => + createAssetsState({ + assetsBalance: { + [ACCOUNT_ID]: { + [KNOWN_ASSET]: { amount: '500' }, + }, + }, + }), }); await controller.subscribe({ @@ -1832,17 +1837,6 @@ describe('AccountsApiDataSource', () => { request: createDataRequest(), isUpdate: false, onAssetsUpdate: assetsUpdateHandler, - getAssetsState: () => ({ - assetsInfo: {}, - assetsBalance: { - [ACCOUNT_ID]: { - [KNOWN_ASSET]: { amount: '500' }, - }, - }, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, - }), }); expect(assetsUpdateHandler).toHaveBeenCalledTimes(1); @@ -1867,6 +1861,7 @@ describe('AccountsApiDataSource', () => { '2000', ), ], + getAssetsState: () => createAssetsState(), }); await controller.subscribe({ @@ -1874,13 +1869,6 @@ describe('AccountsApiDataSource', () => { request: createDataRequest(), isUpdate: false, onAssetsUpdate: assetsUpdateHandler, - getAssetsState: () => ({ - assetsInfo: {}, - assetsBalance: {}, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, - }), }); expect(assetsUpdateHandler).toHaveBeenCalledTimes(1); @@ -1906,25 +1894,14 @@ describe('AccountsApiDataSource', () => { '2000', ), ], - }); - - // Set up state accessor via subscribe (middleware uses the stored getAssetsState) - await controller.subscribe({ - subscriptionId: 'sub-setup', - request: createDataRequest(), - isUpdate: false, - onAssetsUpdate: jest.fn(), - getAssetsState: () => ({ - assetsInfo: {}, - assetsBalance: { - [ACCOUNT_ID]: { - [KNOWN_ASSET]: { amount: '500' }, + getAssetsState: () => + createAssetsState({ + assetsBalance: { + [ACCOUNT_ID]: { + [KNOWN_ASSET]: { amount: '500' }, + }, }, - }, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, - }), + }), }); const middleware = controller.assetsMiddleware; @@ -1955,40 +1932,93 @@ describe('AccountsApiDataSource', () => { '1000000000000000000', ), ], + getAssetsState: () => createAssetsState(), }); - // Simulate new account: subscribe with empty state so #getAssetsState is set. - // Filter will then remove all API balance data (no assets in state). - await controller.subscribe({ - subscriptionId: 'sub-setup', + const nextFn = jest.fn().mockResolvedValue(undefined); + const context = createMiddlewareContext({ request: createDataRequest({ chainIds: [CHAIN_MAINNET, CHAIN_POLYGON], }), - isUpdate: false, - onAssetsUpdate: jest.fn(), - getAssetsState: () => ({ - assetsInfo: {}, - assetsBalance: {}, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, + }); + + await controller.assetsMiddleware(context, nextFn); + + // All chains must still be passed to next middleware so RPC can fetch native balances + expect(nextFn).toHaveBeenCalledWith( + expect.objectContaining({ + request: expect.objectContaining({ + chainIds: [CHAIN_MAINNET, CHAIN_POLYGON], + }), }), + ); + + controller.destroy(); + }); + + it('does not filter unknown tokens on the v6 path when tokenDetectionEnabled is false', async () => { + const known = createMockV6BalanceItem( + `eip155:1:${MOCK_ADDRESS}`, + KNOWN_ASSET, + '1000', + ); + const unknown = createMockV6BalanceItem( + `eip155:1:${MOCK_ADDRESS}`, + UNKNOWN_ASSET, + '2000', + ); + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + tokenDetectionEnabled: (): boolean => false, + v6Balances: [known, unknown], + getAssetsState: () => + createAssetsState({ + assetsBalance: { + [ACCOUNT_ID]: { + [KNOWN_ASSET]: { amount: '500' }, + }, + }, + }), + }); + + const response = await controller.fetch(createDataRequest()); + const accountBalances = response.assetsBalance?.[ACCOUNT_ID] ?? {}; + expect(Object.keys(accountBalances)).toHaveLength(2); + expect(accountBalances[KNOWN_ASSET as Caip19AssetId]).toBeDefined(); + expect(accountBalances[UNKNOWN_ASSET as Caip19AssetId]).toBeDefined(); + + controller.destroy(); + }); + + it('claims handled chains on v6 when tokenDetectionEnabled is false', async () => { + const { controller } = await setupController({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + tokenDetectionEnabled: (): boolean => false, + v6Balances: [ + createMockV6BalanceItem( + `eip155:1:${MOCK_ADDRESS}`, + 'eip155:1/slip44:60', + '1000000000000000000', + 'token', + 'native', + ), + ], + getAssetsState: () => createAssetsState(), }); const nextFn = jest.fn().mockResolvedValue(undefined); const context = createMiddlewareContext({ request: createDataRequest({ - chainIds: [CHAIN_MAINNET, CHAIN_POLYGON], + chainIds: [CHAIN_MAINNET], }), }); await controller.assetsMiddleware(context, nextFn); - // All chains must still be passed to next middleware so RPC can fetch native balances expect(nextFn).toHaveBeenCalledWith( expect.objectContaining({ request: expect.objectContaining({ - chainIds: [CHAIN_MAINNET, CHAIN_POLYGON], + chainIds: [], }), }), ); @@ -2012,13 +2042,7 @@ describe('filterResponseToKnownAssets', () => { function buildState( balances: Record>, ): AssetsControllerStateInternal { - return { - assetsInfo: {}, - assetsBalance: balances, - assetsPrice: {}, - customAssets: {}, - assetPreferences: {}, - }; + return createAssetsState({ assetsBalance: balances }); } it('returns response unchanged when assetsBalance is undefined', () => { diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts index 74f44d92f13..370010cd916 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts @@ -114,6 +114,11 @@ export type AccountsApiDataSourceOptions = AccountsApiDataSourceConfig & { * `false` (v5). Read on demand, not cached. */ isBalanceV6Enabled?: () => boolean; + /** + * Current AssetsController state. Used for v6 include/exclude asset IDs and + * for filtering when token detection is off. + */ + getAssetsState: () => AssetsControllerStateInternal; state?: Partial; }; @@ -262,15 +267,14 @@ export class AccountsApiDataSource extends AbstractDataSource< /** Injected by AssetsController; `true` when the v6 balances endpoint should be used. */ readonly #isBalanceV6Enabled: () => boolean; + readonly #getAssetsState: () => AssetsControllerStateInternal; + /** ApiPlatformClient for cached API calls */ readonly #apiClient: ApiPlatformClient; /** Chains refresh timer */ #chainsRefreshTimer: ReturnType | null = null; - /** State accessor from subscriptions (for filtering when tokenDetectionEnabled is false) */ - #getAssetsState?: () => AssetsControllerStateInternal; - constructor(options: AccountsApiDataSourceOptions) { super(CONTROLLER_NAME, { ...defaultState, @@ -285,6 +289,7 @@ export class AccountsApiDataSource extends AbstractDataSource< this.#messenger = options.messenger; this.#isBalanceV6Enabled = options.isBalanceV6Enabled ?? ((): boolean => false); + this.#getAssetsState = options.getAssetsState; this.#apiClient = options.queryApiClient; // The Snaps → AssetsController migration flags gate which migration networks @@ -461,10 +466,7 @@ export class AccountsApiDataSource extends AbstractDataSource< if (isV6) { // User-hidden assets on the fetched chains, sent to v6 as // `excludeAssetIds`. - const excludeAssetIds = this.#getExcludeAssetIds( - request, - chainsToFetch, - ); + const excludeAssetIds = this.#getExcludeAssetIds(chainsToFetch); // User-pinned assets on the fetched chains, sent to v6 as // `includeAssetIds` so the backend returns them even at zero balance. @@ -542,8 +544,9 @@ export class AccountsApiDataSource extends AbstractDataSource< } } - // When token detection is disabled, filter out tokens not already in state - if (!this.#tokenDetectionEnabled() && this.#getAssetsState) { + // v5: when token detection is off, drop tokens not already in state. + // v6: the snapshot is authoritative (`updateMode: 'full'`); do not filter. + if (!this.#isBalanceV6Enabled() && !this.#tokenDetectionEnabled()) { response = filterResponseToKnownAssets(response, this.#getAssetsState()); } @@ -555,7 +558,10 @@ export class AccountsApiDataSource extends AbstractDataSource< * endpoint as `includeAssetIds`; malformed IDs are skipped and hidden * assets are left out (a hide wins). * - * @param request - The data request (carries `customAssets`). + * Prefers `request.customAssets` when the caller scoped the fetch (e.g. + * `addCustomAsset`). Otherwise reads visible pins from controller state. + * + * @param request - The data request (optional `customAssets` scope). * @param chainsToFetch - Chains being requested this fetch. * @param excludeAssetIds - Hidden asset IDs that must not be included. * @returns Deduplicated asset IDs, or `undefined` when none. @@ -565,55 +571,68 @@ export class AccountsApiDataSource extends AbstractDataSource< chainsToFetch: ChainId[], excludeAssetIds: Caip19AssetId[] | undefined, ): Caip19AssetId[] | undefined { - if (!request.customAssets || request.customAssets.length === 0) { - return undefined; - } - - const chainsToFetchSet = new Set(chainsToFetch); - const excludeSet = new Set(excludeAssetIds ?? []); - const includeAssetIds = new Set(); - - for (const assetId of request.customAssets) { - if (excludeSet.has(assetId)) { - continue; - } - let chainId: ChainId; - try { - chainId = parseCaipAssetType(assetId).chainId; - } catch { - continue; - } - if ( - chainId.startsWith(`${KnownCaipNamespace.Eip155}:`) && - chainsToFetchSet.has(chainId) - ) { - includeAssetIds.add(assetId); - } - } - - return includeAssetIds.size > 0 ? [...includeAssetIds] : undefined; + const candidates = + request.customAssets && request.customAssets.length > 0 + ? request.customAssets + : this.#getVisibleCustomAssetsFromState(request); + return this.#filterEvmAssetsOnChains( + candidates, + chainsToFetch, + new Set(excludeAssetIds ?? []), + ); } /** - * Collect the hidden EVM assets on the fetched chains to send to the v6 - * endpoint as `excludeAssetIds`; malformed IDs are skipped. + * Collect hidden EVM assets on the fetched chains from controller state + * to send as `excludeAssetIds`. * - * @param request - The data request (carries `excludeAssetIds`). * @param chainsToFetch - Chains being requested this fetch. * @returns Deduplicated asset IDs, or `undefined` when none. */ - #getExcludeAssetIds( - request: DataRequest, - chainsToFetch: ChainId[], - ): Caip19AssetId[] | undefined { - if (!request.excludeAssetIds || request.excludeAssetIds.length === 0) { - return undefined; + #getExcludeAssetIds(chainsToFetch: ChainId[]): Caip19AssetId[] | undefined { + return this.#filterEvmAssetsOnChains( + this.#getHiddenAssetIdsFromState(), + chainsToFetch, + ); + } + + #getVisibleCustomAssetsFromState(request: DataRequest): Caip19AssetId[] { + const state = this.#getAssetsState(); + const visible: Caip19AssetId[] = []; + for (const { account } of request.accountsWithSupportedChains) { + for (const assetId of state.customAssets[account.id] ?? []) { + if (!state.assetPreferences[assetId]?.hidden) { + visible.push(assetId); + } + } } + return visible; + } + #getHiddenAssetIdsFromState(): Caip19AssetId[] { + const hidden: Caip19AssetId[] = []; + for (const [assetId, prefs] of Object.entries( + this.#getAssetsState().assetPreferences, + )) { + if (prefs.hidden) { + hidden.push(assetId as Caip19AssetId); + } + } + return hidden; + } + + #filterEvmAssetsOnChains( + assetIds: Caip19AssetId[], + chainsToFetch: ChainId[], + excludeSet?: Set, + ): Caip19AssetId[] | undefined { const chainsToFetchSet = new Set(chainsToFetch); - const excludeAssetIds = new Set(); + const filtered = new Set(); - for (const assetId of request.excludeAssetIds) { + for (const assetId of assetIds) { + if (excludeSet?.has(assetId)) { + continue; + } let chainId: ChainId; try { chainId = parseCaipAssetType(assetId).chainId; @@ -624,11 +643,11 @@ export class AccountsApiDataSource extends AbstractDataSource< chainId.startsWith(`${KnownCaipNamespace.Eip155}:`) && chainsToFetchSet.has(chainId) ) { - excludeAssetIds.add(assetId); + filtered.add(assetId); } } - return excludeAssetIds.size > 0 ? [...excludeAssetIds] : undefined; + return filtered.size > 0 ? [...filtered] : undefined; } /** @@ -956,10 +975,11 @@ export class AccountsApiDataSource extends AbstractDataSource< (chainId) => !unprocessedChains.has(chainId), ); - // When token detection is off and we filtered out all balance data (e.g. new - // account with empty state), do not claim any chain as handled so that RPC - // middleware can still process them and fetch native balances (ETH, MATIC, etc.). + // v5: when token detection is off and we filtered out all balance data + // (e.g. new account with empty state), do not claim any chain so RPC + // can still fetch native balances. v6 keeps API coverage as-is. if ( + !this.#isBalanceV6Enabled() && !this.#tokenDetectionEnabled() && (!response.assetsBalance || Object.keys(response.assetsBalance).length === 0) @@ -995,45 +1015,10 @@ export class AccountsApiDataSource extends AbstractDataSource< // SUBSCRIBE // ============================================================================ - /** - * Claim EVM pins on assigned chains (sent to v6 as `includeAssetIds`). - * v5 has no `includeAssetIds`, so with the v6 flag off nothing is claimed - * and pins fall through to RPC. - * - * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. - * @param assignedChains - Chains assigned to this source in the handoff. - * @returns The claimed subset of `customAssets`. - */ - claimCustomAssets( - customAssets: Caip19AssetId[], - assignedChains: ChainId[], - ): Caip19AssetId[] { - if (!this.#isBalanceV6Enabled()) { - return []; - } - const assigned = new Set(assignedChains); - return customAssets.filter((assetId) => { - try { - const parsed = parseCaipAssetType(assetId); - return ( - parsed.chain.namespace === KnownCaipNamespace.Eip155 && - assigned.has(parsed.chainId) - ); - } catch { - return false; - } - }); - } - async subscribe(subscriptionRequest: SubscriptionRequest): Promise { const { request, subscriptionId, isUpdate, skipInitialFetch } = subscriptionRequest; - // Store state accessor for filtering when tokenDetectionEnabled is false - if (subscriptionRequest.getAssetsState) { - this.#getAssetsState = subscriptionRequest.getAssetsState; - } - // Try all requested chains - API will handle unsupported ones via unprocessedNetworks const chainsToSubscribe = request.chainIds; diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 5c49872fed6..74063c8d6d2 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -1432,44 +1432,6 @@ describe('RpcDataSource', () => { }); }); - describe('claimCustomAssets', () => { - const availableChainAsset = - `${MOCK_CHAIN_ID_CAIP}/erc20:0x1111111111111111111111111111111111111111` as Caip19AssetId; - const unavailableChainAsset = - 'eip155:999/erc20:0x2222222222222222222222222222222222222222' as Caip19AssetId; - const nonEvmAsset = - 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFW' as Caip19AssetId; - - it('claims EVM assets only on chains assigned to RPC', async () => { - await withController(async ({ controller }) => { - expect( - controller.claimCustomAssets([availableChainAsset], []), - ).toStrictEqual([]); - expect( - controller.claimCustomAssets( - [availableChainAsset], - [MOCK_CHAIN_ID_CAIP], - ), - ).toStrictEqual([availableChainAsset]); - }); - }); - - it('does not claim assets on unassigned chains, non-EVM assets, or malformed IDs', async () => { - await withController(async ({ controller }) => { - expect( - controller.claimCustomAssets( - [ - unavailableChainAsset, - nonEvmAsset, - 'not-a-caip-asset' as Caip19AssetId, - ], - [MOCK_CHAIN_ID_CAIP], - ), - ).toStrictEqual([]); - }); - }); - }); - describe('unsubscribe', () => { it('removes subscription', async () => { await withController(async ({ controller }) => { diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index 626cfd55174..26cb0bb1b6e 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -1351,34 +1351,6 @@ export class RpcDataSource extends AbstractDataSource< }; } - /** - * Claim leftover EVM pins on chains assigned to RPC. Pins on chains owned by - * Account Activity or the Accounts API stay with those sources (v6 - * `includeAssetIds` / websocket). Unresolved pins on those chains are - * recovered by `RpcFallbackMiddleware`, not a second RPC subscription. - * - * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed. - * @param assignedChains - Chains assigned to RPC in this handoff. - * @returns The claimed subset of `customAssets`. - */ - claimCustomAssets( - customAssets: Caip19AssetId[], - assignedChains: ChainId[], - ): Caip19AssetId[] { - const assigned = new Set(assignedChains); - return customAssets.filter((assetId) => { - try { - const parsed = parseCaipAssetType(assetId); - return ( - parsed.chain.namespace === KnownCaipNamespace.Eip155 && - assigned.has(parsed.chainId) - ); - } catch { - return false; - } - }); - } - /** * Subscribe to updates for the given request. * Starts polling through BalanceFetcher and TokenDetector. diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts index 4c10eba6aa9..795b6f92b9b 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.test.ts @@ -248,7 +248,12 @@ describe('BalanceFetcher', () => { ); }); - it('includes state.customAssets on the regular poll even without an assetsBalance row', async () => { + it('polls custom assets even when they have no entry in assetsBalance yet', async () => { + // Regression: custom assets must be polled by RPC because RPC is the + // sole balance fetcher for them. Previously #getAssetsToFetch only + // looked at state.assetsBalance, so a freshly added custom asset + // (no balance row yet, e.g. zero balance or first fetch failed) + // would never be polled. const mockState: AssetsBalanceState = { assetsBalance: { [TEST_ACCOUNT_ID]: { @@ -278,7 +283,12 @@ describe('BalanceFetcher', () => { true, '1000000000000000000', ), - createMockBalanceResponse(TEST_TOKEN_1, TEST_ACCOUNT, true, '0'), + createMockBalanceResponse( + TEST_TOKEN_1.toLowerCase() as Address, + TEST_ACCOUNT, + true, + '500', + ), ]); const input: BalancePollingInput = { @@ -289,6 +299,9 @@ describe('BalanceFetcher', () => { await controller._executePoll(input); + // The multicall batch should include both the native asset and + // the custom ERC-20 token, even though the custom token has no + // entry in assetsBalance. const [, batchedRequests] = mockMulticallClient.batchBalanceOf.mock.calls[0]; const requestedTokens = ( @@ -297,17 +310,16 @@ describe('BalanceFetcher', () => { .map((req) => req.tokenAddress.toLowerCase()) .sort(); expect(requestedTokens).toStrictEqual( - [ZERO_ADDRESS, TEST_TOKEN_1] - .map((addr) => addr.toLowerCase()) - .sort(), + [ZERO_ADDRESS.toLowerCase(), TEST_TOKEN_1.toLowerCase()].sort(), ); }, ); }); - it('with explicit assetIds fetches exactly those assets and ignores tracked state', async () => { - // Asset-scoped poll path: RPC claimed the pins on a chain another - // source owns — it must NOT also poll the tracked balances. + it('in customAssetsOnly mode skips state.assetsBalance and only fetches state.customAssets', async () => { + // The supplemental subscription path: another data source covers the + // chain for regular balances, but RPC must still poll the user's + // customAssets. We must NOT also poll the regular tracked balances. const mockState: AssetsBalanceState = { assetsBalance: { [TEST_ACCOUNT_ID]: { @@ -342,7 +354,7 @@ describe('BalanceFetcher', () => { chainId: MAINNET_CHAIN_ID, accountId: TEST_ACCOUNT_ID, accountAddress: TEST_ACCOUNT, - assetIds: [TOKEN_1_ASSET_ID], + customAssetsOnly: true, }; await controller._executePoll(input); @@ -354,8 +366,8 @@ describe('BalanceFetcher', () => { ) .map((req) => req.tokenAddress.toLowerCase()) .sort(); - // ONLY the pinned asset — not the native and not TOKEN_2 from - // assetsBalance, even though both are tracked in state. + // ONLY the custom token — not the native and not TOKEN_2 from + // assetsBalance. expect(requestedTokens).toStrictEqual([TEST_TOKEN_1.toLowerCase()]); }, ); diff --git a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts index b9320a16d41..44d8af36fa1 100644 --- a/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts +++ b/packages/assets-controller/src/data-sources/evm-rpc-services/services/BalanceFetcher.ts @@ -45,16 +45,11 @@ export type BalancePollingInput = { accountId: AccountId; /** Account address */ accountAddress: Address; - /** - * When present, fetch exactly these assets instead of the tracked - * `assetsBalance` entries (Accounts API v6 asset-scoped RPC poll). Must be - * deterministically ordered — the polling input is the dedupe key. - */ - assetIds?: CaipAssetType[]; /** * When true, only fetch balances for entries in `state.customAssets`, * skipping `state.assetsBalance`. Used by the supplemental RPC - * subscription on the Accounts API v5 path. + * subscription on chains that another data source is already covering + * for regular balance refreshes. */ customAssetsOnly?: boolean; }; @@ -126,7 +121,6 @@ export class BalanceFetcher extends StaticIntervalPollingControllerOnly { - const assets = this.#getAssetsToFetch( - chainId, - accountId, - assetIds, - customAssetsOnly, - ); + const assets = this.#getAssetsToFetch(chainId, accountId, customAssetsOnly); return this.fetchBalancesForAssets( chainId, diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts index b9a0093ab41..b46f80a6746 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts @@ -104,6 +104,7 @@ async function runPipeline( messenger: assetsControllerMessenger, queryApiClient, onActiveChainsUpdated: jest.fn(), + getAssetsState: (): AssetsControllerStateInternal => state, }); const stakedBalanceDataSource = new StakedBalanceDataSource({ @@ -171,7 +172,7 @@ async function runPipeline( const { response } = await executeAssetsPipeline({ sources, request, - getAssetsState: () => state, + getAssetsState: (): AssetsControllerStateInternal => state, }); accountsApiDataSource.destroy(); diff --git a/packages/assets-controller/src/types.ts b/packages/assets-controller/src/types.ts index 9f293379788..8d715d6dc35 100644 --- a/packages/assets-controller/src/types.ts +++ b/packages/assets-controller/src/types.ts @@ -342,7 +342,11 @@ export type DataRequest = { assetTypes?: AssetType[]; /** Which data to fetch */ dataTypes: DataType[]; - /** Specific CAIP-19 asset IDs */ + /** + * Optional scoped CAIP-19 asset IDs for this fetch (not the full pin list). + * Used by `getAssets({ customAssets })`, `addCustomAsset`, and RPC fallback + * recovery. When omitted, v6 sources read pins from controller state. + */ customAssets?: Caip19AssetId[]; /** * When true, the data source should poll only the user's `customAssets` @@ -352,11 +356,6 @@ export type DataRequest = { * (Accounts API v5 path). Ignored when Accounts API v6 is enabled. */ customAssetsOnly?: boolean; - /** - * User-hidden CAIP-19 asset IDs, sent to the Accounts API v6 endpoint as - * `excludeAssetIds` so they are dropped from the response. - */ - excludeAssetIds?: Caip19AssetId[]; /** Force fresh fetch, bypass cache */ forceUpdate?: boolean; /** diff --git a/packages/assets-controller/tsconfig.build.json b/packages/assets-controller/tsconfig.build.json index 1493c629174..d3ca7fb59b9 100644 --- a/packages/assets-controller/tsconfig.build.json +++ b/packages/assets-controller/tsconfig.build.json @@ -67,5 +67,5 @@ } ], "include": ["../../types", "./src"], - "exclude": ["**/*.test.ts", "**/__fixtures__/", "./architecture"] + "exclude": ["**/*.test.ts", "**/__fixtures__/"] } From db287901b82d8fa42286f3ee1ff3d8e1af866fb5 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Mon, 21 Sep 2026 23:30:06 +0200 Subject: [PATCH 10/25] update docs --- .../docs/architecture/v1/CHANGES.md | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 9aa306e5b54..377052aa256 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -1,4 +1,4 @@ -# AssetsController 15.0.0 - Accounts API v5 and v6 side by side +# AssetsController - Accounts API v5 and v6 side by side ## What this change is about @@ -90,6 +90,40 @@ When basic functionality is off, both fast lanes shrink to Both paths first hand each chain to the data source with the highest priority for it. They differ in how pinned assets on those chains are covered: +```mermaid +flowchart TB + subgraph shared ["Both paths"] + H["Assign each chain to the highest-priority source that supports it"] + end + + subgraph v5sub ["v5"] + direction TB + V5A["Subscribe each source with accounts + assigned chains"] + V5WS["Account Activity
updateMode merge"] + V5API["Accounts API
updateMode merge"] + V5RPC["RPC
updateMode merge"] + V5R["Extra RPC poll: customAssetsOnly
pins on chains another source already owns
updateMode merge"] + V5A --> V5WS + V5A --> V5API + V5A --> V5RPC + V5A --> V5R + end + + subgraph v6sub ["v6"] + direction TB + V6A["Subscribe each source with accounts + assigned chains only"] + V6WS["Account Activity
ignores pins/hides
updateMode merge"] + V6API["Accounts API
includeAssetIds / excludeAssetIds from state
updateMode full"] + V6RPC["RPC
polls customAssets from state on assigned chains
updateMode merge"] + V6A --> V6WS + V6A --> V6API + V6A --> V6RPC + end + + shared --> v5sub + shared --> v6sub +``` + - **v5** adds a separate RPC poll (`customAssetsOnly`) for pins that sit on a chain another source already owns. - **v6** subscribe only assigns accounts and chains. The Accounts API reads @@ -100,6 +134,18 @@ for it. They differ in how pinned assets on those chains are covered: ## 3. Handling an incoming update +```mermaid +flowchart TB + subgraph v5upd ["v5 · #handleAssetsUpdateV5"] + direction TB + V5I["Incoming update"] --> V5G["CustomAssetGraduation
Accounts API + Account Activity"] --> V5D[Detection] --> V5T["Token + Price"] --> V5S["State: merge
replaceCoveredChainBalances"] + end + subgraph v6upd ["v6 · #handleAssetsUpdateV6"] + direction TB + V6I["Incoming update"] --> V6F["RpcFallback when basic functionality is on
errored chains + unprocessedCustomAssets"] --> V6D[Detection] --> V6T["Token + Price"] --> V6S["State: full when Accounts API
merge otherwise"] + end +``` + - **v5** (`#handleAssetsUpdateV5`): CustomAssetGraduation (for the Accounts API and AccountActivity) -> Detection -> Token + Price -> state written with `merge`, honoring `replaceCoveredChainBalances`. From d46fe5245f267f6925d50c20e6b71ddda3e0e2d7 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Tue, 22 Sep 2026 11:06:28 +0200 Subject: [PATCH 11/25] update changelog --- packages/assets-controller/CHANGELOG.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index a0661e5a91e..a2ee53ae712 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -9,20 +9,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Add an optional `customAssets` option to `AssetsController.getAssets`, used only when `assetsAccountsApiV6` is enabled. It overrides which pinned assets are attached to the fetch (sent as `includeAssetIds` and to RPC). When the flag is off, `getAssets` still attaches every pin of the requested accounts, unscoped, matching the previous v5 request ([#9651](https://github.com/MetaMask/core/pull/9651)) -- Add a required `getAssetsState` getter to `AccountsApiDataSource`. `AssetsController` injects `() => this.state` so v6 include/exclude and token-detection filtering read controller state without copying it onto subscribe or fetch requests +- Add optional `customAssets` to `AssetsController.getAssets`, to scope a fetch to specific asset IDs (Accounts API v6 only) ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Add optional `unprocessedCustomAssets` to `DataResponse`, listing pinned asset IDs a source could not resolve so `RpcFallbackMiddleware` can recover them ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Add optional `isBalanceV6Enabled` to `AccountsApiDataSourceOptions` and `RpcFallbackMiddlewareOptions`, so the `assetsAccountsApiV6` flag is read once by `AssetsController` and injected ([#9651](https://github.com/MetaMask/core/pull/9651)) ### Changed -- **BREAKING:** Remove `excludeAssetIds` from `DataRequest`. Accounts API v6 reads hidden assets from controller state (`assetPreferences`) when building the v6 `excludeAssetIds` query param. `request.customAssets` remains only as a scoped fetch override (`getAssets({ customAssets })`, `addCustomAsset`, RPC fallback), not a copy of every pin. -- When `assetsAccountsApiV6` is enabled, a hide wins over a pin: Accounts API v6 sends hidden assets as `excludeAssetIds` and skips them in `includeAssetIds`. The v5 path is unchanged (`getAssets` force updates and the RPC custom-asset supplement still attach every pin, including hidden ones). `hideAsset` still leaves the pin in `customAssets` to record that the token was imported ([#9651](https://github.com/MetaMask/core/pull/9651)) -- When `assetsAccountsApiV6` is enabled, Accounts API fetch and middleware report `updateMode: 'full'` so assets on chains in the snapshot (including custom assets returned via `includeAssetIds`) are replaced; pins left in `unprocessedCustomAssets` after RPC fallback keep their prior balances. The v5 path keeps `updateMode: 'merge'` with `replaceCoveredChainBalances` so custom assets are preserved ([#9651](https://github.com/MetaMask/core/pull/9651)) -- When `assetsAccountsApiV6` is enabled, Accounts API does not filter unknown tokens via `tokenDetectionEnabled`. The v6 snapshot is applied in full; v5 still drops tokens not already in state when detection is off +- **BREAKING:** Remove `'update'` from `AssetsUpdateMode`; use `'full'` (Accounts API v6 snapshot) or `'merge'` ([#9651](https://github.com/MetaMask/core/pull/9651)) +- **BREAKING:** Remove the `updateMode` option from `AssetsController.getAssets`; the data source now sets it on its response ([#9651](https://github.com/MetaMask/core/pull/9651)) +- **BREAKING:** Require `getAssetsState` in `AccountsApiDataSourceOptions` ([#9651](https://github.com/MetaMask/core/pull/9651)) + - Pass `() => this.state` from `AssetsController` +- When `assetsAccountsApiV6` is enabled, Accounts API v6 reads pins and hides from state and sends them as `includeAssetIds` / `excludeAssetIds`, then applies the response with `updateMode: 'full'` ([#9651](https://github.com/MetaMask/core/pull/9651)) +- `hideAsset` and `unhideAsset` now re-evaluate subscriptions, so live polls start and stop excluding the asset immediately ([#9651](https://github.com/MetaMask/core/pull/9651)) - Bump `@metamask/transaction-controller` from `^70.0.1` to `^70.1.0` ([#10262](https://github.com/MetaMask/core/pull/10262)) ### Fixed -- Treat `assetsAccountsApiV6` as enabled when it is `true` ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Treat the `assetsAccountsApiV6` remote feature flag as enabled when it is `true`, instead of reading a nested `{ value }` object ([#9651](https://github.com/MetaMask/core/pull/9651)) +- Keep default tracked assets (mUSD) at a zero balance when an Accounts API v6 `full` update omits them, so a force refresh no longer drops them from the token list ([#9651](https://github.com/MetaMask/core/pull/9651)) - Skip `#updateState` assignments for metadata, balances, and prices that are deep-equal to what's already in state, so Immer no longer emits a no-op `stateChange` (and a full state persist) on every poll that repeats unchanged data ([#10260](https://github.com/MetaMask/core/pull/10260)) - `TokenDataSource` spam filtering now removes filtered assets from `assetsBalance` and `detectedAssets` using case-insensitive asset ID matching (previously only `assetsInfo` was matched case-insensitively), so spam tokens whose IDs arrive in a different case than state no longer survive in the pipeline response and persist to state ([#10172](https://github.com/MetaMask/core/pull/10172)) From a4b51f14541cc53e89f5a40fe41ba4a8aa874f6a Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Tue, 22 Sep 2026 15:58:42 +0200 Subject: [PATCH 12/25] update integration test --- ...c-spam-token-filtering.integration.test.ts | 81 +++++++++++---- .../bsc-spam-token/api-responses/index.ts | 46 ++++++++- ...c-spam-token-filtering.integration.test.ts | 99 ++++++++++++++++++- 3 files changed, 202 insertions(+), 24 deletions(-) diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts index 66048972372..07ab7e58fb8 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts @@ -21,6 +21,7 @@ import { createTestApiClient } from './__fixtures__/mockTokenApi.js'; import { waitFor, waitUntilStable } from './__fixtures__/test-utils.js'; import { AssetsController } from './AssetsController.js'; import type { AssetsControllerState } from './AssetsController.js'; +import type { AssetsControllerStateInternal } from './types.js'; /** * Integration coverage for `AssetsController` against the BNB Chain wallet @@ -28,9 +29,9 @@ import type { AssetsControllerState } from './AssetsController.js'; * * Boots the real controller, answers the same captured APIs as * `buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts`, and - * asserts CDOGE never lands in persisted state. - * - * Integration Expectation - CDOGE is correctly filtered out of controller state. + * asserts CDOGE never lands in persisted state — unless the user imported it + * as a custom asset, in which case it must survive (see the custom-asset + * suite below). */ type StateSurface = { @@ -63,14 +64,17 @@ async function withController( { state = buildEmptyAssetsState(), queryApiClient = createTestApiClient(), + remoteFeatureFlags = {}, }: { state?: Partial; queryApiClient?: ApiPlatformClient; + remoteFeatureFlags?: Record; }, fn: WithControllerCallback, ): Promise { const { rootMessenger, assetsControllerMessenger } = createMockMessengers({ - registerCustomRootActions: registerBscSpamControllerActions, + registerCustomRootActions: (messenger) => + registerBscSpamControllerActions(messenger, { remoteFeatureFlags }), }); const controller = new AssetsController({ @@ -90,25 +94,31 @@ async function withController( async function fetchWallet( state: Partial = buildEmptyAssetsState(), + remoteFeatureFlags: Record = {}, ): Promise { const { accountsSupportedNetworks } = mockBscSpamApis(); - return await withController({ state }, async ({ controller }) => { - // wait for `AccountsApiDataSource` to ask `/v2/supportedNetworks` to indicate the fast-lane is ready - await waitFor(() => expect(accountsSupportedNetworks.isDone()).toBe(true)); + return await withController( + { state, remoteFeatureFlags }, + async ({ controller }) => { + // wait for `AccountsApiDataSource` to ask `/v2/supportedNetworks` to indicate the fast-lane is ready + await waitFor(() => + expect(accountsSupportedNetworks.isDone()).toBe(true), + ); - await controller.getAssets([buildBscSpamAccount()], { - chainIds: [BSC_CHAIN_ID], - forceUpdate: true, - }); + await controller.getAssets([buildBscSpamAccount()], { + chainIds: [BSC_CHAIN_ID], + forceUpdate: true, + }); - // `getAssets` awaits the fast lane only; the slow lane is fire-and-forget - // and can still be writing. Let state settle so the assertions about CDOGE - // being absent cannot pass just because nothing has landed yet. - await waitUntilStable(() => controller.state); + // `getAssets` awaits the fast lane only; the slow lane is fire-and-forget + // and can still be writing. Let state settle so the assertions about CDOGE + // being absent cannot pass just because nothing has landed yet. + await waitUntilStable(() => controller.state); - return controller.state; - }); + return controller.state; + }, + ); } const WALLET_PASSES = [ @@ -168,3 +178,40 @@ describe('AssetsController: BNB Chain spam token (CDOGE)', () => { }); }); }); + +describe('AssetsController: BNB Chain spam token (CDOGE) imported as a custom asset', () => { + afterEach(() => { + cleanAll(); + }); + + function buildCustomAssetWalletState(): AssetsControllerStateInternal { + return buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + assetsBalance: { + [BSC_SPAM_ACCOUNT_ID]: { + [CDOGE_ASSET_ID_CHECKSUM]: { amount: '0' }, + }, + }, + assetsInfo: { + [CDOGE_ASSET_ID_CHECKSUM]: { + type: 'erc20', + symbol: 'CDOGE', + name: '$$$DOGECHAIN', + decimals: 9, + }, + }, + }); + } + + it('keeps the imported token in customAssets, balances and metadata', async () => { + const state = await fetchWallet(buildCustomAssetWalletState(), { + assetsAccountsApiV6: true, + }); + + expect(state.customAssets[BSC_SPAM_ACCOUNT_ID]).toContain( + CDOGE_ASSET_ID_CHECKSUM, + ); + expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }); +}); diff --git a/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts index 66476c232ec..90b4dd7319c 100644 --- a/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts +++ b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts @@ -62,13 +62,16 @@ function mockAccountsSupportedNetworks(): nock.Scope { * Intercept `GET {ACCOUNTS}/v5/multiaccount/balances` with the wallet's * captured 38 holdings. * + * @param omitAssetIds - Asset IDs (any casing) to drop from the captured + * balances, simulating a token the Accounts API does not index. * @returns The nock scope and the account IDs each request asked about. */ -function mockV5MultiAccountBalances(): { +function mockV5MultiAccountBalances(omitAssetIds: string[] = []): { scope: nock.Scope; requestedAccountIds: string[][]; } { const requestedAccountIds: string[][] = []; + const omitted = new Set(omitAssetIds.map((assetId) => assetId.toLowerCase())); const scope = nock(API_URLS.ACCOUNTS) .persist() @@ -78,12 +81,39 @@ function mockV5MultiAccountBalances(): { requestedAccountIds.push( readListParam(uri, 'accountIds', API_URLS.ACCOUNTS), ); - return v5MultiAccountBalances; + const balances = v5MultiAccountBalances.balances.filter( + (entry) => !omitted.has(entry.assetId.toLowerCase()), + ); + return { ...v5MultiAccountBalances, count: balances.length, balances }; }); return { scope, requestedAccountIds }; } +/** + * Intercept `GET {ACCOUNTS}/v6/multiaccount/balances` with the wallet's + * captured token balances. + * + * @param omitAssetIds - Asset IDs (any casing) to drop from the captured + * balances. + * @returns The nock scope. + */ +function mockV6MultiAccountBalances(omitAssetIds: string[] = []): nock.Scope { + const omitted = new Set(omitAssetIds.map((assetId) => assetId.toLowerCase())); + + return nock(API_URLS.ACCOUNTS) + .persist() + .get('/v6/multiaccount/balances') + .query(true) + .reply(200, { + balances: v5MultiAccountBalances.balances.filter( + (entry) => !omitted.has(entry.assetId.toLowerCase()), + ), + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + }); +} + /** * Intercept `GET {TOKENS}/v2/supportedNetworks`. `eip155:56` is in the captured * `fullSupport` list, so BNB Chain assets genuinely reach the occurrence filter @@ -190,9 +220,16 @@ function mockV3SpotPrices(): BatchRecordingMock { * All interceptors persist, so batch composition and cache misses cannot make a * test fail for want of an interceptor. * + * @param options - Options for shaping the intercepted responses. + * @param options.omitBalanceAssetIds - Asset IDs (any casing) to drop from + * the captured balances, simulating tokens the Accounts API does not index. * @returns The recording mocks, and other utils */ -export function mockBscSpamApis(): { +export function mockBscSpamApis({ + omitBalanceAssetIds = [], +}: { + omitBalanceAssetIds?: string[]; +} = {}): { accountsSupportedNetworks: nock.Scope; balances: { requestedAccountIds: string[][] }; assets: BatchRecordingMock; @@ -204,7 +241,8 @@ export function mockBscSpamApis(): { mockPricesSupportedNetworks(); mockChainIdNetwork(); - const balances = mockV5MultiAccountBalances(); + const balances = mockV5MultiAccountBalances(omitBalanceAssetIds); + mockV6MultiAccountBalances(omitBalanceAssetIds); const assets = mockV3Assets(); const prices = mockV3SpotPrices(); diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts index b46f80a6746..c336d73129e 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts @@ -12,6 +12,7 @@ import { BNB_ASSET_ID, BSC_CHAIN_ID, BSC_SPAM_ACCOUNT_ID, + CDOGE_ASSET_ID_CHECKSUM, CDOGE_ASSET_ID_LOWERCASE, } from '../__fixtures__/bsc-spam-token/wallet.js'; import { createMockMessengers } from '../__fixtures__/MockAssetControllerMessenger.js'; @@ -27,7 +28,9 @@ import { RpcFallbackMiddleware } from '../middlewares/RpcFallbackMiddleware.js'; import type { AccountId, AssetsControllerStateInternal, + AssetsDataSource, Caip19AssetId, + Context, DataRequest, DataResponse, } from '../types.js'; @@ -78,6 +81,15 @@ const DETECTED_ASSETS: ResponseSurface = { async function runPipeline( state: AssetsControllerStateInternal, + { + rpcDataSource: rpcOverride, + omitBalanceAssetIds = [], + includeCustomAssetGraduation = true, + }: { + rpcDataSource?: AssetsDataSource; + omitBalanceAssetIds?: string[]; + includeCustomAssetGraduation?: boolean; + } = {}, ): Promise { const { assetsControllerMessenger } = createMockMessengers({ registerCustomRootActions: (rootMessenger) => { @@ -136,7 +148,7 @@ async function runPipeline( getSelectedCurrency: (): 'usd' => 'usd', }); - mockBscSpamApis(); + mockBscSpamApis({ omitBalanceAssetIds }); await accountsApiDataSource.refreshActiveChains(); @@ -161,12 +173,14 @@ async function runPipeline( ); }, }), - rpcFallbackMiddleware: new RpcFallbackMiddleware({ rpcDataSource }), + rpcFallbackMiddleware: new RpcFallbackMiddleware({ + rpcDataSource: rpcOverride ?? rpcDataSource, + }), detectionMiddleware: new DetectionMiddleware(), tokenDataSource, priceDataSource, }, - { isBasicFunctionality: true, includeCustomAssetGraduation: true }, + { isBasicFunctionality: true, includeCustomAssetGraduation }, ); const { response } = await executeAssetsPipeline({ @@ -240,3 +254,82 @@ describe('assets pipeline: BNB Chain spam token (CDOGE)', () => { }); }); }); + +describe('assets pipeline: BNB Chain spam token (CDOGE) imported as a custom asset', () => { + afterEach(() => { + cleanAll(); + }); + + const createRecordingRpcSource = ( + balances: Record, + ): { source: AssetsDataSource; requests: DataRequest[] } => { + const requests: DataRequest[] = []; + const source: AssetsDataSource = { + getName: () => 'RpcDataSource', + assetsMiddleware: async (ctx): Promise => { + requests.push(ctx.request); + return { + ...ctx, + response: { + assetsBalance: { [BSC_SPAM_ACCOUNT_ID]: balances }, + }, + }; + }, + }; + return { source, requests }; + }; + + it.each([BALANCES, METADATA, DETECTED_ASSETS])( + '$surface - keeps the imported token despite a positive API balance and low occurrences', + async ({ lookUp }) => { + const response = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + { includeCustomAssetGraduation: false }, + ); + + expect(lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }, + ); + + it('does not re-read the custom asset on RPC when the Accounts API reports its balance', async () => { + const { source, requests } = createRecordingRpcSource({}); + + const response = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + { + rpcDataSource: source, + includeCustomAssetGraduation: false, + }, + ); + + expect(requests).toHaveLength(0); + expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }); + + it('re-reads the custom asset on RPC when the Accounts API omits it', async () => { + const { source, requests } = createRecordingRpcSource({ + [CDOGE_ASSET_ID_LOWERCASE]: { amount: '4321' }, + }); + + const response = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + { + rpcDataSource: source, + omitBalanceAssetIds: [CDOGE_ASSET_ID_LOWERCASE], + includeCustomAssetGraduation: false, + }, + ); + + expect(requests).toHaveLength(1); + expect(requests[0]?.customAssets ?? []).toContain(CDOGE_ASSET_ID_CHECKSUM); + expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ + amount: '4321', + }); + }); +}); From 6d7ad3374cfb0fcc26c8c13338ed4fc667f09dc6 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Wed, 23 Sep 2026 00:02:01 +0200 Subject: [PATCH 13/25] fix RPCFallback v6 --- .../middlewares/RpcFallbackMiddleware.test.ts | 94 +++++++-- .../src/middlewares/RpcFallbackMiddleware.ts | 186 +++++++++--------- 2 files changed, 176 insertions(+), 104 deletions(-) diff --git a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts index c8161574813..2ad04dc5ead 100644 --- a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts +++ b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.test.ts @@ -53,6 +53,7 @@ function createDataRequest( type StateOverrides = { assetsBalance?: Record>; customAssets?: Record; + assetPreferences?: Record; }; function createContext( @@ -67,6 +68,7 @@ function createContext( assetsInfo: {}, assetsBalance: stateOverrides.assetsBalance ?? {}, customAssets: stateOverrides.customAssets ?? {}, + assetPreferences: stateOverrides.assetPreferences ?? {}, assetsPrice: {}, } as AssetsControllerStateInternal), }; @@ -290,6 +292,74 @@ describe('RpcFallbackMiddleware', () => { expect(finalCtx.response.errors).toStrictEqual({}); }); + it('merges API unprocessed pins with every tracked asset on the errored chain in one RPC call', async () => { + const rpcResponse: DataResponse = { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_ASSET_POLYGON]: { amount: '10' }, + [MOCK_TOKEN_POLYGON]: { amount: '50' }, + }, + }, + }; + const { source, middleware: rpcMw } = createMockRpcSource(rpcResponse); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); + const ctx = createContext( + createDataRequest(['eip155:1', 'eip155:137']), + { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { [MOCK_ASSET_MAINNET]: { amount: '1.2' } }, + }, + errors: { 'eip155:137': 'Unprocessed by Accounts API' }, + unprocessedCustomAssets: [MOCK_TOKEN_POLYGON], + }, + { + assetsBalance: { + [MOCK_ACCOUNT_ID]: { + [MOCK_ASSET_POLYGON]: { amount: '10' }, + [MOCK_TOKEN_POLYGON]: { amount: '50' }, + }, + }, + customAssets: { [MOCK_ACCOUNT_ID]: [MOCK_TOKEN_POLYGON] }, + }, + ); + const next = jest.fn(async (innerCtx) => innerCtx); + + await mw.assetsMiddleware(ctx, next); + + expect(rpcMw).toHaveBeenCalledTimes(1); + const [rpcCtx] = rpcMw.mock.calls[0]; + expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:137']); + expect(new Set(rpcCtx.request.customAssets)).toStrictEqual( + new Set([MOCK_ASSET_POLYGON, MOCK_TOKEN_POLYGON]), + ); + }); + + it('leaves a hidden asset out of the errored-chain retry', async () => { + const { source, middleware: rpcMw } = createMockRpcSource({}); + const mw = new RpcFallbackMiddleware({ + rpcDataSource: source, + isBalanceV6Enabled: (): boolean => true, + }); + const ctx = createContext( + createDataRequest(['eip155:137']), + { errors: { 'eip155:137': 'Fetch failed' } }, + { + customAssets: { [MOCK_ACCOUNT_ID]: [MOCK_TOKEN_POLYGON] }, + assetPreferences: { [MOCK_TOKEN_POLYGON]: { hidden: true } }, + }, + ); + const next = jest.fn(async (innerCtx) => innerCtx); + + await mw.assetsMiddleware(ctx, next); + + const [rpcCtx] = rpcMw.mock.calls[0]; + expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:137']); + expect(rpcCtx.request.customAssets).toBeUndefined(); + }); + it('recovers unprocessedCustomAssets with an RPC call scoped to just those assets (via customAssets), not a whole-chain fetch', async () => { const rpcResponse: DataResponse = { assetsBalance: { @@ -325,9 +395,7 @@ describe('RpcFallbackMiddleware', () => { expect(finalCtx.response.unprocessedCustomAssets).toBeUndefined(); }); - it('skips asset-scoped recovery for assets whose chain was already retried on the chain axis', async () => { - // The chain-axis fetch (native + custom assets) already covers the token, so - // there must be no second, asset-scoped RPC call for the same chain. + it('puts an API unprocessed pin on the same RPC request as the errored chain, without a second call', async () => { const rpcResponse: DataResponse = { assetsBalance: { [MOCK_ACCOUNT_ID]: { [MOCK_TOKEN_POLYGON]: { amount: '3' } }, @@ -346,12 +414,10 @@ describe('RpcFallbackMiddleware', () => { await mw.assetsMiddleware(ctx, next); - // Only the chain-axis call — it uses the original request (no customAssets - // override to the unresolved subset). expect(rpcMw).toHaveBeenCalledTimes(1); const [rpcCtx] = rpcMw.mock.calls[0]; expect(rpcCtx.request.chainIds).toStrictEqual(['eip155:137']); - expect(rpcCtx.request.customAssets).toBeUndefined(); + expect(rpcCtx.request.customAssets).toStrictEqual([MOCK_TOKEN_POLYGON]); const finalCtx = next.mock.calls[0][0]; expect(finalCtx.response.errors).toStrictEqual({}); @@ -377,7 +443,7 @@ describe('RpcFallbackMiddleware', () => { ]); }); - it('recovers both errored chains and unprocessed assets in separate RPC calls', async () => { + it('recovers an errored chain and an unprocessed pin on another chain in one RPC call', async () => { const rpcResponse: DataResponse = { assetsBalance: { [MOCK_ACCOUNT_ID]: { @@ -399,14 +465,12 @@ describe('RpcFallbackMiddleware', () => { await mw.assetsMiddleware(ctx, next); - // One call for the errored chain (whole chain), one scoped call for the pin. - expect(rpcMw).toHaveBeenCalledTimes(2); - const chainCall = rpcMw.mock.calls[0][0]; - expect(chainCall.request.chainIds).toStrictEqual(['eip155:56']); - expect(chainCall.request.customAssets).toBeUndefined(); - const assetCall = rpcMw.mock.calls[1][0]; - expect(assetCall.request.chainIds).toStrictEqual(['eip155:1']); - expect(assetCall.request.customAssets).toStrictEqual([MOCK_TOKEN_MAINNET]); + expect(rpcMw).toHaveBeenCalledTimes(1); + const [rpcCtx] = rpcMw.mock.calls[0]; + expect(new Set(rpcCtx.request.chainIds)).toStrictEqual( + new Set(['eip155:56', 'eip155:1']), + ); + expect(rpcCtx.request.customAssets).toStrictEqual([MOCK_TOKEN_MAINNET]); const finalCtx = next.mock.calls[0][0]; expect(finalCtx.response.errors).toStrictEqual({}); diff --git a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts index e9b94773d04..ec1c9f91f4a 100644 --- a/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts +++ b/packages/assets-controller/src/middlewares/RpcFallbackMiddleware.ts @@ -39,8 +39,10 @@ const noopNext = async (ctx: Context): Promise => ctx; * Accounts API v5: chains in `response.errors`, plus EVM assets tracked in * state that this response left empty (the API omits tokens it does not index). * - * Accounts API v6: chains in `response.errors`, plus pins in - * `response.unprocessedCustomAssets`. + * Accounts API v6: one RPC retry. `customAssets` is the union of + * `response.unprocessedCustomAssets` (trust the API) and every tracked + * asset on chains in `response.errors` (so a `full` update cannot drop + * imported or previously detected tokens on a failed chain). */ export class RpcFallbackMiddleware { readonly name = CONTROLLER_NAME; @@ -72,29 +74,65 @@ export class RpcFallbackMiddleware { const erroredChains = new Set( Object.keys(ctx.response.errors ?? {}) as ChainId[], ); - const unprocessedCustomAssets = [ + const unprocessedAssetsPins = [ ...new Set(ctx.response.unprocessedCustomAssets ?? []), ]; + const assetsOnErroredChains = collectTrackedAssetsOnChains( + ctx, + erroredChains, + ); + const customAssets = [ + ...new Set([...unprocessedAssetsPins, ...assetsOnErroredChains]), + ]; + const chainsToFetch = [ + ...new Set([ + ...ctx.request.chainIds.filter((id) => erroredChains.has(id)), + ...customAssets.map((assetId) => chainIdOfAsset(assetId)), + ]), + ]; - if (erroredChains.size === 0 && unprocessedCustomAssets.length === 0) { + if (chainsToFetch.length === 0) { return next(ctx); } - let merged: DataResponse = ctx.response; - - if (erroredChains.size > 0) { - merged = await this.#recoverErroredChains(ctx, merged, erroredChains); - } + const rpcRequest: DataRequest = { + ...ctx.request, + chainIds: chainsToFetch, + ...(customAssets.length > 0 ? { customAssets } : {}), + }; + const rpcResult = await this.#rpcDataSource.assetsMiddleware( + { ...ctx, request: rpcRequest, response: {} }, + noopNext, + ); - const assetsToRecover = unprocessedCustomAssets.filter( - (assetId) => !erroredChains.has(chainIdOfAsset(assetId)), + const rpcFailedChains = new Set( + Object.keys(rpcResult.response.errors ?? {}) as ChainId[], + ); + const rpcAssetsBalance = filterOutChainBalances( + rpcResult.response.assetsBalance, + rpcFailedChains, ); - if (assetsToRecover.length > 0) { - merged = await this.#recoverUnprocessedAssets( - ctx, - merged, - assetsToRecover, - ); + + let merged = mergeDataResponses([ + ctx.response, + { + ...rpcResult.response, + assetsBalance: rpcAssetsBalance, + }, + ]); + + if (merged.errors && rpcAssetsBalance) { + const chainsRecoveredByRpc = new Set(); + for (const accountBalances of Object.values(rpcAssetsBalance)) { + for (const assetId of Object.keys(accountBalances)) { + chainsRecoveredByRpc.add(assetId.split('/')[0]); + } + } + for (const chainId of erroredChains) { + if (chainsRecoveredByRpc.has(chainId)) { + delete merged.errors[chainId]; + } + } } merged = clearRecoveredAssetIds(merged); @@ -181,85 +219,55 @@ export class RpcFallbackMiddleware { return next({ ...ctx, response: merged }); } +} - async #recoverErroredChains( - ctx: Context, - currentResponse: DataResponse, - erroredChains: Set, - ): Promise { - log('Retrying failed chains on RPC', { chains: [...erroredChains] }); - - const chainRequest: DataRequest = { - ...ctx.request, - chainIds: ctx.request.chainIds.filter((id) => erroredChains.has(id)), - }; - const rpcResult = await this.#rpcDataSource.assetsMiddleware( - { ...ctx, request: chainRequest, response: {} }, - noopNext, - ); - - const rpcFailedChains = new Set( - Object.keys(rpcResult.response.errors ?? {}) as ChainId[], - ); - const rpcAssetsBalance = filterOutChainBalances( - rpcResult.response.assetsBalance, - rpcFailedChains, - ); +function chainIdOfAsset(assetId: Caip19AssetId): ChainId { + return assetId.split('/')[0] as ChainId; +} - const merged = mergeDataResponses([ - currentResponse, - { - ...rpcResult.response, - assetsBalance: rpcAssetsBalance, - }, - ]); +/** + * Every EVM asset already in state on `chains` — balances and pins — so an RPC + * retry of a failed chain re-reads the whole slice, not natives only. Hidden + * assets are left out, matching the `excludeAssetIds` the Accounts API is sent. + * Staking vaults belong to `StakedBalanceDataSource` and are skipped. + * + * @param ctx - Pipeline context, for request accounts and assets state. + * @param chains - Chains being recovered on RPC. + * @returns Deduplicated asset IDs on those chains. + */ +function collectTrackedAssetsOnChains( + ctx: Context, + chains: Set, +): Caip19AssetId[] { + if (chains.size === 0) { + return []; + } - if (merged.errors && rpcAssetsBalance) { - const chainsRecoveredByRpc = new Set(); - for (const accountBalances of Object.values(rpcAssetsBalance)) { - for (const assetId of Object.keys(accountBalances)) { - chainsRecoveredByRpc.add(assetId.split('/')[0]); - } - } - for (const chainId of erroredChains) { - if (chainsRecoveredByRpc.has(chainId)) { - delete merged.errors[chainId]; - } + const { + assetsBalance, + customAssets: statePins, + assetPreferences, + } = ctx.getAssetsState(); + const tracked = new Set(); + + for (const { account } of ctx.request.accountsWithSupportedChains) { + const balanceIds = Object.keys( + assetsBalance[account.id] ?? {}, + ) as Caip19AssetId[]; + const pinIds = statePins?.[account.id] ?? []; + for (const assetId of [...balanceIds, ...pinIds]) { + if ( + chains.has(chainIdOfAsset(assetId)) && + assetId.startsWith(`${KnownCaipNamespace.Eip155}:`) && + !isStakingContractAssetId(assetId) && + !assetPreferences?.[normalizeAssetId(assetId)]?.hidden + ) { + tracked.add(assetId); } } - - return merged; - } - - async #recoverUnprocessedAssets( - ctx: Context, - currentResponse: DataResponse, - assetsToRecover: Caip19AssetId[], - ): Promise { - const assetChains = [ - ...new Set(assetsToRecover.map((assetId) => chainIdOfAsset(assetId))), - ]; - - log('Recovering unprocessed pinned assets on RPC', { - assetIds: assetsToRecover, - }); - - const assetRequest: DataRequest = { - ...ctx.request, - chainIds: assetChains, - customAssets: assetsToRecover, - }; - const rpcResult = await this.#rpcDataSource.assetsMiddleware( - { ...ctx, request: assetRequest, response: {} }, - noopNext, - ); - - return mergeDataResponses([currentResponse, rpcResult.response]); } -} -function chainIdOfAsset(assetId: Caip19AssetId): ChainId { - return assetId.split('/')[0] as ChainId; + return [...tracked]; } function clearRecoveredAssetIds(response: DataResponse): DataResponse { From 2a52b799b4ee822168b516c1e7c7b7bbc92a166c Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Wed, 23 Sep 2026 00:32:22 +0200 Subject: [PATCH 14/25] fix v6 force update skips RPC custom tokens --- packages/assets-controller/CHANGELOG.md | 3 +- .../assets-controller/src/AssetsController.ts | 1 + .../src/data-sources/RpcDataSource.test.ts | 179 +++++++++++++++++- .../src/data-sources/RpcDataSource.ts | 75 +++++--- ...c-spam-token-filtering.integration.test.ts | 1 + 5 files changed, 227 insertions(+), 32 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index a2ee53ae712..c3e68cd27be 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING:** Remove `'update'` from `AssetsUpdateMode`; use `'full'` (Accounts API v6 snapshot) or `'merge'` ([#9651](https://github.com/MetaMask/core/pull/9651)) - **BREAKING:** Remove the `updateMode` option from `AssetsController.getAssets`; the data source now sets it on its response ([#9651](https://github.com/MetaMask/core/pull/9651)) -- **BREAKING:** Require `getAssetsState` in `AccountsApiDataSourceOptions` ([#9651](https://github.com/MetaMask/core/pull/9651)) +- **BREAKING:** Require `getAssetsState` in `AccountsApiDataSourceOptions` and `RpcDataSourceOptions` ([#9651](https://github.com/MetaMask/core/pull/9651)) - Pass `() => this.state` from `AssetsController` - When `assetsAccountsApiV6` is enabled, Accounts API v6 reads pins and hides from state and sends them as `includeAssetIds` / `excludeAssetIds`, then applies the response with `updateMode: 'full'` ([#9651](https://github.com/MetaMask/core/pull/9651)) - `hideAsset` and `unhideAsset` now re-evaluate subscriptions, so live polls start and stop excluding the asset immediately ([#9651](https://github.com/MetaMask/core/pull/9651)) @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- `RpcDataSource.fetch` now falls back to the account's visible `customAssets` in state when a request carries no `customAssets` scope, matching `AccountsApiDataSource`, so a force refresh picks up pinned tokens on RPC-only chains and when basic functionality is off instead of leaving them until the next poll ([#9651](https://github.com/MetaMask/core/pull/9651)) - Treat the `assetsAccountsApiV6` remote feature flag as enabled when it is `true`, instead of reading a nested `{ value }` object ([#9651](https://github.com/MetaMask/core/pull/9651)) - Keep default tracked assets (mUSD) at a zero balance when an Accounts API v6 `full` update omits them, so a force refresh no longer drops them from the token list ([#9651](https://github.com/MetaMask/core/pull/9651)) - Skip `#updateState` assignments for metadata, balances, and prices that are deep-equal to what's already in state, so Immer no longer emits a no-op `stateChange` (and a full state persist) on every poll that repeats unchanged data ([#10260](https://github.com/MetaMask/core/pull/10260)) diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 1c6a58de179..91b7883c438 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1049,6 +1049,7 @@ export class AssetsController extends BaseController< }); this.#rpcDataSource = new RpcDataSource({ messenger: this.messenger, + getAssetsState: (): AssetsControllerStateInternal => this.state, onActiveChainsUpdated: this.#onActiveChainsUpdated, getNativeAssetForChain: (chainId: ChainId): Caip19AssetId => this.#getNativeAssetMap()[chainId] ?? diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 74063c8d6d2..74474c71531 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -246,6 +246,19 @@ async function withController( return isNative ? 'native' : 'erc20'; }, ...options, + getAssetsState: + options.getAssetsState ?? + ((): AssetsControllerState => { + try { + return ( + (actionHandlerOverrides?.['AssetsController:getState']?.() as + | AssetsControllerState + | undefined) ?? getDefaultAssetsControllerState() + ); + } catch { + return getDefaultAssetsControllerState(); + } + }), }); try { @@ -296,6 +309,7 @@ describe('createRpcDataSource', () => { const { assetsControllerMessenger } = createMockMessengers(); const source = createRpcDataSource({ messenger: assetsControllerMessenger, + getAssetsState: getDefaultAssetsControllerState, onActiveChainsUpdated: jest.fn(), getNativeAssetForChain: jest.fn(), getAssetType: jest.fn(), @@ -811,7 +825,7 @@ describe('RpcDataSource', () => { ); }); - it('handles AssetsController:getState throw in metadata lookup', async () => { + it('handles AssetsController:getState throw without failing fetch metadata', async () => { await withController( { actionHandlerOverrides: { @@ -918,6 +932,168 @@ describe('RpcDataSource', () => { fetchSpy.mockRestore(); }); + + it('fetches the account custom assets in state when the request carries none', async () => { + const pinnedAsset = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [pinnedAsset] }, + }), + }, + }, + async ({ controller }) => { + await controller.fetch(createDataRequest()); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + expect.objectContaining({ + assetId: pinnedAsset, + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }), + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); + + it('fetches only the request custom assets when the request is scoped', async () => { + const requestedAsset = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + const otherPinnedAsset = + 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { + [MOCK_ACCOUNT_ID]: [requestedAsset, otherPinnedAsset], + }, + }), + }, + }, + async ({ controller }) => { + // A scoped fetch (e.g. addCustomAsset) must not widen into the + // account's other pins — the subscription poll covers those. + await controller.fetch( + createDataRequest({ customAssets: [requestedAsset] }), + ); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + expect.objectContaining({ assetId: requestedAsset }), + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); + + it('skips hidden custom assets from state', async () => { + const hiddenAsset = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { [MOCK_ACCOUNT_ID]: [hiddenAsset] }, + assetPreferences: { [hiddenAsset]: { hidden: true } }, + }), + }, + }, + async ({ controller }) => { + await controller.fetch(createDataRequest()); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); + + it('does not fetch custom assets belonging to another account', async () => { + const otherAccountAsset = + 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; + + const fetchSpy = jest + .spyOn(BalanceFetcher.prototype, 'fetchBalancesForAssets') + .mockResolvedValue(createBalanceFetchResult()); + + await withController( + { + actionHandlerOverrides: { + 'AssetsController:getState': () => ({ + ...getDefaultAssetsControllerState(), + customAssets: { 'other-account-id': [otherAccountAsset] }, + }), + }, + }, + async ({ controller }) => { + await controller.fetch(createDataRequest()); + + expect(fetchSpy).toHaveBeenCalledWith( + MOCK_CHAIN_ID_HEX, + MOCK_ACCOUNT_ID, + MOCK_ADDRESS, + [ + { + assetId: `${MOCK_CHAIN_ID_CAIP}/slip44:60`, + address: '0x0000000000000000000000000000000000000000', + }, + ], + ); + }, + ); + + fetchSpy.mockRestore(); + }); }); describe('detectTokens', () => { @@ -2095,6 +2271,7 @@ describe('RpcDataSource', () => { }); const controller = new RpcDataSource({ messenger: assetsControllerMessenger, + getAssetsState: getDefaultAssetsControllerState, onActiveChainsUpdated: jest.fn(), getNativeAssetForChain: jest.fn(), getAssetType: jest.fn().mockReturnValue('erc20'), diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index 26cb0bb1b6e..c6d9e7fa7be 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -34,6 +34,7 @@ import type { Caip19AssetId, AssetBalance, AssetMetadata, + AssetsControllerStateInternal, DataRequest, DataResponse, Middleware, @@ -117,6 +118,11 @@ export type RpcDataSourceConfig = { export type RpcDataSourceOptions = { /** The AssetsController messenger (shared by all data sources). */ messenger: AssetsControllerMessenger; + /** + * Current AssetsController state. Used to include the account's visible + * `customAssets` on fetch, and to read metadata for converting balances. + */ + getAssetsState: () => AssetsControllerStateInternal; /** Called when active chains are updated. Pass dataSourceName so the controller knows the source. */ onActiveChainsUpdated: ( dataSourceName: string, @@ -208,6 +214,8 @@ export class RpcDataSource extends AbstractDataSource< > { readonly #messenger: AssetsControllerMessenger; + readonly #getAssetsState: () => AssetsControllerStateInternal; + readonly #onActiveChainsUpdated: ( dataSourceName: string, chains: ChainId[], @@ -252,6 +260,7 @@ export class RpcDataSource extends AbstractDataSource< constructor(options: RpcDataSourceOptions) { super(CONTROLLER_NAME, { activeChains: [] }); this.#messenger = options.messenger; + this.#getAssetsState = options.getAssetsState; this.#onActiveChainsUpdated = options.onActiveChainsUpdated; this.#getNativeAssetForChain = options.getNativeAssetForChain; this.#getAssetType = options.getAssetType; @@ -1040,14 +1049,12 @@ export class RpcDataSource extends AbstractDataSource< assetsToFetch.push({ assetId: nativeAssetId, address: ZERO_ADDRESS }); } - if (request.customAssets) { - this.#appendRequestCustomErc20s( - assetsToFetch, - request.customAssets, - chainId, - this.#getExistingAssetsMetadata(), - ); - } + this.#appendCustomErc20s( + assetsToFetch, + request.customAssets, + accountId, + chainId, + ); try { const result = await this.#balanceFetcher.fetchBalancesForAssets( @@ -1495,37 +1502,51 @@ export class RpcDataSource extends AbstractDataSource< } /** - * Include every `request.customAssets` ERC-20 on this chain. The selected - * group has at most one EVM account, so there is no per-account ownership - * filter. + * Append the ERC-20 pins this account-chain fetch must cover. + * + * Prefers `request.customAssets` when the caller scoped the fetch (e.g. + * `addCustomAsset`). Otherwise reads the + * account's visible pins from state: RPC is their sole balance fetcher, and + * `fetch` builds its own entry list rather than going through + * `BalanceFetcher`'s state read (which polling uses), so an unscoped request + * would otherwise leave them stale until the next poll. * * @param assetsToFetch - Native/custom entries for this account-chain fetch. - * @param customAssets - Flat pin list from the data request. + * @param requestCustomAssets - Flat pin list from the data request, if scoped. + * @param accountId - Account being fetched. * @param chainId - Chain being fetched. - * @param existingMetadata - Metadata already in AssetsController state. */ - #appendRequestCustomErc20s( + #appendCustomErc20s( assetsToFetch: AssetFetchEntry[], - customAssets: Caip19AssetId[], + requestCustomAssets: Caip19AssetId[] | undefined, + accountId: string, chainId: ChainId, - existingMetadata: Record, ): void { - for (const assetId of customAssets) { + const { + assetsInfo = {}, + customAssets = {}, + assetPreferences = {}, + } = this.#getAssetsState(); + const candidates = + requestCustomAssets && requestCustomAssets.length > 0 + ? requestCustomAssets + : (customAssets[accountId] ?? []).filter( + (assetId) => !assetPreferences[normalizeAssetId(assetId)]?.hidden, + ); + + for (const assetId of candidates) { try { const parsed = parseCaipAssetType(assetId); const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`; + const normalizedId = normalizeAssetId(assetId); if ( assetChainId === chainId && this.#getAssetType(assetId) === 'erc20' ) { - const tokenAddress = parsed.assetReference.toLowerCase() as Address; - const normalizedId = normalizeAssetId(assetId); - const decimals = existingMetadata[normalizedId]?.decimals; - assetsToFetch.push({ assetId, - address: tokenAddress, - decimals, + address: parsed.assetReference.toLowerCase() as Address, + decimals: assetsInfo[normalizedId]?.decimals, }); } } catch { @@ -1541,13 +1562,7 @@ export class RpcDataSource extends AbstractDataSource< * @returns Record of asset IDs to their metadata. */ #getExistingAssetsMetadata(): Record { - try { - const state = this.#messenger.call('AssetsController:getState'); - return state.assetsInfo ?? {}; - } catch (error) { - log('Failed to get existing assets metadata', { error }); - return {}; - } + return this.#getAssetsState().assetsInfo ?? {}; } /** diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts index c336d73129e..e7c4ca85639 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts @@ -126,6 +126,7 @@ async function runPipeline( const rpcDataSource = new RpcDataSource({ messenger: assetsControllerMessenger, + getAssetsState: (): AssetsControllerStateInternal => state, onActiveChainsUpdated: jest.fn(), getNativeAssetForChain: (): Caip19AssetId => BNB_ASSET_ID, getAssetType: (assetId): 'native' | 'erc20' => From 1e64d9d58dcc0ab0aac1146ef5167a6b8ebddc75 Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Wed, 23 Sep 2026 00:37:56 +0200 Subject: [PATCH 15/25] fix Detection middleware runs twice on v5 --- packages/assets-controller/src/AssetsController.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 91b7883c438..16b55917ffe 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -4191,7 +4191,6 @@ export class AssetsController extends BaseController< ...(shouldRunRpcFallback ? [this.#rpcFallbackMiddleware] : []), this.#detectionMiddleware, ]; - enrichmentSources.push(this.#detectionMiddleware); if (this.#isBasicFunctionality()) { enrichmentSources.push( createParallelMiddleware([ From 317ae9ad36a41f652856d05a17bf3144685d839b Mon Sep 17 00:00:00 2001 From: Kriys94 Date: Wed, 23 Sep 2026 10:25:01 +0200 Subject: [PATCH 16/25] fix Scoped fetch drops other custom tokens --- packages/assets-controller/CHANGELOG.md | 2 +- .../docs/architecture/v1/CHANGES.md | 2 +- .../src/AssetsController.test.ts | 174 +++--------------- .../assets-controller/src/AssetsController.ts | 94 ++-------- .../src/data-sources/AccountsApiDataSource.ts | 4 +- .../src/data-sources/RpcDataSource.test.ts | 3 +- .../src/data-sources/RpcDataSource.ts | 4 +- packages/assets-controller/src/types.ts | 4 +- 8 files changed, 52 insertions(+), 235 deletions(-) diff --git a/packages/assets-controller/CHANGELOG.md b/packages/assets-controller/CHANGELOG.md index c3e68cd27be..3ae925b9724 100644 --- a/packages/assets-controller/CHANGELOG.md +++ b/packages/assets-controller/CHANGELOG.md @@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Add optional `customAssets` to `AssetsController.getAssets`, to scope a fetch to specific asset IDs (Accounts API v6 only) ([#9651](https://github.com/MetaMask/core/pull/9651)) - Add optional `unprocessedCustomAssets` to `DataResponse`, listing pinned asset IDs a source could not resolve so `RpcFallbackMiddleware` can recover them ([#9651](https://github.com/MetaMask/core/pull/9651)) - Add optional `isBalanceV6Enabled` to `AccountsApiDataSourceOptions` and `RpcFallbackMiddlewareOptions`, so the `assetsAccountsApiV6` flag is read once by `AssetsController` and injected ([#9651](https://github.com/MetaMask/core/pull/9651)) @@ -25,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- `addCustomAsset` on the Accounts API v6 path now force-fetches the token's chain with all visible pins, instead of scoping `customAssets` to the new token, so a `full` snapshot no longer drops other pinned balances until the next poll - `RpcDataSource.fetch` now falls back to the account's visible `customAssets` in state when a request carries no `customAssets` scope, matching `AccountsApiDataSource`, so a force refresh picks up pinned tokens on RPC-only chains and when basic functionality is off instead of leaving them until the next poll ([#9651](https://github.com/MetaMask/core/pull/9651)) - Treat the `assetsAccountsApiV6` remote feature flag as enabled when it is `true`, instead of reading a nested `{ value }` object ([#9651](https://github.com/MetaMask/core/pull/9651)) - Keep default tracked assets (mUSD) at a zero balance when an Accounts API v6 `full` update omits them, so a force refresh no longer drops them from the token list ([#9651](https://github.com/MetaMask/core/pull/9651)) diff --git a/packages/assets-controller/docs/architecture/v1/CHANGES.md b/packages/assets-controller/docs/architecture/v1/CHANGES.md index 377052aa256..c036d5b1878 100644 --- a/packages/assets-controller/docs/architecture/v1/CHANGES.md +++ b/packages/assets-controller/docs/architecture/v1/CHANGES.md @@ -172,7 +172,7 @@ In other words: v5 never runs `RpcFallbackMiddleware` here, and v6 never runs | Concern | v5 | v6 | | --------------------- | ------------------------------------------ | --------------------------------------------------------------------- | -| Force-update request | `#buildForceUpdateRequestV5` | `#buildForceUpdateRequestV6` | +| Force-update request | `#buildForceUpdateRequestV5` | `#buildDataRequest` (pins read from state) | | Force-update pipeline | `#forceUpdateAssetsV5`, `#runFastFetchV5` | `#forceUpdateAssetsV6`, `#runFastFetchV6` | | Fast lane composition | `buildFastFetchSources` (graduation on) | `buildFastFetchSources` (graduation off) | | Subscribe | `#subscribeAssetsBalance` + RPC supplement | `#subscribeAssetsBalance`; Accounts API v6 include/exclude from state | diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index 6e464bd582d..b539c4070dc 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -712,45 +712,53 @@ describe('AssetsController', () => { }); }); - it('fetches only the newly added asset instead of every pinned asset', async () => { + it('force-fetches the asset chain with every pinned token as includeAssetIds', async () => { // Use a valid checksummed address (DAI token address) const secondAssetId = 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F' as Caip19AssetId; - const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; - const accountsApiMiddleware = jest.fn(async (ctx, next) => { - capturedCustomAssets.push(ctx.request.customAssets); - return next(ctx); + const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ + accounts: [], + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], }); - const middlewareGetter = jest - .spyOn( - AccountsApiDataSource.prototype, - 'assetsMiddleware', - // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. - 'get', - ) - .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; + const queryApiClient = { + ...createMockQueryApiClient(), + accounts: { + fetchV2SupportedNetworks: jest.fn().mockResolvedValue({ + fullSupport: [1], + partialSupport: [], + }), + fetchV6MultiAccountBalances, + fetchV5MultiAccountBalances: jest.fn().mockResolvedValue({ + balances: [], + unprocessedNetworks: [], + }), + }, + } as unknown as ApiPlatformClient; await withController( { + queryApiClient, remoteFeatureFlags: { assetsAccountsApiV6: true }, }, async ({ controller }) => { - await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); + await flushPromises(); - capturedCustomAssets.length = 0; + await controller.addCustomAsset(MOCK_ACCOUNT_ID, MOCK_ASSET_ID); + fetchV6MultiAccountBalances.mockClear(); await controller.addCustomAsset(MOCK_ACCOUNT_ID, secondAssetId); }, ); - // The fetch triggered by adding the second pin must not re-request the - // first pin — the subscription refresh covers it on the next poll. - expect(capturedCustomAssets.length).toBeGreaterThan(0); - for (const customAssets of capturedCustomAssets) { - expect(customAssets).toStrictEqual([secondAssetId]); + // The v6 snapshot is applied as `updateMode: 'full'`, so every pin on + // the chain must be requested — otherwise other custom tokens drop. + expect(fetchV6MultiAccountBalances).toHaveBeenCalled(); + for (const [, params] of fetchV6MultiAccountBalances.mock.calls) { + expect(params?.includeAssetIds ?? []).toStrictEqual( + expect.arrayContaining([MOCK_ASSET_ID, secondAssetId]), + ); } - - middlewareGetter.mockRestore(); }); it('does not overwrite an existing balance when re-adding a custom asset', async () => { @@ -1625,128 +1633,6 @@ describe('AssetsController', () => { } }); - it('uses the customAssets option instead of state-pinned assets when provided', async () => { - const pinnedToken = - 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Caip19AssetId; - const requestedToken = - 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F' as Caip19AssetId; - - const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; - const accountsApiMiddleware = jest.fn(async (ctx, next) => { - capturedCustomAssets.push(ctx.request.customAssets); - return next(ctx); - }); - const middlewareGetter = jest - .spyOn( - AccountsApiDataSource.prototype, - 'assetsMiddleware', - // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. - 'get', - ) - .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; - - await withController( - { - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }, - async ({ controller }) => { - await controller.addCustomAsset(MOCK_ACCOUNT_ID, pinnedToken); - await controller.addCustomAsset(MOCK_ACCOUNT_ID, requestedToken); - - capturedCustomAssets.length = 0; - await controller.getAssets([createMockInternalAccount()], { - chainIds: ['eip155:1'], - forceUpdate: true, - customAssets: [requestedToken], - }); - }, - ); - - expect(capturedCustomAssets.length).toBeGreaterThan(0); - for (const customAssets of capturedCustomAssets) { - expect(customAssets).toStrictEqual([requestedToken]); - } - - middlewareGetter.mockRestore(); - }); - - it('scopes the customAssets option to the requested chains and drops invalid IDs', async () => { - const polygonToken = - 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Caip19AssetId; - - const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; - const accountsApiMiddleware = jest.fn(async (ctx, next) => { - capturedCustomAssets.push(ctx.request.customAssets); - return next(ctx); - }); - const middlewareGetter = jest - .spyOn( - AccountsApiDataSource.prototype, - 'assetsMiddleware', - // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. - 'get', - ) - .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; - - await withController( - { - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }, - async ({ controller }) => { - await controller.getAssets([createMockInternalAccount()], { - chainIds: ['eip155:1'], - forceUpdate: true, - customAssets: [polygonToken, 'not-a-caip-id' as Caip19AssetId], - }); - }, - ); - - // The off-chain pin and the unparseable ID are both dropped, leaving no - // custom assets on the request. - expect(capturedCustomAssets.length).toBeGreaterThan(0); - for (const customAssets of capturedCustomAssets) { - expect(customAssets).toBeUndefined(); - } - - middlewareGetter.mockRestore(); - }); - - it('normalizes asset IDs passed via the customAssets option', async () => { - const capturedCustomAssets: (Caip19AssetId[] | undefined)[] = []; - const accountsApiMiddleware = jest.fn(async (ctx, next) => { - capturedCustomAssets.push(ctx.request.customAssets); - return next(ctx); - }); - const middlewareGetter = jest - .spyOn( - AccountsApiDataSource.prototype, - 'assetsMiddleware', - // @ts-expect-error -- Jest supports `get` for accessor spies; `Spyable` typings omit prototype getters. - 'get', - ) - .mockReturnValue(accountsApiMiddleware) as unknown as jest.SpyInstance; - - await withController( - { - remoteFeatureFlags: { assetsAccountsApiV6: true }, - }, - async ({ controller }) => { - await controller.getAssets([createMockInternalAccount()], { - chainIds: ['eip155:1'], - forceUpdate: true, - customAssets: [MOCK_ASSET_ID_LOWERCASE], - }); - }, - ); - - expect(capturedCustomAssets.length).toBeGreaterThan(0); - for (const customAssets of capturedCustomAssets) { - expect(customAssets).toStrictEqual([MOCK_ASSET_ID]); - } - - middlewareGetter.mockRestore(); - }); - it('forwards user-hidden assets to the Accounts API v6 endpoint as excludeAssetIds', async () => { const fetchV6MultiAccountBalances = jest.fn().mockResolvedValue({ accounts: [], diff --git a/packages/assets-controller/src/AssetsController.ts b/packages/assets-controller/src/AssetsController.ts index 16b55917ffe..b615ede647d 100644 --- a/packages/assets-controller/src/AssetsController.ts +++ b/packages/assets-controller/src/AssetsController.ts @@ -1577,12 +1577,6 @@ export class AssetsController extends BaseController< bypassServerCache?: boolean; dataTypes?: DataType[]; assetsForPriceUpdate?: Caip19AssetId[]; - /** - * v6 only: pinned assets to attach instead of every pin in state. - * Ignored when `assetsAccountsApiV6` is off. Entries outside the - * requested chains are dropped. - */ - customAssets?: Caip19AssetId[]; }, ): Promise>> { const chainIds = options?.chainIds ?? [...this.#enabledChains]; @@ -1609,10 +1603,7 @@ export class AssetsController extends BaseController< await this.#forceUpdateAssetsV6({ accounts, chainIds, - request: this.#buildForceUpdateRequestV6(accounts, chainIds, { - ...requestOptions, - customAssetsOverride: options?.customAssets, - }), + request: this.#buildDataRequest(accounts, chainIds, requestOptions), pipelineTrace, }); } else { @@ -1669,60 +1660,6 @@ export class AssetsController extends BaseController< }); } - /** - * v6 force-update request. Pins and hides are read from state by the - * Accounts API unless `customAssetsOverride` scopes this fetch. - * - * @param accounts - Accounts in this fetch. - * @param chainIds - Chains in this fetch. - * @param requestOptions - Shared force-update request fields and optional pin scope. - * @param requestOptions.assetTypes - Asset types to fetch. - * @param requestOptions.dataTypes - Data types to fetch. - * @param requestOptions.forceUpdate - Always `true` to bypass caches. - * @param requestOptions.bypassServerCache - Also bypass server-side HTTP caches. - * @param requestOptions.assetsForPriceUpdate - Assets to refresh prices for. - * @param requestOptions.customAssetsOverride - When set, fetch only these pins. - * @returns The v6 data request. - */ - #buildForceUpdateRequestV6( - accounts: InternalAccount[], - chainIds: ChainId[], - requestOptions: { - assetTypes: AssetType[]; - dataTypes: DataType[]; - forceUpdate: true; - bypassServerCache?: boolean; - assetsForPriceUpdate?: Caip19AssetId[]; - customAssetsOverride?: Caip19AssetId[]; - }, - ): DataRequest { - const requestedChains = new Set(chainIds); - const customAssetsSet = new Set(); - for (const assetId of requestOptions.customAssetsOverride ?? []) { - try { - const normalizedAssetId = normalizeAssetId(assetId); - if ( - requestedChains.has(parseCaipAssetType(normalizedAssetId).chainId) && - !this.state.assetPreferences[normalizedAssetId]?.hidden - ) { - customAssetsSet.add(normalizedAssetId); - } - } catch { - // Skip unparseable asset IDs - } - } - const customAssets = [...customAssetsSet]; - - return this.#buildDataRequest(accounts, chainIds, { - assetTypes: requestOptions.assetTypes, - dataTypes: requestOptions.dataTypes, - forceUpdate: requestOptions.forceUpdate, - bypassServerCache: requestOptions.bypassServerCache, - assetsForPriceUpdate: requestOptions.assetsForPriceUpdate, - customAssets: customAssets.length > 0 ? customAssets : undefined, - }); - } - async #forceUpdateAssetsV5({ accounts, chainIds, @@ -2295,7 +2232,8 @@ export class AssetsController extends BaseController< /** * Add a custom asset for an account. * Custom assets are included in subscription and fetch operations. - * Adding a custom asset also unhides it if it was previously hidden. + * Adding a custom asset also unhides it if it was previously hidden, + * and force-fetches that asset's chain (including every visible pin). * * When `pendingMetadata` is provided (e.g. from the extension's pending-tokens * flow), the token metadata is persisted immediately into `assetsInfo` so the @@ -2374,22 +2312,16 @@ export class AssetsController extends BaseController< const account = this.#getSelectedAccounts().find((a) => a.id === accountId); if (account) { const chainId = extractChainId(normalizedAssetId); - if (this.#isBalanceV6Enabled()) { - await this.getAssets([account], { - chainIds: [chainId], - dataTypes: ['balance', 'metadata', 'price'], - assetTypes: ['fungible'], - forceUpdate: true, - customAssets: [normalizedAssetId], - }); - } else { - await this.getAssets([account], { - chainIds: [chainId], - dataTypes: ['balance', 'metadata', 'price'], - assetTypes: ['fungible'], - forceUpdate: true, - }); - } + // Same force-update on both paths: the token's chain, every pin from + // state. v5 already did this (merge + all pins on the request). v6 + // must too, because it applies `updateMode: 'full'` and reads pins + // as `includeAssetIds` — a single-token override would wipe others. + await this.getAssets([account], { + chainIds: [chainId], + dataTypes: ['balance', 'metadata', 'price'], + assetTypes: ['fungible'], + forceUpdate: true, + }); } // Re-evaluate subscriptions so polls pick up the new pin. diff --git a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts index 370010cd916..8baad6acafb 100644 --- a/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts +++ b/packages/assets-controller/src/data-sources/AccountsApiDataSource.ts @@ -558,8 +558,8 @@ export class AccountsApiDataSource extends AbstractDataSource< * endpoint as `includeAssetIds`; malformed IDs are skipped and hidden * assets are left out (a hide wins). * - * Prefers `request.customAssets` when the caller scoped the fetch (e.g. - * `addCustomAsset`). Otherwise reads visible pins from controller state. + * Prefers `request.customAssets` when the caller scoped the fetch. + * Otherwise reads visible pins from controller state. * * @param request - The data request (optional `customAssets` scope). * @param chainsToFetch - Chains being requested this fetch. diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts index 74474c71531..cee00c32fba 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.test.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.test.ts @@ -996,8 +996,7 @@ describe('RpcDataSource', () => { }, }, async ({ controller }) => { - // A scoped fetch (e.g. addCustomAsset) must not widen into the - // account's other pins — the subscription poll covers those. + // A scoped fetch must not widen into the account's other pins. await controller.fetch( createDataRequest({ customAssets: [requestedAsset] }), ); diff --git a/packages/assets-controller/src/data-sources/RpcDataSource.ts b/packages/assets-controller/src/data-sources/RpcDataSource.ts index c6d9e7fa7be..0b45a7a6c6c 100644 --- a/packages/assets-controller/src/data-sources/RpcDataSource.ts +++ b/packages/assets-controller/src/data-sources/RpcDataSource.ts @@ -1504,8 +1504,8 @@ export class RpcDataSource extends AbstractDataSource< /** * Append the ERC-20 pins this account-chain fetch must cover. * - * Prefers `request.customAssets` when the caller scoped the fetch (e.g. - * `addCustomAsset`). Otherwise reads the + * Prefers `request.customAssets` when the caller scoped the fetch. + * Otherwise reads the * account's visible pins from state: RPC is their sole balance fetcher, and * `fetch` builds its own entry list rather than going through * `BalanceFetcher`'s state read (which polling uses), so an unscoped request diff --git a/packages/assets-controller/src/types.ts b/packages/assets-controller/src/types.ts index 8d715d6dc35..2bc2e7e8948 100644 --- a/packages/assets-controller/src/types.ts +++ b/packages/assets-controller/src/types.ts @@ -344,8 +344,8 @@ export type DataRequest = { dataTypes: DataType[]; /** * Optional scoped CAIP-19 asset IDs for this fetch (not the full pin list). - * Used by `getAssets({ customAssets })`, `addCustomAsset`, and RPC fallback - * recovery. When omitted, v6 sources read pins from controller state. + * Used by RPC fallback recovery and the v5 force-update pin list. When + * omitted, v6 sources read pins from controller state. */ customAssets?: Caip19AssetId[]; /** From b84ce04dfa42e65f9c3e5575676888edaa0c5360 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Wed, 23 Sep 2026 15:07:49 +0100 Subject: [PATCH 17/25] test: add v6 integration test suite --- ...tering.accounts-api-v6.integration.test.ts | 312 ++++++++++++ ...c-spam-token-filtering.integration.test.ts | 65 ++- .../accounts-api/v6-multiaccount-balances.ts | 466 ++++++++++++++++++ .../bsc-spam-token/api-responses/index.ts | 223 +++++++-- ...tering.accounts-api-v6.integration.test.ts | 368 ++++++++++++++ ...c-spam-token-filtering.integration.test.ts | 17 +- 6 files changed, 1405 insertions(+), 46 deletions(-) create mode 100644 packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts create mode 100644 packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/accounts-api/v6-multiaccount-balances.ts create mode 100644 packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts new file mode 100644 index 00000000000..0ad5ad6dbb5 --- /dev/null +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -0,0 +1,312 @@ +import type { ApiPlatformClient } from '@metamask/core-backend'; +import { cleanAll } from 'nock'; + +import { mockBscSpamApisV6 } from './__fixtures__/bsc-spam-token/api-responses/index.js'; +import type { V6BalancesMock } from './__fixtures__/bsc-spam-token/api-responses/index.js'; +import { + buildBscSpamAccount, + buildEmptyAssetsState, + getIgnoringCase, +} from './__fixtures__/bsc-spam-token/bscSpamWallet.js'; +import { registerBscSpamControllerActions } from './__fixtures__/bsc-spam-token/messenger.js'; +import { + BNB_ASSET_ID, + BSC_CHAIN_ID, + BSC_SPAM_ACCOUNT_ID, + CDOGE_ASSET_ID_CHECKSUM, + CDOGE_ASSET_ID_LOWERCASE, +} from './__fixtures__/bsc-spam-token/wallet.js'; +import { createMockMessengers } from './__fixtures__/MockAssetControllerMessenger.js'; +import type { MockRootMessenger } from './__fixtures__/MockAssetControllerMessenger.js'; +import { createTestApiClient } from './__fixtures__/mockTokenApi.js'; +import { waitFor, waitUntilStable } from './__fixtures__/test-utils.js'; +import { AssetsController } from './AssetsController.js'; +import type { AssetsControllerState } from './AssetsController.js'; +import type { AssetsControllerStateInternal } from './types.js'; + +/** + * Integration coverage for `AssetsController` against the BNB Chain wallet + * from the `$$$DOGECHAIN` (`CDOGE`) spam-token report, on the Accounts API + * **v6** balances endpoint, enabled the way the rollout does it: the + * `assetsAccountsApiV6` remote feature flag. + * + * Boots the real controller, answers the same live-captured v6 APIs as + * `buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts`, + * and asserts CDOGE never lands in persisted state. On v6 the backend omits + * the Malicious CDOGE row server-side, so nothing client-side may resurrect + * it (RPC fallback, detection, prices) — unless the user imported it as a + * custom asset, in which case the pin travels as `includeAssetIds` and the + * row must survive (see the custom-asset suite below). + */ + +/** The flag set that turns the Accounts API v6 balances endpoint on. */ +const ACCOUNTS_API_V6_FLAGS = { assetsAccountsApiV6: true } as const; + +type StateSurface = { + surface: string; + lookUp: (state: AssetsControllerState, assetId: string) => unknown; +}; + +const BALANCES: StateSurface = { + surface: 'balances', + lookUp: (state, assetId) => + getIgnoringCase(state.assetsBalance[BSC_SPAM_ACCOUNT_ID] ?? {}, assetId), +}; + +const METADATA: StateSurface = { + surface: 'metadata', + lookUp: (state, assetId) => getIgnoringCase(state.assetsInfo, assetId), +}; + +const PRICES: StateSurface = { + surface: 'prices', + lookUp: (state, assetId) => getIgnoringCase(state.assetsPrice, assetId), +}; + +type WithControllerCallback = (args: { + controller: AssetsController; + messenger: MockRootMessenger; +}) => Promise; + +async function withController( + { + state = buildEmptyAssetsState(), + queryApiClient = createTestApiClient(), + remoteFeatureFlags = ACCOUNTS_API_V6_FLAGS, + }: { + state?: Partial; + queryApiClient?: ApiPlatformClient; + remoteFeatureFlags?: Record; + }, + fn: WithControllerCallback, +): Promise { + const { rootMessenger, assetsControllerMessenger } = createMockMessengers({ + registerCustomRootActions: (messenger) => + registerBscSpamControllerActions(messenger, { remoteFeatureFlags }), + }); + + const controller = new AssetsController({ + messenger: assetsControllerMessenger, + state, + queryApiClient, + isBasicFunctionality: (): boolean => true, + }); + + try { + return await fn({ controller, messenger: rootMessenger }); + } finally { + controller.destroy(); + queryApiClient.clear(); + } +} + +async function fetchWallet( + state: Partial = buildEmptyAssetsState(), + remoteFeatureFlags: Record = ACCOUNTS_API_V6_FLAGS, +): Promise<{ state: AssetsControllerState; v6Balances: V6BalancesMock }> { + const { accountsSupportedNetworks, v6Balances } = mockBscSpamApisV6(); + + const stateAfter = await withController( + { state, remoteFeatureFlags }, + async ({ controller }) => { + // wait for `AccountsApiDataSource` to ask `/v2/supportedNetworks` to indicate the fast-lane is ready + await waitFor(() => + expect(accountsSupportedNetworks.isDone()).toBe(true), + ); + + await controller.getAssets([buildBscSpamAccount()], { + chainIds: [BSC_CHAIN_ID], + forceUpdate: true, + }); + + // `getAssets` awaits the fast lane only; the slow lane is fire-and-forget + // and can still be writing. Let state settle so the assertions about CDOGE + // being absent cannot pass just because nothing has landed yet. + await waitUntilStable(() => controller.state); + + return controller.state; + }, + ); + + return { state: stateAfter, v6Balances }; +} + +const WALLET_PASSES = [ + { + pass: 'first pass over a fresh wallet', + run: async (): Promise => + (await fetchWallet()).state, + }, + { + pass: 'second pass over the wallet the first pass left behind', + run: async (): Promise => { + const firstPass = (await fetchWallet()).state; + cleanAll(); + + const secondPass = await fetchWallet( + buildEmptyAssetsState({ + assetsBalance: firstPass.assetsBalance, + assetsInfo: firstPass.assetsInfo, + assetsPrice: firstPass.assetsPrice, + }), + ); + return secondPass.state; + }, + }, +]; + +describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () => { + afterEach(() => { + cleanAll(); + }); + + describe.each(WALLET_PASSES)('$pass', ({ run }) => { + let state: AssetsControllerState; + + beforeAll(async () => { + state = await run(); + }); + + it.each([BALANCES, METADATA])( + '$surface - filter out the spam token', + ({ lookUp }) => { + expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + expect(lookUp(state, CDOGE_ASSET_ID_CHECKSUM)).toBeUndefined(); + }, + ); + + it.each([BALANCES, METADATA])( + '$surface - keeps the native BNB asset despite low occurrences', + ({ lookUp }) => { + expect(lookUp(state, BNB_ASSET_ID)).toBeDefined(); + }, + ); + + // Unlike the v5 suite, this is not `it.failing`! + // On v6 the backend omits the Malicious row, so the token is + // never in `assetsBalance` or `detectedAssets` at any pipeline stage and + // no price is ever fetched for it. + // + // Note we still need the unlock cleanup (`cleanSpamAssets`) to + // eventually clean up any remaining spam asset price entries. + it('keeps the spam token out of prices', () => { + expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + }); + }); +}); + +describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset', () => { + afterEach(() => { + cleanAll(); + }); + + function buildCustomAssetWalletState(): AssetsControllerStateInternal { + return buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + assetsBalance: { + [BSC_SPAM_ACCOUNT_ID]: { + [CDOGE_ASSET_ID_CHECKSUM]: { amount: '0' }, + }, + }, + assetsInfo: { + [CDOGE_ASSET_ID_CHECKSUM]: { + type: 'erc20', + symbol: 'CDOGE', + name: '$$$DOGECHAIN', + decimals: 9, + }, + }, + }); + } + + it('keeps the imported token in customAssets, balances and metadata', async () => { + const { state, v6Balances } = await fetchWallet( + buildCustomAssetWalletState(), + ); + + // The pin must reach the endpoint as `includeAssetIds`, which is what + // makes the backend answer the Malicious row at all. + expect(v6Balances.requestedIncludeAssetIds.flat()).toContain( + CDOGE_ASSET_ID_CHECKSUM, + ); + + expect(state.customAssets[BSC_SPAM_ACCOUNT_ID]).toContain( + CDOGE_ASSET_ID_CHECKSUM, + ); + expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }); +}); + +describe("AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state", () => { + afterEach(() => { + cleanAll(); + }); + + /** + * State as a wallet would have it after the spam token snuck in through an + * older (v5-era) fetch: a tracked CDOGE balance with metadata and a price, + * but NOT a custom-asset pin. Mirrors the seed the v5 suite uses to show + * the opposite outcome. + * + * @returns The seeded controller state. + */ + function buildStaleSpamWalletState(): AssetsControllerStateInternal { + return buildEmptyAssetsState({ + assetsBalance: { + [BSC_SPAM_ACCOUNT_ID]: { + [CDOGE_ASSET_ID_CHECKSUM]: { amount: '100' }, + }, + }, + assetsInfo: { + [CDOGE_ASSET_ID_CHECKSUM]: { + type: 'erc20', + symbol: 'CDOGE', + name: '$$$DOGECHAIN', + decimals: 9, + }, + }, + assetsPrice: { + [CDOGE_ASSET_ID_CHECKSUM]: { + price: 1, + lastUpdated: 0, + assetPriceType: 'fungible', + usdPrice: 1, + }, + }, + }); + } + + describe('fetching the wallet on the v6 lane', () => { + let state: AssetsControllerState; + + beforeAll(async () => { + state = (await fetchWallet(buildStaleSpamWalletState())).state; + }); + + // The v6 lane answers an authoritative snapshot (`updateMode: 'full'`): + // balances on the chains the snapshot covers are replaced wholesale, and + // the backend omitted the Malicious CDOGE row — so the seeded balance is + // dropped, not merged over. The v5 suite shows the opposite outcome from + // the same seed. + it('wipes the stale balance', () => { + expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + }); + + // The snapshot really covered BNB Chain — the wipe above is the snapshot + // replacing covered-chain balances, not a failed fetch. + it('keeps the native BNB asset', () => { + expect(BALANCES.lookUp(state, BNB_ASSET_ID)).toBeDefined(); + }); + + // Prices and metadata are append-only in state updates, so the stale + // price and metadata linger until the unlock cleanup strips them — + // the v6 snapshot cleans balances, not prices. + it.each([METADATA, PRICES])( + '$surface - stale entry lingers', + ({ lookUp }) => { + expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }, + ); + }); +}); diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts index 07ab7e58fb8..373aeac5b45 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.integration.test.ts @@ -21,7 +21,7 @@ import { createTestApiClient } from './__fixtures__/mockTokenApi.js'; import { waitFor, waitUntilStable } from './__fixtures__/test-utils.js'; import { AssetsController } from './AssetsController.js'; import type { AssetsControllerState } from './AssetsController.js'; -import type { AssetsControllerStateInternal } from './types.js'; +import { AssetsControllerStateInternal } from './types.js'; /** * Integration coverage for `AssetsController` against the BNB Chain wallet @@ -172,24 +172,32 @@ describe('AssetsController: BNB Chain spam token (CDOGE)', () => { ); // Same gap as the pipeline suite: prices are not occurrence-filtered. - // Unlock cleanup eventually strips them; this flags the hole. + // Unlock cleanup eventually strips them; this flags the hole. (The v6 + // suite does not share this gap: the backend omits Malicious rows before + // they can reach the price lane.) it.failing('keeps the spam token out of prices', () => { expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); }); }); -describe('AssetsController: BNB Chain spam token (CDOGE) imported as a custom asset', () => { +describe("AssetsController (Accounts API v5): 'merge' update operation - stale tracked spam token already in state", () => { afterEach(() => { cleanAll(); }); - function buildCustomAssetWalletState(): AssetsControllerStateInternal { + /** + * State as a wallet would have it after the spam token snuck in through an + * older fetch: a tracked CDOGE balance with metadata and a price, but NOT a + * custom-asset pin. + * + * @returns The seeded controller state. + */ + function buildStaleSpamWalletState(): AssetsControllerStateInternal { return buildEmptyAssetsState({ - customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, assetsBalance: { [BSC_SPAM_ACCOUNT_ID]: { - [CDOGE_ASSET_ID_CHECKSUM]: { amount: '0' }, + [CDOGE_ASSET_ID_CHECKSUM]: { amount: '100' }, }, }, assetsInfo: { @@ -200,18 +208,49 @@ describe('AssetsController: BNB Chain spam token (CDOGE) imported as a custom as decimals: 9, }, }, + assetsPrice: { + [CDOGE_ASSET_ID_CHECKSUM]: { + price: 1, + lastUpdated: 0, + assetPriceType: 'fungible', + usdPrice: 1, + }, + }, }); } - it('keeps the imported token in customAssets, balances and metadata', async () => { - const state = await fetchWallet(buildCustomAssetWalletState(), { - assetsAccountsApiV6: true, + describe('fetching the wallet on the v5 lane', () => { + let state: AssetsControllerState; + + beforeAll(async () => { + state = await fetchWallet(buildStaleSpamWalletState()); + }); + + // The v5 never wipes stale scam balances. It only gets wiped on unlock cleanup process. + // The v5 lane answers with `updateMode: 'merge'`; + // We only ever filter out *newly detected assets* + // Holdings already in state are exempt, so the API's fresh CDOGE row lands in the response + // and overwrites the seed. + // + // A spam token that got into state is therefore never removed by the v5 lane. + // Accounts API v6 suite performs a `updateMode: 'full'` operation which wipes the same seed via its full snapshot. + it.failing('wipes the stale balance', () => { + expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + }); + + // The snapshot really covered BNB Chain — the wipe above is the snapshot + // replacing covered-chain balances, not a failed fetch. + it('keeps the native BNB asset', () => { + expect(BALANCES.lookUp(state, BNB_ASSET_ID)).toBeDefined(); }); - expect(state.customAssets[BSC_SPAM_ACCOUNT_ID]).toContain( - CDOGE_ASSET_ID_CHECKSUM, + // Prices and metadata are append-only in state updates, so the stale + // price and metadata linger until the unlock cleanup strips them + it.each([METADATA, PRICES])( + '$surface - stale entry lingers', + ({ lookUp }) => { + expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }, ); - expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); - expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }); }); diff --git a/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/accounts-api/v6-multiaccount-balances.ts b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/accounts-api/v6-multiaccount-balances.ts new file mode 100644 index 00000000000..a92abc9e243 --- /dev/null +++ b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/accounts-api/v6-multiaccount-balances.ts @@ -0,0 +1,466 @@ +import type { V6BalancesResponse } from '@metamask/core-backend'; + +/** + * Token security classification the live Accounts API v6 attaches to every + * balance row. Not yet part of `V6BalanceItem` in `@metamask/core-backend`, + * but present in the `/docs` OpenAPI spec and in every live response. + */ +type V6SecurityResultType = 'Verified' | 'Benign' | 'Warning' | 'Malicious'; + +/** One row of the v6 balances response, as the live API shapes it. */ +type V6BalanceRow = V6BalancesResponse['balances'][number] & { + securityResultType?: V6SecurityResultType; +}; + +/** + * Live capture of + * `GET https://accounts.api.cx.metamask.io/v6/multiaccount/balances?accountIds=eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e&networks=eip155:56` + * for the `$$$DOGECHAIN` (CDOGE) spam-token wallet. + * + * Twenty-nine rows. The nine holdings the backend classifies as + * `Malicious` — CDOGE among them — are omitted entirely: the v6 endpoint + * drops Malicious rows unless they are requested through `includeAssetIds` + * (see {@link v6MaliciousBalanceRows}). Balances may drift slightly from the + * sibling v5 capture (the wallet moved after that capture); nothing in the + * suites asserts exact amounts. + */ +const v6MultiAccountBalances: Omit & { + balances: V6BalanceRow[]; +} = { + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [], + balances: [ + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'native', + assetId: 'eip155:56/slip44:714', + name: 'BNB', + symbol: 'BNB', + decimals: 18, + balance: '0.009495005467800000', + securityResultType: 'Verified', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1', + name: 'GT Protocol', + symbol: 'GTAI', + decimals: 18, + balance: '910.204000000000200000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955', + name: 'Tether USD', + symbol: 'USDT', + decimals: 18, + balance: '0.002916000000000000', + securityResultType: 'Verified', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97', + name: 'Openfabric AI', + symbol: 'OFN', + decimals: 18, + balance: '2919.859199999999000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', + name: 'Binance-Peg USD Coin', + symbol: 'USDC', + decimals: 18, + balance: '0.000253000000000000', + securityResultType: 'Verified', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097', + name: 'Swaperry', + symbol: 'PERRY', + decimals: 18, + balance: '16779.000000000000000000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2', + name: 'EarnGuild', + symbol: 'EARN', + decimals: 8, + balance: '68000.00000000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xd9ea58350bf120e2169a35fa1afc31975b07de01', + name: 'Gains', + symbol: 'GAINS', + decimals: 18, + balance: '2145.457995009695314132', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56', + name: 'BUSD', + symbol: 'BUSD', + decimals: 18, + balance: '0.671315783745192035', + securityResultType: 'Verified', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9', + name: 'Notable', + symbol: 'NBL', + decimals: 18, + balance: '74714.575000000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2', + name: 'CryptoBlades Kingdoms', + symbol: 'KING', + decimals: 18, + balance: '46530.000000000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025', + name: 'ArenaPlay', + symbol: 'APC', + decimals: 18, + balance: '14.338600000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8', + name: 'Magic Square', + symbol: 'SQR', + decimals: 8, + balance: '5075.86500000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x4b97c9bee3677797034033337f32115115867a62', + name: '$$EURCoin', + symbol: 'EURC', + decimals: 6, + balance: '1888888.800000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600', + name: 'vBSWAP', + symbol: 'VBSWAP', + decimals: 18, + balance: '0.000000000001000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e', + name: 'SpacePi Token', + symbol: 'SPACEPI', + decimals: 9, + balance: '1000000.000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097', + name: 'hi Dollar', + symbol: 'HI', + decimals: 18, + balance: '27418.637920223037021652', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x7d220240cf958c5c47f2daac821db965f9837e82', + name: 'WEB5 Inu', + symbol: 'WEB5', + decimals: 9, + balance: '724715.865699200', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x800a25741a414ea6e6e2b382435081a479a8cc3c', + name: 'SEOR Network', + symbol: 'SEOR', + decimals: 18, + balance: '10444.444444800000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839', + name: 'TAU Token', + symbol: 'TAU', + decimals: 18, + balance: '2937.500000000000000000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0', + name: 'Realio Network Token', + symbol: 'RIO', + decimals: 18, + balance: '4624.900000000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xb0a2416fd12711cbcfafb429031c0f7037fab970', + name: 'Bee Token', + symbol: 'BEETOKEN', + decimals: 18, + balance: '7.000000000000000000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63', + name: 'Exverse', + symbol: 'EXVG', + decimals: 18, + balance: '17581.843800000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8', + name: 'Zam.io', + symbol: 'ZAM', + decimals: 18, + balance: '18800.000000000000000000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xd22202d23fe7de9e3dbe11a2a88f42f4cb9507cf', + name: 'Minereum BSC', + symbol: 'MNEB', + decimals: 8, + balance: '150000.00000000', + securityResultType: 'Warning', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0', + name: 'SafeBlast', + symbol: 'BLAST', + decimals: 9, + balance: '108055.236269088', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e', + name: 'MM72', + symbol: 'MM72', + decimals: 18, + balance: '72.000720067858500000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100', + name: 'Pepe AI', + symbol: 'PEPEAI', + decimals: 9, + balance: '12345.543210000', + securityResultType: 'Benign', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xe6906717f129427eebade5406de68cadd57aa0c0', + name: 'Meta Interstellar Token', + symbol: 'MIT', + decimals: 18, + balance: '705.000000000000000000', + securityResultType: 'Warning', + }, + ], +}; + +/** + * The nine `Malicious` rows the capture above omits, verbatim from the same + * live endpoint with those asset IDs passed as `includeAssetIds`. The v6 + * mock returns a row from here only when the request asks for it, mirroring + * the backend: pins are answered despite their classification, and resolved + * includes are omitted from `unprocessedIncludeAssetIds`. + */ +const v6MaliciousBalanceRows: V6BalanceRow[] = [ + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x119e2ad8f0c85c6f61afdf0df69693028cdc10be', + name: 'Zepe.io', + symbol: 'ZEPE.IO', + decimals: 18, + balance: '750000.000000000000000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x5259639653f76f3385ba100ddb6290724891a95b', + name: 'LUNC', + symbol: 'LUNC', + decimals: 9, + balance: '2000.000000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x58b5c4697dc70f3d889225260944cdd9c270c132', + name: 'axax.io', + symbol: 'AXAX.IO', + decimals: 9, + balance: '77000.000000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0x7aa3a53360541283ffa9192972223b47a902dc0c', + name: '$$SafeGrowCoin', + symbol: 'SGC', + decimals: 6, + balance: '1450000.000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xa02a0b2d67d4fa48677a79cadc483e114049916d', + name: 'DRIP Reward Token', + symbol: 'RDRIP', + decimals: 6, + balance: '40214587.120000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xa18b59607b7286a6533fd8c7e8c9716eac9a5c73', + name: 'Aav Token', + symbol: 'AAV', + decimals: 18, + balance: '21500.320000000000000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3', + name: '$$$DOGECHAIN', + symbol: 'CDOGE', + decimals: 9, + balance: '48612246876233.123735212', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xd5da8318ce7ca005e8f5285db0e750ca9256586e', + name: 'ACT', + symbol: 'ACT', + decimals: 6, + balance: '60000.000000', + securityResultType: 'Malicious', + }, + { + accountId: 'eip155:56:0x9decde522cc1285efe18afde31c79e89dee2e91e', + object: 'token', + type: 'erc20', + assetId: 'eip155:56/erc20:0xdddf82fb98530243fcf8d4b8dc452f918c3ac4ac', + name: 'shibainu-dividend.com', + symbol: 'SHIBA_DIVIDEND_TRACKER', + decimals: 18, + balance: '66707.000000000000000000', + securityResultType: 'Malicious', + }, +]; + +export default v6MultiAccountBalances; +export { v6MaliciousBalanceRows }; +export type { V6BalanceRow }; diff --git a/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts index 90b4dd7319c..84f0b3457a0 100644 --- a/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts +++ b/packages/assets-controller/src/__fixtures__/bsc-spam-token/api-responses/index.ts @@ -5,6 +5,9 @@ import nock from 'nock'; import accountsV2SupportedNetworks from './accounts-api/v2-supportedNetworks.js'; import v5MultiAccountBalances from './accounts-api/v5-multiaccount-balances.js'; +import v6MultiAccountBalances, { + v6MaliciousBalanceRows, +} from './accounts-api/v6-multiaccount-balances.js'; import pricesV2SupportedNetworks from './price-api/v2-supportedNetworks.js'; import v3SpotPrices from './price-api/v3-spot-prices.js'; import suggestedOccurrenceFloors from './token-api/suggestedOccurrenceFloors.js'; @@ -32,6 +35,20 @@ type BatchRecordingMock = { requestedBatches: string[][]; }; +/** + * The v6 balances interceptor plus a log of the query parameters each + * intercepted request was asked about. + */ +export type V6BalancesMock = { + scope: nock.Scope; + /** The account IDs each intercepted request asked about, in request order. */ + requestedAccountIds: string[][]; + /** The `includeAssetIds` (user-pinned assets) each request asked about. */ + requestedIncludeAssetIds: string[][]; + /** The `excludeAssetIds` (user-hidden assets) each request asked about. */ + requestedExcludeAssetIds: string[][]; +}; + /** * Intercept `GET https://chainid.network/chains.json`, which * `AssetsController` fetches on boot to fill native-asset gaps. @@ -91,27 +108,116 @@ function mockV5MultiAccountBalances(omitAssetIds: string[] = []): { } /** - * Intercept `GET {ACCOUNTS}/v6/multiaccount/balances` with the wallet's - * captured token balances. + * Intercept `GET {ACCOUNTS}/v6/multiaccount/balances`, mirroring how the live + * endpoint answers this wallet: * - * @param omitAssetIds - Asset IDs (any casing) to drop from the captured - * balances. - * @returns The nock scope. + * - The captured 29 non-`Malicious` rows are always returned. + * - The nine `Malicious` rows the capture omits are answered only when the + * request asks for them through `includeAssetIds` (a pin survives its + * classification), exactly as the live backend does. + * - `excludeAssetIds` (user-hidden assets) are dropped outright — a hide wins + * over a pin. + * - A pinned ID the mock is told to treat as unprocessable (or one the + * capture does not know at all) is echoed back in + * `unprocessedIncludeAssetIds` with no balance row, as the live backend + * answers unindexed tokens. + * + * @param options - Options for shaping the intercepted response. + * @param options.omitAssetIds - Asset IDs (any casing) to drop from the + * captured balances, simulating a token the Accounts API does not index. + * @param options.unprocessedAssetIds - Asset IDs (any casing) to echo back in + * `unprocessedIncludeAssetIds` even when requested through + * `includeAssetIds`, simulating a pin the backend could not resolve. + * @returns The nock scope and the query parameters each request asked about. */ -function mockV6MultiAccountBalances(omitAssetIds: string[] = []): nock.Scope { +function mockV6MultiAccountBalances({ + omitAssetIds = [], + unprocessedAssetIds = [], +}: { + omitAssetIds?: string[]; + unprocessedAssetIds?: string[]; +} = {}): V6BalancesMock { + const requestedAccountIds: string[][] = []; + const requestedIncludeAssetIds: string[][] = []; + const requestedExcludeAssetIds: string[][] = []; + const omitted = new Set(omitAssetIds.map((assetId) => assetId.toLowerCase())); + const unprocessable = new Set( + unprocessedAssetIds.map((assetId) => assetId.toLowerCase()), + ); + const maliciousByLowerAssetId = new Map( + v6MaliciousBalanceRows.map((row) => [row.assetId.toLowerCase(), row]), + ); + const capturedByLowerAssetId = new Set( + v6MultiAccountBalances.balances.map((row) => row.assetId.toLowerCase()), + ); - return nock(API_URLS.ACCOUNTS) + const scope = nock(API_URLS.ACCOUNTS) .persist() .get('/v6/multiaccount/balances') .query(true) - .reply(200, { - balances: v5MultiAccountBalances.balances.filter( - (entry) => !omitted.has(entry.assetId.toLowerCase()), - ), - unprocessedNetworks: [], - unprocessedIncludeAssetIds: [], + .reply(200, (uri: string) => { + const accountIds = readListParam(uri, 'accountIds', API_URLS.ACCOUNTS); + const includeAssetIds = readListParam( + uri, + 'includeAssetIds', + API_URLS.ACCOUNTS, + ); + const excludeAssetIds = readListParam( + uri, + 'excludeAssetIds', + API_URLS.ACCOUNTS, + ); + requestedAccountIds.push(accountIds); + requestedIncludeAssetIds.push(includeAssetIds); + requestedExcludeAssetIds.push(excludeAssetIds); + + const excluded = new Set( + excludeAssetIds.map((assetId) => assetId.toLowerCase()), + ); + + const balances = v6MultiAccountBalances.balances.filter( + (row) => + !omitted.has(row.assetId.toLowerCase()) && + !excluded.has(row.assetId.toLowerCase()), + ); + + const unprocessedIncludeAssetIds: string[] = []; + for (const assetId of includeAssetIds) { + const lowerAssetId = assetId.toLowerCase(); + // A hide wins over a pin: hidden IDs are dropped, not echoed. + if (excluded.has(lowerAssetId)) { + continue; + } + if (unprocessable.has(lowerAssetId)) { + unprocessedIncludeAssetIds.push(assetId); + continue; + } + const maliciousRow = maliciousByLowerAssetId.get(lowerAssetId); + if (maliciousRow !== undefined && !omitted.has(lowerAssetId)) { + balances.push(maliciousRow); + } else if ( + !capturedByLowerAssetId.has(lowerAssetId) && + !omitted.has(lowerAssetId) + ) { + // Pinned IDs the backend cannot resolve at all. + unprocessedIncludeAssetIds.push(assetId); + } + } + + return { + balances, + unprocessedNetworks: [], + unprocessedIncludeAssetIds: [...new Set(unprocessedIncludeAssetIds)], + }; }); + + return { + scope, + requestedAccountIds, + requestedIncludeAssetIds, + requestedExcludeAssetIds, + }; } /** @@ -211,19 +317,45 @@ function mockV3SpotPrices(): BatchRecordingMock { } /** - * Register every interceptor the fast fetch lane needs for this wallet: - * Accounts API supported networks and balances, Tokens API supported networks - * and assets, the Token API occurrence floors, and the Price API supported - * networks and spot prices. Also answers `chainid.network/chains.json`, which - * `AssetsController` fetches on boot to fill native-asset gaps. + * Register every interceptor both balance lanes need except the balances + * endpoint itself: Accounts API supported networks, Tokens API supported + * networks and assets, the Token API occurrence floors, the Price API + * supported networks and spot prices, and `chainid.network/chains.json`, + * which `AssetsController` fetches on boot to fill native-asset gaps. * - * All interceptors persist, so batch composition and cache misses cannot make a - * test fail for want of an interceptor. + * All interceptors persist, so batch composition and cache misses cannot make + * a test fail for want of a matching interceptor. + * + * @returns The recording mocks, and other utils. + */ +function registerSharedBscSpamMocks(): { + accountsSupportedNetworks: nock.Scope; + assets: BatchRecordingMock; + prices: BatchRecordingMock; +} { + const accountsSupportedNetworks = mockAccountsSupportedNetworks(); + mockTokensSupportedNetworks(); + mockSuggestedOccurrenceFloors(); + mockPricesSupportedNetworks(); + mockChainIdNetwork(); + + const assets = mockV3Assets(); + const prices = mockV3SpotPrices(); + + return { accountsSupportedNetworks, assets, prices }; +} + +/** + * Register every interceptor the Accounts API v5 fast fetch lane needs for + * this wallet: the shared Tokens / Token / Price API interceptors plus + * `GET {ACCOUNTS}/v5/multiaccount/balances` with the wallet's captured 38 + * holdings. No v6 interceptor is registered, so a stray v6 request fails the + * test loudly instead of being silently answered. * * @param options - Options for shaping the intercepted responses. * @param options.omitBalanceAssetIds - Asset IDs (any casing) to drop from * the captured balances, simulating tokens the Accounts API does not index. - * @returns The recording mocks, and other utils + * @returns The recording mocks, and other utils. */ export function mockBscSpamApis({ omitBalanceAssetIds = [], @@ -235,20 +367,53 @@ export function mockBscSpamApis({ assets: BatchRecordingMock; prices: BatchRecordingMock; } { - const accountsSupportedNetworks = mockAccountsSupportedNetworks(); - mockTokensSupportedNetworks(); - mockSuggestedOccurrenceFloors(); - mockPricesSupportedNetworks(); - mockChainIdNetwork(); + const { accountsSupportedNetworks, assets, prices } = + registerSharedBscSpamMocks(); const balances = mockV5MultiAccountBalances(omitBalanceAssetIds); - mockV6MultiAccountBalances(omitBalanceAssetIds); - const assets = mockV3Assets(); - const prices = mockV3SpotPrices(); return { accountsSupportedNetworks, balances, assets, prices }; } +/** + * Register every interceptor the Accounts API v6 fast fetch lane needs for + * this wallet: the shared Tokens / Token / Price API interceptors plus the + * spec-accurate `GET {ACCOUNTS}/v6/multiaccount/balances` built from the live + * v6 capture (see {@link mockV6MultiAccountBalances}). No v5 interceptor is + * registered, so a stray v5 request fails the test loudly instead of being + * silently answered. + * + * @param options - Options for shaping the intercepted responses. + * @param options.omitBalanceAssetIds - Asset IDs (any casing) to drop from + * the captured balances. + * @param options.unprocessedIncludeAssetIds - Asset IDs (any casing) to echo + * back in `unprocessedIncludeAssetIds` even when requested through + * `includeAssetIds`, simulating pins the backend could not resolve. + * @returns The recording mocks, and other utils. + */ +export function mockBscSpamApisV6({ + omitBalanceAssetIds = [], + unprocessedIncludeAssetIds = [], +}: { + omitBalanceAssetIds?: string[]; + unprocessedIncludeAssetIds?: string[]; +} = {}): { + accountsSupportedNetworks: nock.Scope; + v6Balances: V6BalancesMock; + assets: BatchRecordingMock; + prices: BatchRecordingMock; +} { + const { accountsSupportedNetworks, assets, prices } = + registerSharedBscSpamMocks(); + + const v6Balances = mockV6MultiAccountBalances({ + omitAssetIds: omitBalanceAssetIds, + unprocessedAssetIds: unprocessedIncludeAssetIds, + }); + + return { accountsSupportedNetworks, v6Balances, assets, prices }; +} + /** * Read a comma-separated query parameter back off an intercepted request URI. * diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts new file mode 100644 index 00000000000..650f63e4012 --- /dev/null +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -0,0 +1,368 @@ +import { parseCaipAssetType } from '@metamask/utils'; +import { cleanAll } from 'nock'; + +import { mockBscSpamApisV6 } from '../__fixtures__/bsc-spam-token/api-responses/index.js'; +import type { V6BalancesMock } from '../__fixtures__/bsc-spam-token/api-responses/index.js'; +import { + buildBscSpamAccount, + buildEmptyAssetsState, + getIgnoringCase, +} from '../__fixtures__/bsc-spam-token/bscSpamWallet.js'; +import { registerBscSpamNetwork } from '../__fixtures__/bsc-spam-token/messenger.js'; +import { + BNB_ASSET_ID, + BSC_CHAIN_ID, + BSC_SPAM_ACCOUNT_ID, + CDOGE_ASSET_ID_CHECKSUM, + CDOGE_ASSET_ID_LOWERCASE, +} from '../__fixtures__/bsc-spam-token/wallet.js'; +import { createMockMessengers } from '../__fixtures__/MockAssetControllerMessenger.js'; +import { createTestApiClient } from '../__fixtures__/mockTokenApi.js'; +import { AccountsApiDataSource } from '../data-sources/AccountsApiDataSource.js'; +import { PriceDataSource } from '../data-sources/PriceDataSource.js'; +import { RpcDataSource } from '../data-sources/RpcDataSource.js'; +import { StakedBalanceDataSource } from '../data-sources/StakedBalanceDataSource.js'; +import { TokenDataSource } from '../data-sources/TokenDataSource.js'; +import { CustomAssetGraduationMiddleware } from '../middlewares/CustomAssetGraduationMiddleware.js'; +import { DetectionMiddleware } from '../middlewares/DetectionMiddleware.js'; +import { RpcFallbackMiddleware } from '../middlewares/RpcFallbackMiddleware.js'; +import type { + AccountId, + AssetsControllerStateInternal, + AssetsDataSource, + Caip19AssetId, + Context, + DataRequest, + DataResponse, +} from '../types.js'; +import { buildFastFetchSources, executeAssetsPipeline } from './index.js'; + +/** + * Integration coverage for the fast fetch lane against the BNB Chain wallet + * from the `$$$DOGECHAIN` (`CDOGE`) spam-token report, on the Accounts API + * **v6** balances endpoint (`assetsAccountsApiV6` on). + * + * Executes the real fast-lane pipeline against the live-captured v6 APIs. The + * v6 endpoint classifies every balance row and omits `Malicious` rows unless + * they are requested through `includeAssetIds` — so the CDOGE spam filtering + * the v5 suite performs client-side (occurrence floors) happens server-side + * here before the token ever reaches the pipeline. + * + * Integration Expectation - CDOGE never reaches balances, metadata, + * detection or prices, and the response is an authoritative snapshot + * (`updateMode: 'full'`), unless the user imported it as a custom asset, in + * which case the pin travels as `includeAssetIds` and the row (flagged + * `Malicious`) must survive. + */ + +type ResponseSurface = { + surface: string; + lookUp: (response: DataResponse, assetId: string) => unknown; +}; + +const BALANCES: ResponseSurface = { + surface: 'balances', + lookUp: (response, assetId) => + getIgnoringCase( + response.assetsBalance?.[BSC_SPAM_ACCOUNT_ID] ?? {}, + assetId, + ), +}; + +const METADATA: ResponseSurface = { + surface: 'metadata', + lookUp: (response, assetId) => + getIgnoringCase(response.assetsInfo ?? {}, assetId), +}; + +const PRICES: ResponseSurface = { + surface: 'prices', + lookUp: (response, assetId) => + getIgnoringCase(response.assetsPrice ?? {}, assetId), +}; + +const DETECTED_ASSETS: ResponseSurface = { + surface: 'detected assets', + lookUp: (response, assetId) => + Object.values(response.detectedAssets ?? {}) + .flat() + .find((detectedId) => detectedId.toLowerCase() === assetId.toLowerCase()), +}; + +async function runPipeline( + state: AssetsControllerStateInternal, + { + rpcDataSource: rpcOverride, + omitBalanceAssetIds = [], + unprocessedIncludeAssetIds = [], + }: { + rpcDataSource?: AssetsDataSource; + omitBalanceAssetIds?: string[]; + unprocessedIncludeAssetIds?: string[]; + } = {}, +): Promise<{ response: DataResponse; v6Balances: V6BalancesMock }> { + const { assetsControllerMessenger } = createMockMessengers({ + registerCustomRootActions: (rootMessenger) => { + // v6 integration flag + rootMessenger.registerActionHandler( + 'RemoteFeatureFlagController:getState', + (): { + remoteFeatureFlags: Record; + cacheTimestamp: number; + } => ({ + remoteFeatureFlags: { assetsAccountsApiV6: true }, + cacheTimestamp: 0, + }), + ); + + registerBscSpamNetwork(rootMessenger); + }, + }); + + const queryApiClient = createTestApiClient(); + + const accountsApiDataSource = new AccountsApiDataSource({ + messenger: assetsControllerMessenger, + queryApiClient, + onActiveChainsUpdated: jest.fn(), + getAssetsState: (): AssetsControllerStateInternal => state, + isBalanceV6Enabled: (): boolean => true, + }); + + const stakedBalanceDataSource = new StakedBalanceDataSource({ + messenger: assetsControllerMessenger, + onActiveChainsUpdated: jest.fn(), + }); + + const rpcDataSource = new RpcDataSource({ + messenger: assetsControllerMessenger, + getAssetsState: (): AssetsControllerStateInternal => state, + onActiveChainsUpdated: jest.fn(), + getNativeAssetForChain: (): Caip19AssetId => BNB_ASSET_ID, + getAssetType: (assetId): 'native' | 'erc20' => + parseCaipAssetType(assetId).assetNamespace === 'erc20' + ? 'erc20' + : 'native', + }); + + const tokenDataSource = new TokenDataSource(assetsControllerMessenger, { + queryApiClient, + getNativeAssetIds: (): string[] => [BNB_ASSET_ID], + getAssetType: (assetId): 'native' | 'erc20' => + parseCaipAssetType(assetId).assetNamespace === 'erc20' + ? 'erc20' + : 'native', + }); + + const priceDataSource = new PriceDataSource({ + queryApiClient, + getSelectedCurrency: (): 'usd' => 'usd', + }); + + const { v6Balances } = mockBscSpamApisV6({ + omitBalanceAssetIds, + unprocessedIncludeAssetIds, + }); + + await accountsApiDataSource.refreshActiveChains(); + + const account = buildBscSpamAccount(); + const request: DataRequest = { + accountsWithSupportedChains: [{ account, supportedChains: [BSC_CHAIN_ID] }], + chainIds: [BSC_CHAIN_ID], + assetTypes: ['fungible'], + dataTypes: ['balance', 'metadata', 'price'], + forceUpdate: true, + }; + + const sources = buildFastFetchSources( + { + accountsApiDataSource, + stakedBalanceDataSource, + customAssetGraduationMiddleware: new CustomAssetGraduationMiddleware({ + getSelectedAccountId: (): AccountId => BSC_SPAM_ACCOUNT_ID, + removeCustomAsset: (): void => { + throw new Error( + 'The v6 lane never graduates custom assets - pins travel as includeAssetIds!', + ); + }, + }), + rpcFallbackMiddleware: new RpcFallbackMiddleware({ + rpcDataSource: rpcOverride ?? rpcDataSource, + isBalanceV6Enabled: (): boolean => true, + }), + detectionMiddleware: new DetectionMiddleware(), + tokenDataSource, + priceDataSource, + }, + // The v6 lane never runs custom-asset graduation: pins are sent to the + // endpoint as `includeAssetIds` and unresolved ones kept as + // `unprocessedCustomAssets`. + { isBasicFunctionality: true, includeCustomAssetGraduation: false }, + ); + + const { response } = await executeAssetsPipeline({ + sources, + request, + getAssetsState: (): AssetsControllerStateInternal => state, + }); + + accountsApiDataSource.destroy(); + stakedBalanceDataSource.destroy(); + rpcDataSource.destroy(); + queryApiClient.clear(); + + return { response, v6Balances }; +} + +const WALLET_PASSES = [ + { + pass: 'first pass over a fresh wallet', + run: async (): Promise => + (await runPipeline(buildEmptyAssetsState())).response, + }, + { + pass: 'second pass over the wallet the first pass left behind', + run: async (): Promise => { + const firstPass = await runPipeline(buildEmptyAssetsState()); + cleanAll(); + + return ( + await runPipeline( + buildEmptyAssetsState({ + assetsBalance: firstPass.response.assetsBalance, + assetsInfo: firstPass.response.assetsInfo, + assetsPrice: firstPass.response.assetsPrice, + }), + ) + ).response; + }, + }, +]; + +describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () => { + afterEach(() => { + cleanAll(); + }); + + describe.each(WALLET_PASSES)('$pass', ({ run }) => { + let response: DataResponse; + + beforeAll(async () => { + response = await run(); + }); + + it.each([BALANCES, METADATA, DETECTED_ASSETS])( + '$surface - filter out the spam token', + ({ lookUp }) => { + expect(lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + }, + ); + + it.each([BALANCES, METADATA])( + '$surface - keeps the native BNB asset despite low occurrences', + ({ lookUp }) => { + expect(lookUp(response, BNB_ASSET_ID)).toBeDefined(); + }, + ); + + // Unlike the v5 suite, this is not `it.failing`! + // On v6 the backend omits the Malicious row, so the token is + // never in `assetsBalance` or `detectedAssets` at any pipeline stage and + // no price is ever fetched for it. + // + // Note we still need the unlock cleanup (`cleanSpamAssets`) to + // eventually clean up any remaining spam asset price entries. + it('keeps the spam token out of prices', () => { + expect(PRICES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); + }); + + // v6 performs a 'full' update operation (full wipe of balance state) + it('answers with an authoritative full snapshot', () => { + expect(response.updateMode).toBe('full'); + }); + }); +}); + +describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset', () => { + afterEach(() => { + cleanAll(); + }); + + const createRecordingRpcSource = ( + balances: Record, + ): { source: AssetsDataSource; requests: DataRequest[] } => { + const requests: DataRequest[] = []; + const source: AssetsDataSource = { + getName: () => 'RpcDataSource', + assetsMiddleware: async (ctx): Promise => { + requests.push(ctx.request); + return { + ...ctx, + response: { + assetsBalance: { [BSC_SPAM_ACCOUNT_ID]: balances }, + }, + }; + }, + }; + return { source, requests }; + }; + + it.each([BALANCES, METADATA, DETECTED_ASSETS])( + '$surface - keeps the imported token the backend flags as Malicious', + async ({ lookUp }) => { + const { response, v6Balances } = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + ); + + // The pin must reach the endpoint as `includeAssetIds`, which is what + // makes the backend answer the Malicious row at all. + expect(v6Balances.requestedIncludeAssetIds.flat()).toContain( + CDOGE_ASSET_ID_CHECKSUM, + ); + expect(lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }, + ); + + it('does not re-read the custom asset on RPC when the Accounts API resolves the includeAssetIds', async () => { + const { source, requests } = createRecordingRpcSource({}); + + const { response } = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + { + rpcDataSource: source, + }, + ); + + // A resolved pin is neither in `unprocessedIncludeAssetIds` (so no RPC + // retry is queued) nor left to the legacy stale-asset sweep. + expect(requests).toHaveLength(0); + expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + }); + + it('re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds', async () => { + const { source, requests } = createRecordingRpcSource({ + [CDOGE_ASSET_ID_LOWERCASE]: { amount: '4321' }, + }); + + const { response } = await runPipeline( + buildEmptyAssetsState({ + customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, + }), + { + rpcDataSource: source, + unprocessedIncludeAssetIds: [CDOGE_ASSET_ID_LOWERCASE], + }, + ); + + expect(requests).toHaveLength(1); + expect(requests[0]?.customAssets ?? []).toContain(CDOGE_ASSET_ID_CHECKSUM); + expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ + amount: '4321', + }); + }); +}); diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts index e7c4ca85639..6516b72c18e 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.integration.test.ts @@ -253,14 +253,23 @@ describe('assets pipeline: BNB Chain spam token (CDOGE)', () => { it.failing('keeps the spam token out of prices', () => { expect(PRICES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); + + // V5 will perform a 'merge' operation instead of a 'full' operation + it('v5 pipeline ends up performing a merge operation', () => { + expect(response.updateMode).toBe('merge'); + }); }); }); -describe('assets pipeline: BNB Chain spam token (CDOGE) imported as a custom asset', () => { +describe('assets pipeline (without graduation middleware only on v6 integration): BNB Chain spam token (CDOGE) imported as a custom asset', () => { afterEach(() => { cleanAll(); }); + const pipelineOpts = { + includeCustomAssetGraduation: false, + }; + const createRecordingRpcSource = ( balances: Record, ): { source: AssetsDataSource; requests: DataRequest[] } => { @@ -287,7 +296,7 @@ describe('assets pipeline: BNB Chain spam token (CDOGE) imported as a custom ass buildEmptyAssetsState({ customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, }), - { includeCustomAssetGraduation: false }, + pipelineOpts, ); expect(lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); @@ -302,8 +311,8 @@ describe('assets pipeline: BNB Chain spam token (CDOGE) imported as a custom ass customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, }), { + ...pipelineOpts, rpcDataSource: source, - includeCustomAssetGraduation: false, }, ); @@ -321,9 +330,9 @@ describe('assets pipeline: BNB Chain spam token (CDOGE) imported as a custom ass customAssets: { [BSC_SPAM_ACCOUNT_ID]: [CDOGE_ASSET_ID_CHECKSUM] }, }), { + ...pipelineOpts, rpcDataSource: source, omitBalanceAssetIds: [CDOGE_ASSET_ID_LOWERCASE], - includeCustomAssetGraduation: false, }, ); From eb4491a44f071c80744b9232e6c4e88c2b88cc06 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 15:35:33 +0100 Subject: [PATCH 18/25] chore: use toStrictEqual in v6 RPC fallback test Co-Authored-By: Claude --- ...bsc-spam-token-filtering.accounts-api-v6.integration.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 7a146015a9c..b5e7a53ca48 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -384,7 +384,7 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // refetches it in full rather than scoping the request via // `customAssets` — the RPC read re-derives the pin from state itself. expect(requests).toHaveLength(1); - expect(requests[0]?.chainIds).toEqual([BSC_CHAIN_ID]); + expect(requests[0]?.chainIds).toStrictEqual([BSC_CHAIN_ID]); expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ amount: '4321', }); From c58b261f4ece903964ef0496a042b1670bd01c05 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 16:44:21 +0100 Subject: [PATCH 19/25] test: add golden-record inline snapshots to v6 integration suites --- ...tering.accounts-api-v6.integration.test.ts | 4294 ++++++++++++++++- .../src/__fixtures__/test-utils.ts | 32 + ...tering.accounts-api-v6.integration.test.ts | 3321 +++++++++++++ 3 files changed, 7646 insertions(+), 1 deletion(-) diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 0e64023aae7..2670378072a 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -19,7 +19,11 @@ import { import { createMockMessengers } from './__fixtures__/MockAssetControllerMessenger.js'; import type { MockRootMessenger } from './__fixtures__/MockAssetControllerMessenger.js'; import { createTestApiClient } from './__fixtures__/mockTokenApi.js'; -import { waitFor, waitUntilStable } from './__fixtures__/test-utils.js'; +import { + waitFor, + waitUntilStable, + withZeroedTimestamps, +} from './__fixtures__/test-utils.js'; import { AssetsController } from './AssetsController.js'; import type { AssetsControllerState } from './AssetsController.js'; @@ -194,6 +198,2124 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () }); }); +// Golden-record catch-all: the targeted assertions above only pin +// CDOGE/BNB. These snapshots pin the whole persisted state, so any +// unexpected asset sneaking in, any captured asset dropping out, or any +// field-level drift (fast lane or slow lane) shows up as a reviewable diff. +// Volatile price timestamps are zeroed so the records are deterministic. +// Inline snapshots (per the repo lint rule banning `toMatchSnapshot`) +// cannot be written from inside `describe.each`, so the passes are spelled +// out explicitly. +describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) golden records', () => { + afterEach(() => { + cleanAll(); + }); + + it('first pass over a fresh wallet - full state as a golden record', async () => { + const { state } = await fetchWallet(); + + expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` + { + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", + } + `); + }); + + it('second pass over the wallet the first pass left behind - full state as a golden record', async () => { + const firstPass = (await fetchWallet()).state; + cleanAll(); + + const secondPass = await fetchWallet( + buildEmptyAssetsState({ + assetsBalance: firstPass.assetsBalance, + assetsInfo: firstPass.assetsInfo, + assetsPrice: firstPass.assetsPrice, + }), + ); + expect(withZeroedTimestamps(secondPass.state)).toMatchInlineSnapshot(` + { + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", + } + `); + }); +}); + describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset', () => { afterEach(() => { cleanAll(); @@ -235,6 +2357,1115 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) impor expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }); + + // Golden-record catch-all for the custom-asset flow: the full state + // incl. the backend-answered Malicious row and its price, with volatile + // price timestamps zeroed for determinism. + it('captures the full state as a golden record', async () => { + const { state } = await fetchWallet(buildCustomAssetWalletState()); + + expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` + { + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "amount": "48612246876233.123735212", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "selectedCurrency": "usd", + } + `); + }); }); describe("AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state", () => { @@ -307,5 +3538,1066 @@ describe("AssetsController (Accounts API v6): 'full' update operation - stale tr expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }, ); + + // Golden record of the full update over a stale v5-era wallet: the + // authoritative snapshot wiped the seeded balance, everything else + // lingers append-only. + it('captures the full state as a golden record', () => { + expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` + { + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "decimals": 9, + "name": "$$$DOGECHAIN", + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "assetPriceType": "fungible", + "lastUpdated": 0, + "price": 1, + "usdPrice": 1, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", + } + `); + }); }); }); diff --git a/packages/assets-controller/src/__fixtures__/test-utils.ts b/packages/assets-controller/src/__fixtures__/test-utils.ts index d29cb529938..34e7a995d55 100644 --- a/packages/assets-controller/src/__fixtures__/test-utils.ts +++ b/packages/assets-controller/src/__fixtures__/test-utils.ts @@ -3,6 +3,38 @@ type WaitForOptions = { timeoutMs?: number; }; +/** + * Testing Utility - withZeroedTimestamps. Returns a deep clone with every + * `lastUpdated` value set to `0`, so pipeline responses and controller state + * can be snapshotted deterministically: `PriceDataSource` stamps + * `assetsPrice` entries with `Date.now()` at fetch time, while every other + * field in the live-captured fixtures is static. Normalizing the value + * after the fact (rather than mocking timers) keeps tests running on real + * time. + * + * @param value - The response or state object to normalize. + * @returns A plain deep clone with all `lastUpdated` timestamps zeroed. + */ +export const withZeroedTimestamps = (value: Value): Value => { + if (Array.isArray(value)) { + const entries = value as unknown[]; + return entries.map((entry) => withZeroedTimestamps(entry)) as Value; + } + if (value !== null && typeof value === 'object') { + const result: Record = {}; + for (const [key, entry] of Object.entries( + value as Record, + )) { + result[key] = + key === 'lastUpdated' && typeof entry === 'number' + ? 0 + : withZeroedTimestamps(entry); + } + return result as Value; + } + return value; +}; + type WaitUntilStableOptions = WaitForOptions & { /** How long the snapshot has to stay unchanged before it counts as stable. */ stableForMs?: number; diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index b5e7a53ca48..627d935b283 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -18,6 +18,7 @@ import { } from '../__fixtures__/bsc-spam-token/wallet.js'; import { createMockMessengers } from '../__fixtures__/MockAssetControllerMessenger.js'; import { createTestApiClient } from '../__fixtures__/mockTokenApi.js'; +import { withZeroedTimestamps } from '../__fixtures__/test-utils.js'; import { AccountsApiDataSource } from '../data-sources/AccountsApiDataSource.js'; import { PriceDataSource } from '../data-sources/PriceDataSource.js'; import { RpcDataSource } from '../data-sources/RpcDataSource.js'; @@ -305,6 +306,2109 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = }); }); +// Golden-record catch-all: the targeted assertions above only pin +// CDOGE/BNB. These snapshots pin the WHOLE captured row set, so any +// unexpected asset sneaking in, any captured asset dropping out, or any +// field-level drift shows up as a reviewable diff. Volatile price +// timestamps are zeroed so the records are deterministic. Inline snapshots +// (per the repo lint rule banning `toMatchSnapshot`) cannot be written from +// inside `describe.each`, so the passes are spelled out explicitly. +describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) golden records', () => { + afterEach(() => { + cleanAll(); + }); + + it('first pass over a fresh wallet - full response as a golden record', async () => { + const response = await WALLET_PASSES[0].run(); + + expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` + { + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/slip44:714", + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", + ], + }, + "updateMode": "full", + } + `); + }); + + it('second pass over the wallet the first pass left behind - full response as a golden record', async () => { + const response = await WALLET_PASSES[1].run(); + + expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` + { + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [], + }, + "updateMode": "full", + } + `); + }); +}); + describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset', () => { afterEach(() => { cleanAll(); @@ -363,6 +2467,1126 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // retry is queued) nor left to the legacy stale-asset sweep. expect(requests).toHaveLength(0); expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); + + // Golden record of the resolved-pin flow: the backend answered the + // Malicious row through the pin, so the response carries it without any + // RPC involvement. + expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` + { + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "amount": "48612246876233.123735212", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/slip44:714", + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "updateMode": "full", + } + `); }); it('re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds', async () => { @@ -388,5 +3612,102 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ amount: '4321', }); + + // Golden record of the unresolved-pin recovery: the Accounts API + // contributed nothing for the failed chain, so the recovered response + // is the RPC refetch merged over an empty answer. + expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` + { + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "amount": "4321", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "errors": {}, + "updateMode": "full", + } + `); }); }); From 5fb2d737f2778a7abcee089f450b96eee3b4dbf0 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 16:55:57 +0100 Subject: [PATCH 20/25] test: use external snapshot files for v6 golden records --- oxlint-suppressions.json | 10 + ...tering.accounts-api-v6.integration.test.ts | 4288 +---------------- .../src/__fixtures__/test-utils.ts | 64 +- ...g.accounts-api-v6.integration.test.ts.snap | 4247 ++++++++++++++++ ...g.accounts-api-v6.integration.test.ts.snap | 3294 +++++++++++++ ...tering.accounts-api-v6.integration.test.ts | 3321 +------------ 6 files changed, 7607 insertions(+), 7617 deletions(-) create mode 100644 packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap create mode 100644 packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index 4fc922fe787..c7020d9b3e4 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -391,6 +391,11 @@ "count": 1 } }, + "packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { + "jest/no-restricted-matchers": { + "count": 3 + } + }, "packages/assets-controller/src/AssetsController.spam-cleanup.test.ts": { "typescript/no-unsafe-assignment": { "count": 1 @@ -615,6 +620,11 @@ "count": 2 } }, + "packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { + "jest/no-restricted-matchers": { + "count": 3 + } + }, "packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts": { "no-unused-vars": { "count": 1 diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 2670378072a..05903036929 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -195,2124 +195,16 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () it('keeps the spam token out of prices', () => { expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); - }); -}); - -// Golden-record catch-all: the targeted assertions above only pin -// CDOGE/BNB. These snapshots pin the whole persisted state, so any -// unexpected asset sneaking in, any captured asset dropping out, or any -// field-level drift (fast lane or slow lane) shows up as a reviewable diff. -// Volatile price timestamps are zeroed so the records are deterministic. -// Inline snapshots (per the repo lint rule banning `toMatchSnapshot`) -// cannot be written from inside `describe.each`, so the passes are spelled -// out explicitly. -describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) golden records', () => { - afterEach(() => { - cleanAll(); - }); - - it('first pass over a fresh wallet - full state as a golden record', async () => { - const { state } = await fetchWallet(); - - expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` - { - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", - } - `); - }); - - it('second pass over the wallet the first pass left behind - full state as a golden record', async () => { - const firstPass = (await fetchWallet()).state; - cleanAll(); - const secondPass = await fetchWallet( - buildEmptyAssetsState({ - assetsBalance: firstPass.assetsBalance, - assetsInfo: firstPass.assetsInfo, - assetsPrice: firstPass.assetsPrice, - }), - ); - expect(withZeroedTimestamps(secondPass.state)).toMatchInlineSnapshot(` - { - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", - } - `); + // Golden-record catch-all: the targeted assertions above only pin + // CDOGE/BNB. This snapshot pins the whole persisted state, so any + // unexpected asset sneaking in, any captured asset dropping out, or any + // field-level drift (fast lane or slow lane) shows up as a reviewable + // diff. Volatile price timestamps are zeroed so the record is + // deterministic. + it('captures the full state as a golden record', () => { + expect(withZeroedTimestamps(state)).toMatchSnapshot(); + }); }); }); @@ -2362,1109 +254,11 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) impor // incl. the backend-answered Malicious row and its price, with volatile // price timestamps zeroed for determinism. it('captures the full state as a golden record', async () => { - const { state } = await fetchWallet(buildCustomAssetWalletState()); + const { state: goldenState } = await fetchWallet( + buildCustomAssetWalletState(), + ); - expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` - { - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "selectedCurrency": "usd", - } - `); + expect(withZeroedTimestamps(goldenState)).toMatchSnapshot(); }); }); @@ -3543,1061 +337,7 @@ describe("AssetsController (Accounts API v6): 'full' update operation - stale tr // authoritative snapshot wiped the seeded balance, everything else // lingers append-only. it('captures the full state as a golden record', () => { - expect(withZeroedTimestamps(state)).toMatchInlineSnapshot(` - { - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "decimals": 9, - "name": "$$$DOGECHAIN", - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "assetPriceType": "fungible", - "lastUpdated": 0, - "price": 1, - "usdPrice": 1, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", - } - `); + expect(withZeroedTimestamps(state)).toMatchSnapshot(); }); }); }); diff --git a/packages/assets-controller/src/__fixtures__/test-utils.ts b/packages/assets-controller/src/__fixtures__/test-utils.ts index 34e7a995d55..5e5ec9d2cbe 100644 --- a/packages/assets-controller/src/__fixtures__/test-utils.ts +++ b/packages/assets-controller/src/__fixtures__/test-utils.ts @@ -3,38 +3,6 @@ type WaitForOptions = { timeoutMs?: number; }; -/** - * Testing Utility - withZeroedTimestamps. Returns a deep clone with every - * `lastUpdated` value set to `0`, so pipeline responses and controller state - * can be snapshotted deterministically: `PriceDataSource` stamps - * `assetsPrice` entries with `Date.now()` at fetch time, while every other - * field in the live-captured fixtures is static. Normalizing the value - * after the fact (rather than mocking timers) keeps tests running on real - * time. - * - * @param value - The response or state object to normalize. - * @returns A plain deep clone with all `lastUpdated` timestamps zeroed. - */ -export const withZeroedTimestamps = (value: Value): Value => { - if (Array.isArray(value)) { - const entries = value as unknown[]; - return entries.map((entry) => withZeroedTimestamps(entry)) as Value; - } - if (value !== null && typeof value === 'object') { - const result: Record = {}; - for (const [key, entry] of Object.entries( - value as Record, - )) { - result[key] = - key === 'lastUpdated' && typeof entry === 'number' - ? 0 - : withZeroedTimestamps(entry); - } - return result as Value; - } - return value; -}; - type WaitUntilStableOptions = WaitForOptions & { /** How long the snapshot has to stay unchanged before it counts as stable. */ stableForMs?: number; @@ -80,6 +48,38 @@ export const waitFor = async ( ); }; +/** + * Returns a plain deep clone of the given response or state object with + * all `lastUpdated` timestamps zeroed. + * + * The fast lane stamps `assetsPrice` entries with `Date.now()` at fetch + * time (`PriceDataSource`), which would otherwise make snapshots + * non-deterministic. Zeroing every `lastUpdated` key normalizes the value + * without resorting to mock timers. + * + * @param value - The response or state object to normalize. + * @returns A plain deep clone with all `lastUpdated` timestamps zeroed. + */ +export const withZeroedTimestamps = (value: Value): Value => { + if (Array.isArray(value)) { + const entries = value as unknown[]; + return entries.map((entry) => withZeroedTimestamps(entry)) as Value; + } + if (value !== null && typeof value === 'object') { + const result: Record = {}; + for (const [key, entry] of Object.entries( + value as Record, + )) { + result[key] = + key === 'lastUpdated' && typeof entry === 'number' + ? 0 + : withZeroedTimestamps(entry); + } + return result as Value; + } + return value; +}; + /** * Testing Utility - waitUntilStable. Waits until a snapshot stops changing, * for tests that need background work to be finished rather than a particular diff --git a/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap new file mode 100644 index 00000000000..20947e673da --- /dev/null +++ b/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap @@ -0,0 +1,4247 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state fetching the wallet on the v6 lane captures the full state as a golden record 1`] = ` +{ + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "decimals": 9, + "name": "$$$DOGECHAIN", + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "assetPriceType": "fungible", + "lastUpdated": 0, + "price": 1, + "usdPrice": 1, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", +} +`; + +exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full state as a golden record 1`] = ` +{ + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", +} +`; + +exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset captures the full state as a golden record 1`] = ` +{ + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "amount": "48612246876233.123735212", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "selectedCurrency": "usd", +} +`; + +exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full state as a golden record 1`] = ` +{ + "assetPreferences": {}, + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.2040000000002", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.865", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.9", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.8438", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.54321", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.0094950054678", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "customAssets": {}, + "selectedCurrency": "usd", +} +`; diff --git a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap new file mode 100644 index 00000000000..930b0e06317 --- /dev/null +++ b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap @@ -0,0 +1,3294 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full response as a golden record 1`] = ` +{ + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/slip44:714", + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", + ], + }, + "updateMode": "full", +} +`; + +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset does not re-read the custom asset on RPC when the Accounts API resolves the includeAssetIds 1`] = ` +{ + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { + "amount": "48612246876233.123735212", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + "eip155:56/slip44:714": { + "allTimeHigh": 1369.99, + "allTimeLow": 0.0398177, + "assetPriceType": "fungible", + "circulatingSupply": 133161239.47, + "dilutedMarketCap": 95407679685, + "high1d": 751.19, + "id": "eip155:56/slip44:714", + "lastUpdated": 0, + "liquidity": 27035518.468615964, + "low1d": 715.6, + "marketCap": 95407675057, + "marketCapPercentChange1d": -4.34605, + "price": 716.8635016621672, + "priceChange1d": -32.63578477335386, + "pricePercentChange14d": 0.7, + "pricePercentChange1d": -4.32, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -18.6, + "pricePercentChange200d": 15, + "pricePercentChange30d": 18.3, + "pricePercentChange7d": 2.4, + "totalVolume": 1133782896, + "usdPrice": 716.8635016621672, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/slip44:714", + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "updateMode": "full", +} +`; + +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds 1`] = ` +{ + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "amount": "4321", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "aggregators": [ + "rubic", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": undefined, + "fees": undefined, + "honeypotStatus": { + "goPlus": true, + "honeypotIs": true, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "$$$DOGECHAIN", + "occurrences": 1, + "storage": { + "balance": 7, + }, + "symbol": "CDOGE", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 5486141.97077836, + "high1d": null, + "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "lastUpdated": 0, + "liquidity": 1215355.4989798926, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 5.491481035e-11, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000000000000, + "totalVolume": 0, + "usdPrice": 5.491481035e-11, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ + "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", + "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", + ], + }, + "errors": {}, + "updateMode": "full", +} +`; + +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full response as a golden record 1`] = ` +{ + "assetsBalance": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { + "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { + "amount": "910.204000000000200000", + }, + "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { + "amount": "46530.000000000000000000", + }, + "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { + "amount": "5075.86500000", + }, + "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { + "amount": "0.000000000001000000", + }, + "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { + "amount": "0.002916000000000000", + }, + "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { + "amount": "1000000.000000000", + }, + "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { + "amount": "27418.637920223037021652", + }, + "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { + "amount": "2919.859199999999000000", + }, + "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "amount": "0.000253000000000000", + }, + "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { + "amount": "4624.900000000000000000", + }, + "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { + "amount": "17581.843800000000000000", + }, + "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { + "amount": "18800.000000000000000000", + }, + "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { + "amount": "108055.236269088", + }, + "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { + "amount": "12345.543210000", + }, + "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "amount": "0.671315783745192035", + }, + "eip155:56/slip44:714": { + "amount": "0.009495005467800000", + }, + }, + }, + "assetsInfo": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "aggregators": [ + "pancakeExtended", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": null, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", + "isContractVerified": true, + "labels": undefined, + "name": "GT Protocol", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "GTAI", + "type": "erc20", + }, + "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0.9800000000000005, + "maxFee": 1, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", + "isContractVerified": true, + "labels": undefined, + "name": "CryptoBlades Kingdoms", + "occurrences": 3, + "storage": { + "approval": 4, + "balance": 6, + }, + "symbol": "KING", + "type": "erc20", + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 8, + "description": { + "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", + }, + "erc20Permit": true, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Magic Square", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SQR", + "type": "erc20", + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", + "isContractVerified": true, + "labels": undefined, + "name": "vBSWAP", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "VBSWAP", + "type": "erc20", + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", + "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", + "isContractVerified": true, + "labels": undefined, + "name": "Tether USD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDT", + "type": "erc20", + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rango", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", + "isContractVerified": true, + "labels": undefined, + "name": "SPACEPI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "SPACEPI", + "type": "erc20", + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "aggregators": [ + "pancakeCoinMarketCap", + "oneInch", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", + "isContractVerified": true, + "labels": undefined, + "name": "hi Dollar", + "occurrences": 5, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "HI", + "type": "erc20", + }, + "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { + "aggregators": [ + "pancakeCoinMarketCap", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", + "isContractVerified": true, + "labels": undefined, + "name": "Openfabric AI", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "OFN", + "type": "erc20", + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "rubic", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", + "isContractVerified": true, + "labels": undefined, + "name": "Binance-Peg USD Coin", + "occurrences": 8, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "USDC", + "type": "erc20", + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "aggregators": [ + "coinGecko", + "rubic", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": undefined, + "isContractVerified": true, + "labels": undefined, + "name": "Realio Network Token", + "occurrences": 4, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "RIO", + "type": "erc20", + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", + "isContractVerified": true, + "labels": undefined, + "name": "Exverse", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "EXVG", + "type": "erc20", + }, + "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", + }, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", + "isContractVerified": true, + "labels": undefined, + "name": "Zam.io", + "occurrences": 3, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "ZAM", + "type": "erc20", + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "aggregators": [ + "pancakeCoinMarketCap", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", + }, + "erc20Permit": false, + "fees": { + "avgFee": 9.999999999999996, + "maxFee": 10, + "minFee": 10, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", + "isContractVerified": true, + "labels": undefined, + "name": "SafeBlast", + "occurrences": 3, + "storage": { + "approval": 5, + "balance": 7, + }, + "symbol": "BLAST", + "type": "erc20", + }, + "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { + "aggregators": [ + "pancakeCoinGecko", + "rango", + "sonarwatch", + ], + "coingeckoId": undefined, + "decimals": 9, + "description": { + "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", + "isContractVerified": true, + "labels": undefined, + "name": "Pepe AI", + "occurrences": 3, + "storage": { + "approval": 1, + "balance": 0, + }, + "symbol": "PEPEAI", + "type": "erc20", + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "aggregators": [ + "pancakeExtended", + "liFi", + "oneInch", + "squid", + "rango", + "sonarwatch", + "sushiSwap", + "trustWallet", + "binanceDex", + ], + "coingeckoId": undefined, + "decimals": 18, + "description": undefined, + "erc20Permit": false, + "fees": { + "avgFee": 0, + "maxFee": 0, + "minFee": 0, + }, + "honeypotStatus": { + "goPlus": false, + "honeypotIs": false, + }, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", + "isContractVerified": true, + "labels": [ + "badges:v1:stablecoin", + ], + "name": "BUSD", + "occurrences": 9, + "storage": { + "approval": 2, + "balance": 1, + }, + "symbol": "BUSD", + "type": "erc20", + }, + "eip155:56/slip44:714": { + "aggregators": [], + "coingeckoId": undefined, + "decimals": 18, + "description": { + "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", + }, + "erc20Permit": false, + "fees": undefined, + "honeypotStatus": {}, + "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", + "isContractVerified": false, + "labels": undefined, + "name": "Binance Coin", + "occurrences": 1, + "storage": undefined, + "symbol": "BNB", + "type": "native", + }, + }, + "assetsPrice": { + "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { + "allTimeHigh": 5.46, + "allTimeLow": 0.00604714, + "assetPriceType": "fungible", + "circulatingSupply": 69880943.68552426, + "dilutedMarketCap": 540387, + "high1d": 0.00721852, + "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", + "lastUpdated": 0, + "low1d": 0.00714369, + "marketCap": 503504, + "marketCapPercentChange1d": 1.23194, + "price": 0.00720484, + "priceChange1d": 0.00008736, + "pricePercentChange14d": -23.7, + "pricePercentChange1d": 1.22737, + "pricePercentChange1h": 0.1, + "pricePercentChange1y": -92.8, + "pricePercentChange200d": -84.8, + "pricePercentChange30d": -13.5, + "pricePercentChange7d": -22.3, + "totalVolume": 185919, + "usdPrice": 0.00720484, + }, + "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 109800.696381147, + "high1d": null, + "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", + "lastUpdated": 0, + "liquidity": 87007.28289524098, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001430968154, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.001430968154, + }, + "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { + "allTimeHigh": 0.775708, + "allTimeLow": 0.00006158, + "assetPriceType": "fungible", + "circulatingSupply": 719255546.828825, + "dilutedMarketCap": 80567, + "high1d": 0.00009934, + "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", + "lastUpdated": 0, + "low1d": 0.00008185, + "marketCap": 61019, + "marketCapPercentChange1d": 2.89297, + "price": 0.00008501, + "priceChange1d": 0.00000256, + "pricePercentChange14d": -6.9, + "pricePercentChange1d": 2.73071, + "pricePercentChange1h": -2.5, + "pricePercentChange1y": -98.4, + "pricePercentChange200d": -74.5, + "pricePercentChange30d": -6.5, + "pricePercentChange7d": -1.1, + "totalVolume": 92771, + "usdPrice": 0.00008501, + }, + "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 140814.349477256, + "high1d": null, + "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", + "lastUpdated": 0, + "liquidity": 3706.966847093036, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 14.6695460693, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -3.548, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 9599.09680108329, + "totalVolume": 66.0330720783275, + "usdPrice": 14.6695460693, + }, + "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { + "allTimeHigh": 1.85, + "allTimeLow": 0.941022, + "assetPriceType": "fungible", + "circulatingSupply": 9184991905.680809, + "dilutedMarketCap": 9181946768, + "high1d": 0.999919, + "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", + "lastUpdated": 0, + "liquidity": 613589475.6193123, + "low1d": 0.999558, + "marketCap": 9181946768, + "marketCapPercentChange1d": -0.01702, + "price": 0.9997597462199397, + "priceChange1d": -0.000169090781822367, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.02, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": 0, + "pricePercentChange30d": 0.1, + "pricePercentChange7d": 0, + "totalVolume": 1252391401, + "usdPrice": 0.9997597462199397, + }, + "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 1197830.38634154, + "high1d": null, + "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", + "lastUpdated": 0, + "liquidity": 701831.6721570174, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 6.24277267e-10, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -4.624, + "pricePercentChange1h": -0.085, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 1999999997999990, + "totalVolume": 443.901054517397, + "usdPrice": 6.24277267e-10, + }, + "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { + "allTimeHigh": 1.57, + "allTimeLow": 0.00001497, + "assetPriceType": "fungible", + "circulatingSupply": 65859645815, + "dilutedMarketCap": 2196653, + "high1d": 0.00002244, + "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", + "lastUpdated": 0, + "liquidity": 14473.719381952691, + "low1d": 0.00002161, + "marketCap": 1446708, + "marketCapPercentChange1d": null, + "price": 0.00002197, + "priceChange1d": null, + "pricePercentChange14d": -1.2, + "pricePercentChange1d": null, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -71.8, + "pricePercentChange200d": -54.6, + "pricePercentChange30d": 30.4, + "pricePercentChange7d": -0.3, + "totalVolume": 45.05, + "usdPrice": 0.00002197, + }, + "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 3569.9739533813, + "high1d": null, + "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", + "lastUpdated": 0, + "liquidity": 0.5992849636201593, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00001784990067, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": null, + "pricePercentChange1h": null, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 0, + "usdPrice": 0.00001784990067, + }, + "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "allTimeHigh": 1.54, + "allTimeLow": 0.107192, + "assetPriceType": "fungible", + "circulatingSupply": 1588999877.439803, + "dilutedMarketCap": 1588817061, + "high1d": 1, + "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", + "lastUpdated": 0, + "liquidity": 48479575.53997608, + "low1d": 0.999718, + "marketCap": 1588817061, + "marketCapPercentChange1d": -0.00448, + "price": 0.9999793058607263, + "priceChange1d": -0.000044277307959528, + "pricePercentChange14d": 0, + "pricePercentChange1d": -0.04, + "pricePercentChange1h": 0, + "pricePercentChange1y": 0, + "pricePercentChange200d": -0.2, + "pricePercentChange30d": 0, + "pricePercentChange7d": 0, + "totalVolume": 1092971528, + "usdPrice": 0.9999793058607263, + }, + "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 131202.663241936, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 3620.847652722667, + "low1d": null, + "marketCap": 25516.6214230616, + "marketCapPercentChange1d": null, + "price": 0.0006560735838, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -2.305, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 200000000, + "totalVolume": 45.1025528431, + "usdPrice": 0.0006560735838, + }, + "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { + "allTimeHigh": 5.12, + "allTimeLow": 0.01342772, + "assetPriceType": "fungible", + "circulatingSupply": 330500000, + "dilutedMarketCap": 16183936, + "high1d": 0.05071, + "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", + "lastUpdated": 0, + "liquidity": 286952.55296101805, + "low1d": 0.04844582, + "marketCap": 16183936, + "marketCapPercentChange1d": -1.03478, + "price": 0.04897826, + "priceChange1d": -0.00050178316195728, + "pricePercentChange14d": 1.4, + "pricePercentChange1d": -0.98825, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -82.7, + "pricePercentChange200d": -76.1, + "pricePercentChange30d": 40.3, + "pricePercentChange7d": 26.2, + "totalVolume": 204638, + "usdPrice": 0.04897826, + }, + "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 18403.4899850297, + "high1d": null, + "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", + "lastUpdated": 0, + "liquidity": 1187.8332805053717, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.0001841583888, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 0, + "usdPrice": 0.0001841583888, + }, + "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 26277.6103202188, + "high1d": null, + "holderCount": null, + "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", + "isMutable": null, + "lastUpdated": 0, + "liquidity": 1101.8053137481395, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.00006569537134, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": 0, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 400000000, + "totalVolume": 0, + "usdPrice": 0.00006569537134, + }, + "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { + "allTimeHigh": 0.00032667, + "allTimeLow": 8.9e-17, + "assetPriceType": "fungible", + "circulatingSupply": 0, + "dilutedMarketCap": 2871530, + "high1d": 3.006e-9, + "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", + "lastUpdated": 0, + "low1d": 2.863e-9, + "marketCap": 0, + "marketCapPercentChange1d": null, + "price": 2.871e-9, + "priceChange1d": -1.31283041e-10, + "pricePercentChange14d": -2.8, + "pricePercentChange1d": -4.40722, + "pricePercentChange1h": -0.2, + "pricePercentChange1y": -45.2, + "pricePercentChange200d": 5527215.5, + "pricePercentChange30d": 6, + "pricePercentChange7d": -0.8, + "totalVolume": 5.65, + "usdPrice": 2.871e-9, + }, + "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { + "allTimeHigh": 0.00502433, + "allTimeLow": 3.9844e-8, + "assetPriceType": "fungible", + "circulatingSupply": 87999997928.97575, + "dilutedMarketCap": 37045, + "high1d": 3.90567e-7, + "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", + "lastUpdated": 0, + "low1d": 3.69265e-7, + "marketCap": 32600, + "marketCapPercentChange1d": -4.25951, + "price": 3.70568e-7, + "priceChange1d": -1.6367479209e-8, + "pricePercentChange14d": -0.7, + "pricePercentChange1d": -3.89934, + "pricePercentChange1h": -0.1, + "pricePercentChange1y": -91.6, + "pricePercentChange200d": -34.1, + "pricePercentChange30d": -0.9, + "pricePercentChange7d": 4.4, + "totalVolume": 194.16, + "usdPrice": 3.70568e-7, + }, + "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { + "allTimeHigh": 1.86, + "allTimeLow": 0.462821, + "assetPriceType": "fungible", + "circulatingSupply": 283188732.4703792, + "dilutedMarketCap": null, + "high1d": 1.018440961950845, + "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", + "lastUpdated": 0, + "low1d": 0.995524765786234, + "marketCap": 283296437.81903726, + "marketCapPercentChange1d": null, + "price": 1.000380330628689, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.06, + "pricePercentChange1h": -0.03, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalVolume": 1031780.8750981385, + "usdPrice": 1.000380330628689, + }, + "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { + "allTimeHigh": null, + "allTimeLow": null, + "assetPriceType": "fungible", + "bondingCurveProgressPercent": null, + "circulatingSupply": null, + "dilutedMarketCap": 103785.929891558, + "high1d": null, + "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", + "lastUpdated": 0, + "liquidity": 15553.255162248859, + "low1d": null, + "marketCap": null, + "marketCapPercentChange1d": null, + "price": 0.001037859309, + "priceChange1d": null, + "pricePercentChange14d": null, + "pricePercentChange1d": -0.225, + "pricePercentChange1h": 0, + "pricePercentChange1y": null, + "pricePercentChange200d": null, + "pricePercentChange30d": null, + "pricePercentChange7d": null, + "totalSupply": 100000000, + "totalVolume": 18.5327447356, + "usdPrice": 0.001037859309, + }, + }, + "detectedAssets": { + "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [], + }, + "updateMode": "full", +} +`; diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 627d935b283..802c13e24e3 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -303,2109 +303,15 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = it('answers with an authoritative full snapshot', () => { expect(response.updateMode).toBe('full'); }); - }); -}); -// Golden-record catch-all: the targeted assertions above only pin -// CDOGE/BNB. These snapshots pin the WHOLE captured row set, so any -// unexpected asset sneaking in, any captured asset dropping out, or any -// field-level drift shows up as a reviewable diff. Volatile price -// timestamps are zeroed so the records are deterministic. Inline snapshots -// (per the repo lint rule banning `toMatchSnapshot`) cannot be written from -// inside `describe.each`, so the passes are spelled out explicitly. -describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) golden records', () => { - afterEach(() => { - cleanAll(); - }); - - it('first pass over a fresh wallet - full response as a golden record', async () => { - const response = await WALLET_PASSES[0].run(); - - expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` - { - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/slip44:714", - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", - ], - }, - "updateMode": "full", - } - `); - }); - - it('second pass over the wallet the first pass left behind - full response as a golden record', async () => { - const response = await WALLET_PASSES[1].run(); - - expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` - { - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [], - }, - "updateMode": "full", - } - `); + // Golden-record catch-all: the targeted assertions above only pin + // CDOGE/BNB. This snapshot pins the WHOLE captured row set, so any + // unexpected asset sneaking in, any captured asset dropping out, or + // any field-level drift shows up as a reviewable diff. Volatile price + // timestamps are zeroed so the record is deterministic. + it('captures the full response as a golden record', () => { + expect(withZeroedTimestamps(response)).toMatchSnapshot(); + }); }); }); @@ -2471,1122 +377,7 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // Golden record of the resolved-pin flow: the backend answered the // Malicious row through the pin, so the response carries it without any // RPC involvement. - expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` - { - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/slip44:714", - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "updateMode": "full", - } - `); + expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); it('re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds', async () => { @@ -3616,98 +407,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // Golden record of the unresolved-pin recovery: the Accounts API // contributed nothing for the failed chain, so the recovered response // is the RPC refetch merged over an empty answer. - expect(withZeroedTimestamps(response)).toMatchInlineSnapshot(` - { - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "amount": "4321", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "errors": {}, - "updateMode": "full", - } - `); + expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); }); From 6e78e0586331d0f287f50638dcddc6f87946ec33 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 17:07:16 +0100 Subject: [PATCH 21/25] test: drop verbose comments from v6 golden-record tests --- ...ken-filtering.accounts-api-v6.integration.test.ts | 12 ------------ .../assets-controller/src/__fixtures__/test-utils.ts | 9 ++------- ...ken-filtering.accounts-api-v6.integration.test.ts | 11 ----------- 3 files changed, 2 insertions(+), 30 deletions(-) diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 05903036929..d594dc7af4b 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -196,12 +196,6 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); - // Golden-record catch-all: the targeted assertions above only pin - // CDOGE/BNB. This snapshot pins the whole persisted state, so any - // unexpected asset sneaking in, any captured asset dropping out, or any - // field-level drift (fast lane or slow lane) shows up as a reviewable - // diff. Volatile price timestamps are zeroed so the record is - // deterministic. it('captures the full state as a golden record', () => { expect(withZeroedTimestamps(state)).toMatchSnapshot(); }); @@ -250,9 +244,6 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) impor expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }); - // Golden-record catch-all for the custom-asset flow: the full state - // incl. the backend-answered Malicious row and its price, with volatile - // price timestamps zeroed for determinism. it('captures the full state as a golden record', async () => { const { state: goldenState } = await fetchWallet( buildCustomAssetWalletState(), @@ -333,9 +324,6 @@ describe("AssetsController (Accounts API v6): 'full' update operation - stale tr }, ); - // Golden record of the full update over a stale v5-era wallet: the - // authoritative snapshot wiped the seeded balance, everything else - // lingers append-only. it('captures the full state as a golden record', () => { expect(withZeroedTimestamps(state)).toMatchSnapshot(); }); diff --git a/packages/assets-controller/src/__fixtures__/test-utils.ts b/packages/assets-controller/src/__fixtures__/test-utils.ts index 5e5ec9d2cbe..d8a6d6ef5d6 100644 --- a/packages/assets-controller/src/__fixtures__/test-utils.ts +++ b/packages/assets-controller/src/__fixtures__/test-utils.ts @@ -49,13 +49,8 @@ export const waitFor = async ( }; /** - * Returns a plain deep clone of the given response or state object with - * all `lastUpdated` timestamps zeroed. - * - * The fast lane stamps `assetsPrice` entries with `Date.now()` at fetch - * time (`PriceDataSource`), which would otherwise make snapshots - * non-deterministic. Zeroing every `lastUpdated` key normalizes the value - * without resorting to mock timers. + * Returns a plain deep clone of the given object with all `lastUpdated` + * timestamps zeroed, so that snapshots are deterministic. * * @param value - The response or state object to normalize. * @returns A plain deep clone with all `lastUpdated` timestamps zeroed. diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 802c13e24e3..5c889ead3a5 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -304,11 +304,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = expect(response.updateMode).toBe('full'); }); - // Golden-record catch-all: the targeted assertions above only pin - // CDOGE/BNB. This snapshot pins the WHOLE captured row set, so any - // unexpected asset sneaking in, any captured asset dropping out, or - // any field-level drift shows up as a reviewable diff. Volatile price - // timestamps are zeroed so the record is deterministic. it('captures the full response as a golden record', () => { expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); @@ -374,9 +369,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import expect(requests).toHaveLength(0); expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); - // Golden record of the resolved-pin flow: the backend answered the - // Malicious row through the pin, so the response carries it without any - // RPC involvement. expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); @@ -404,9 +396,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import amount: '4321', }); - // Golden record of the unresolved-pin recovery: the Accounts API - // contributed nothing for the failed chain, so the recovered response - // is the RPC refetch merged over an empty answer. expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); }); From e241b45c7bbd854e050ab95ef5c0ab578750d854 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 17:11:20 +0100 Subject: [PATCH 22/25] test: rename pipeline golden-record test to snapshot source of truth --- ...m-token-filtering.accounts-api-v6.integration.test.ts.snap | 4 ++-- ...c-spam-token-filtering.accounts-api-v6.integration.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap index 930b0e06317..5f30a88e869 100644 --- a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap +++ b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full response as a golden record 1`] = ` +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet generates snapshot (source of truth) 1`] = ` { "assetsBalance": { "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { @@ -2273,7 +2273,7 @@ exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) importe } `; -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full response as a golden record 1`] = ` +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind generates snapshot (source of truth) 1`] = ` { "assetsBalance": { "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 5c889ead3a5..8a2f83cccd1 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -304,7 +304,7 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = expect(response.updateMode).toBe('full'); }); - it('captures the full response as a golden record', () => { + it('generates snapshot (source of truth)', () => { expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); }); From 472643607122f088d8b390f64f0e888399139520 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 17:38:10 +0100 Subject: [PATCH 23/25] test: use inline eslint-disable for restricted snapshot matchers --- oxlint-suppressions.json | 10 ---------- ...token-filtering.accounts-api-v6.integration.test.ts | 1 + ...token-filtering.accounts-api-v6.integration.test.ts | 1 + 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index c7020d9b3e4..4fc922fe787 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -391,11 +391,6 @@ "count": 1 } }, - "packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { - "jest/no-restricted-matchers": { - "count": 3 - } - }, "packages/assets-controller/src/AssetsController.spam-cleanup.test.ts": { "typescript/no-unsafe-assignment": { "count": 1 @@ -620,11 +615,6 @@ "count": 2 } }, - "packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { - "jest/no-restricted-matchers": { - "count": 3 - } - }, "packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts": { "no-unused-vars": { "count": 1 diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index d594dc7af4b..34819d6d577 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable jest/no-restricted-matchers */ import type { ApiPlatformClient } from '@metamask/core-backend'; import { cleanAll } from 'nock'; diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 8a2f83cccd1..ff7e941aa33 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable jest/no-restricted-matchers */ import { parseCaipAssetType } from '@metamask/utils'; import { cleanAll } from 'nock'; From d630e1b27cd08b8f032bb08dfc6b5a886f0e1fe6 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 25 Sep 2026 18:37:45 +0100 Subject: [PATCH 24/25] test: keep single main-path snapshot per v6 integration suite --- ...tering.accounts-api-v6.integration.test.ts | 22 +- ...g.accounts-api-v6.integration.test.ts.snap | 3204 +---------------- ...g.accounts-api-v6.integration.test.ts.snap | 2233 +----------- ...tering.accounts-api-v6.integration.test.ts | 14 +- 4 files changed, 14 insertions(+), 5459 deletions(-) diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 34819d6d577..03d9eb5c48d 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable jest/no-restricted-matchers */ import type { ApiPlatformClient } from '@metamask/core-backend'; import { cleanAll } from 'nock'; @@ -196,10 +195,13 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () it('keeps the spam token out of prices', () => { expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); + }); - it('captures the full state as a golden record', () => { - expect(withZeroedTimestamps(state)).toMatchSnapshot(); - }); + it('generates snapshot (source of truth)', async () => { + const { state } = await fetchWallet(); + + // eslint-disable-next-line jest/no-restricted-matchers + expect(withZeroedTimestamps(state)).toMatchSnapshot(); }); }); @@ -244,14 +246,6 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) impor expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }); - - it('captures the full state as a golden record', async () => { - const { state: goldenState } = await fetchWallet( - buildCustomAssetWalletState(), - ); - - expect(withZeroedTimestamps(goldenState)).toMatchSnapshot(); - }); }); describe("AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state", () => { @@ -324,9 +318,5 @@ describe("AssetsController (Accounts API v6): 'full' update operation - stale tr expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }, ); - - it('captures the full state as a golden record', () => { - expect(withZeroedTimestamps(state)).toMatchSnapshot(); - }); }); }); diff --git a/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap index 20947e673da..38f42802626 100644 --- a/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap +++ b/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap @@ -1,3208 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state fetching the wallet on the v6 lane captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "decimals": 9, - "name": "$$$DOGECHAIN", - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "assetPriceType": "fungible", - "lastUpdated": 0, - "price": 1, - "usdPrice": 1, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full state as a golden record 1`] = ` +exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) generates snapshot (source of truth) 1`] = ` { "assetPreferences": {}, "assetsBalance": { diff --git a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap index 5f30a88e869..ce6cd77e9c6 100644 --- a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap +++ b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet generates snapshot (source of truth) 1`] = ` +exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) generates snapshot (source of truth) 1`] = ` { "assetsBalance": { "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { @@ -1061,2234 +1061,3 @@ exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first p "updateMode": "full", } `; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset does not re-read the custom asset on RPC when the Accounts API resolves the includeAssetIds 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/slip44:714", - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "updateMode": "full", -} -`; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "amount": "4321", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "errors": {}, - "updateMode": "full", -} -`; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind generates snapshot (source of truth) 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [], - }, - "updateMode": "full", -} -`; diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index ff7e941aa33..b0cb1ac8a3a 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable jest/no-restricted-matchers */ import { parseCaipAssetType } from '@metamask/utils'; import { cleanAll } from 'nock'; @@ -304,10 +303,13 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = it('answers with an authoritative full snapshot', () => { expect(response.updateMode).toBe('full'); }); + }); - it('generates snapshot (source of truth)', () => { - expect(withZeroedTimestamps(response)).toMatchSnapshot(); - }); + it('generates snapshot (source of truth)', async () => { + const { response } = await runPipeline(buildEmptyAssetsState()); + + // eslint-disable-next-line jest/no-restricted-matchers + expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); }); @@ -369,8 +371,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // retry is queued) nor left to the legacy stale-asset sweep. expect(requests).toHaveLength(0); expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); - - expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); it('re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds', async () => { @@ -396,7 +396,5 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ amount: '4321', }); - - expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); }); From 9f8f11841d649218fd5cc43277ce1aa5d4d181dd Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Mon, 28 Sep 2026 11:10:30 +0100 Subject: [PATCH 25/25] test: remove v6 golden-record snapshots The golden-record snapshot tests, snapshot files, and the withZeroedTimestamps helper are moving to the stacked snapshot PR (#10490), so they are removed from this suite. --- oxlint-suppressions.json | 10 - ...tering.accounts-api-v6.integration.test.ts | 34 +- .../src/__fixtures__/test-utils.ts | 32 - ...g.accounts-api-v6.integration.test.ts.snap | 4247 ----------------- ...g.accounts-api-v6.integration.test.ts.snap | 3294 ------------- ...tering.accounts-api-v6.integration.test.ts | 20 - 6 files changed, 1 insertion(+), 7636 deletions(-) delete mode 100644 packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap delete mode 100644 packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index f9e9cad880a..8202d6da79c 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -391,11 +391,6 @@ "count": 1 } }, - "packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { - "jest/no-restricted-matchers": { - "count": 3 - } - }, "packages/assets-controller/src/AssetsController.spam-cleanup.test.ts": { "typescript/no-unsafe-assignment": { "count": 1 @@ -620,11 +615,6 @@ "count": 2 } }, - "packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts": { - "jest/no-restricted-matchers": { - "count": 3 - } - }, "packages/assets-controller/src/pipeline/buildFastFetchSources.test.ts": { "no-unused-vars": { "count": 1 diff --git a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 05903036929..0e64023aae7 100644 --- a/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -19,11 +19,7 @@ import { import { createMockMessengers } from './__fixtures__/MockAssetControllerMessenger.js'; import type { MockRootMessenger } from './__fixtures__/MockAssetControllerMessenger.js'; import { createTestApiClient } from './__fixtures__/mockTokenApi.js'; -import { - waitFor, - waitUntilStable, - withZeroedTimestamps, -} from './__fixtures__/test-utils.js'; +import { waitFor, waitUntilStable } from './__fixtures__/test-utils.js'; import { AssetsController } from './AssetsController.js'; import type { AssetsControllerState } from './AssetsController.js'; @@ -195,16 +191,6 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE)', () it('keeps the spam token out of prices', () => { expect(PRICES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeUndefined(); }); - - // Golden-record catch-all: the targeted assertions above only pin - // CDOGE/BNB. This snapshot pins the whole persisted state, so any - // unexpected asset sneaking in, any captured asset dropping out, or any - // field-level drift (fast lane or slow lane) shows up as a reviewable - // diff. Volatile price timestamps are zeroed so the record is - // deterministic. - it('captures the full state as a golden record', () => { - expect(withZeroedTimestamps(state)).toMatchSnapshot(); - }); }); }); @@ -249,17 +235,6 @@ describe('AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) impor expect(BALANCES.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); expect(METADATA.lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }); - - // Golden-record catch-all for the custom-asset flow: the full state - // incl. the backend-answered Malicious row and its price, with volatile - // price timestamps zeroed for determinism. - it('captures the full state as a golden record', async () => { - const { state: goldenState } = await fetchWallet( - buildCustomAssetWalletState(), - ); - - expect(withZeroedTimestamps(goldenState)).toMatchSnapshot(); - }); }); describe("AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state", () => { @@ -332,12 +307,5 @@ describe("AssetsController (Accounts API v6): 'full' update operation - stale tr expect(lookUp(state, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); }, ); - - // Golden record of the full update over a stale v5-era wallet: the - // authoritative snapshot wiped the seeded balance, everything else - // lingers append-only. - it('captures the full state as a golden record', () => { - expect(withZeroedTimestamps(state)).toMatchSnapshot(); - }); }); }); diff --git a/packages/assets-controller/src/__fixtures__/test-utils.ts b/packages/assets-controller/src/__fixtures__/test-utils.ts index 5e5ec9d2cbe..d29cb529938 100644 --- a/packages/assets-controller/src/__fixtures__/test-utils.ts +++ b/packages/assets-controller/src/__fixtures__/test-utils.ts @@ -48,38 +48,6 @@ export const waitFor = async ( ); }; -/** - * Returns a plain deep clone of the given response or state object with - * all `lastUpdated` timestamps zeroed. - * - * The fast lane stamps `assetsPrice` entries with `Date.now()` at fetch - * time (`PriceDataSource`), which would otherwise make snapshots - * non-deterministic. Zeroing every `lastUpdated` key normalizes the value - * without resorting to mock timers. - * - * @param value - The response or state object to normalize. - * @returns A plain deep clone with all `lastUpdated` timestamps zeroed. - */ -export const withZeroedTimestamps = (value: Value): Value => { - if (Array.isArray(value)) { - const entries = value as unknown[]; - return entries.map((entry) => withZeroedTimestamps(entry)) as Value; - } - if (value !== null && typeof value === 'object') { - const result: Record = {}; - for (const [key, entry] of Object.entries( - value as Record, - )) { - result[key] = - key === 'lastUpdated' && typeof entry === 'number' - ? 0 - : withZeroedTimestamps(entry); - } - return result as Value; - } - return value; -}; - /** * Testing Utility - waitUntilStable. Waits until a snapshot stops changing, * for tests that need background work to be finished rather than a particular diff --git a/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap deleted file mode 100644 index 20947e673da..00000000000 --- a/packages/assets-controller/src/__snapshots__/AssetsController.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap +++ /dev/null @@ -1,4247 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`AssetsController (Accounts API v6): 'full' update operation - stale tracked spam token already in state fetching the wallet on the v6 lane captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "decimals": 9, - "name": "$$$DOGECHAIN", - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "assetPriceType": "fungible", - "lastUpdated": 0, - "price": 1, - "usdPrice": 1, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "selectedCurrency": "usd", -} -`; - -exports[`AssetsController (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full state as a golden record 1`] = ` -{ - "assetPreferences": {}, - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.2040000000002", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.865", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.9", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.8438", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.54321", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.0094950054678", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2AA504586d6CaB3C59Fa629f74c586d78b93A025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9CAeebEf7C7DccD95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452D45d33490234B8C96f42342F1Be28c0FE097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xB0eB3e295B44d7D405ba8026A9734A9ab354a8B2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xFAA0fC7B803919B091dBe5FF709b2dAbb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/erc20:0xdF9e1A85dB4f985D5BB5644aD07d9D7EE5673B5E": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "customAssets": {}, - "selectedCurrency": "usd", -} -`; diff --git a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap b/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap deleted file mode 100644 index 930b0e06317..00000000000 --- a/packages/assets-controller/src/pipeline/__snapshots__/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts.snap +++ /dev/null @@ -1,3294 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) first pass over a fresh wallet captures the full response as a golden record 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/slip44:714", - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", - ], - }, - "updateMode": "full", -} -`; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset does not re-read the custom asset on RPC when the Accounts API resolves the includeAssetIds 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3": { - "amount": "48612246876233.123735212", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - "eip155:56/slip44:714": { - "allTimeHigh": 1369.99, - "allTimeLow": 0.0398177, - "assetPriceType": "fungible", - "circulatingSupply": 133161239.47, - "dilutedMarketCap": 95407679685, - "high1d": 751.19, - "id": "eip155:56/slip44:714", - "lastUpdated": 0, - "liquidity": 27035518.468615964, - "low1d": 715.6, - "marketCap": 95407675057, - "marketCapPercentChange1d": -4.34605, - "price": 716.8635016621672, - "priceChange1d": -32.63578477335386, - "pricePercentChange14d": 0.7, - "pricePercentChange1d": -4.32, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -18.6, - "pricePercentChange200d": 15, - "pricePercentChange30d": 18.3, - "pricePercentChange7d": 2.4, - "totalVolume": 1133782896, - "usdPrice": 716.8635016621672, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/slip44:714", - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1", - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955", - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97", - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2", - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8", - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600", - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E", - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097", - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0", - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63", - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8", - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0", - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "updateMode": "full", -} -`; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) imported as a custom asset re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "amount": "4321", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "aggregators": [ - "rubic", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": undefined, - "fees": undefined, - "honeypotStatus": { - "goPlus": true, - "honeypotIs": true, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "$$$DOGECHAIN", - "occurrences": 1, - "storage": { - "balance": 7, - }, - "symbol": "CDOGE", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 5486141.97077836, - "high1d": null, - "id": "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "lastUpdated": 0, - "liquidity": 1215355.4989798926, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 5.491481035e-11, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000000000000, - "totalVolume": 0, - "usdPrice": 5.491481035e-11, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [ - "eip155:56/erc20:0xa7255c85232a42b5c602ed66c319da9af8433bb3", - "eip155:56/erc20:0xA7255C85232A42B5c602ed66c319dA9af8433bb3", - ], - }, - "errors": {}, - "updateMode": "full", -} -`; - -exports[`assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) second pass over the wallet the first pass left behind captures the full response as a golden record 1`] = ` -{ - "assetsBalance": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": { - "eip155:56/erc20:0x003d87d02A2A01E9E8a20f507C83E15DD83A33d1": { - "amount": "910.204000000000200000", - }, - "eip155:56/erc20:0x0cCD575bf9378c06f6DCa82f8122F570769F00C2": { - "amount": "46530.000000000000000000", - }, - "eip155:56/erc20:0x2B72867c32CF673F7b02d208B26889fEd353B1f8": { - "amount": "5075.86500000", - }, - "eip155:56/erc20:0x4f0ed527e8A95ecAA132Af214dFd41F30b361600": { - "amount": "0.000000000001000000", - }, - "eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955": { - "amount": "0.002916000000000000", - }, - "eip155:56/erc20:0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E": { - "amount": "1000000.000000000", - }, - "eip155:56/erc20:0x77087aB5Df23cFB52449A188e80e9096201c2097": { - "amount": "27418.637920223037021652", - }, - "eip155:56/erc20:0x8899eC96ed8C96b5C86C23c3f069c3dEf75b6d97": { - "amount": "2919.859199999999000000", - }, - "eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { - "amount": "0.000253000000000000", - }, - "eip155:56/erc20:0x94a8b4EE5CD64C79D0Ee816f467EA73009f51aA0": { - "amount": "4624.900000000000000000", - }, - "eip155:56/erc20:0xBb7D61D2511fD2e63F02178ca9B663458Af9FC63": { - "amount": "17581.843800000000000000", - }, - "eip155:56/erc20:0xBbcF57177D8752B21d080bf30a06CE20aD6333F8": { - "amount": "18800.000000000000000000", - }, - "eip155:56/erc20:0xDdC0dBd7dC799ae53A98a60b54999cb6eBb3Abf0": { - "amount": "108055.236269088", - }, - "eip155:56/erc20:0xe57F73EB27Da9D17f90C994744D842e95700C100": { - "amount": "12345.543210000", - }, - "eip155:56/erc20:0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { - "amount": "0.671315783745192035", - }, - "eip155:56/slip44:714": { - "amount": "0.009495005467800000", - }, - }, - }, - "assetsInfo": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "aggregators": [ - "pancakeExtended", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": null, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1.png", - "isContractVerified": true, - "labels": undefined, - "name": "GT Protocol", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "GTAI", - "type": "erc20", - }, - "eip155:56/erc20:0x0ccd575bf9378c06f6dca82f8122f570769f00c2": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0.9800000000000005, - "maxFee": 1, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x0ccd575bf9378c06f6dca82f8122f570769f00c2.png", - "isContractVerified": true, - "labels": undefined, - "name": "CryptoBlades Kingdoms", - "occurrences": 3, - "storage": { - "approval": 4, - "balance": 6, - }, - "symbol": "KING", - "type": "erc20", - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 8, - "description": { - "en": "## What is Magic Square (SQR)? Magic Square is an immersive Discovery & Engagement Platform for the Web3 Crypto Ecosystem, empowering users to explore a wide array of community-vetted apps and games. Discover exciting rewards, engaging giveaways, and unlock incredible use-to-earn opportunities within our platform. The native utility token SQR is hosted on BNB Smart Chain. SQR powers all aspects of the Magic Square ecosystem and allows for the seamless integration of users, developers, and validators.## What Makes Magic Square Unique?Magic Square is a vibrant community-driven app store for web3 applications, providing crypto users with a seamless and intuitive interface. Our primary objective is to foster widespread adoption of cryptocurrencies and decentralized apps by attracting new users to the ecosystem. With our user-friendly platform and diverse app selection, we simplify web3 interaction, empowering individuals to navigate the crypto world with ease. Checkout the Magic Store [here](https://magic.store/). At Magic Square, we go beyond just offering an app store. We provide a range of exciting features designed to enhance the community experience. These include Magic Boost, an affiliate platform that rewards users for spreading the word; Hot Offers, which provide exclusive web3 deals; a Referral Program that encourages users to invite others to join; Karma Rewards, recognizing and incentivizing active community participation; Project Validation, allowing users to have a say in shaping the platform. Join us in shaping the future of decentralized technologies. Together, we can unlock the true potential of web3 and create a more inclusive and accessible digital landscape. Magic Square is backed by World-Class Investors and Partners: Binance Labs, Republic Capital, Kucoin Labs, Gate.io, Huobi Ventures, IQ Protocol, GSR, Dao Maker, AlphaGrep, Crypto.com, Forty two, Gravity Ventures##Who Are the Founders of SQR Protocol?Magic Square is the visionary creation of Andrey Nayman, a renowned Ph.D. and former Managing Director at Radical Ventures. With over 15 years of expertise in FinTech and a profound understanding of blockchain development, Nayman has played a pivotal role in shaping the industry. Notably, he was an active participant in the Ethereum ICO, witnessing firsthand the transformative power of decentralized technologies. Under Nayman's guidance, Magic Square has evolved into a formidable project supported by a team of accomplished product developers and project managers. Together, they bring a wealth of experience and expertise to drive the success of this groundbreaking venture.##Where can you buy Magic Square?This information will be disclosed with the launch of the Public Sale, which is set for 2023. To learn more about this project check https://linktr.ee/MagicSquare.", - }, - "erc20Permit": true, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x2b72867c32cf673f7b02d208b26889fed353b1f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Magic Square", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SQR", - "type": "erc20", - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "vBSWAP is Binance Smart Chain token used as incentive for Value DeFi BSC ecosystem users. Part of fees (decided by vGovernance) from Value DeFi BSC ecosystem are used to buyback and burn vBSWAP. Max supply of vBSWAP is 100000 and it will be distributed over period of 108 weeks with emission reduction by 10% every 4 weeks (eg. first four weeks total of 10600 vBSWAP tokens will be distributed to farmers, next four weeks 9540, etc", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x4f0ed527e8a95ecaa132af214dfd41f30b361600.png", - "isContractVerified": true, - "labels": undefined, - "name": "vBSWAP", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "VBSWAP", - "type": "erc20", - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Tether (USDT) is a cryptocurrency with a value meant to mirror the value of the U.S. dollar. The idea was to create a stable cryptocurrency that can be used like digital dollars. Coins that serve this purpose of being a stable dollar substitute are called “stable coins.” Tether is the most popular stable coin and even acts as a dollar replacement on many popular exchanges! According to their site, Tether converts cash into digital currency, to anchor or “tether” the value of the coin to the price of national currencies like the US dollar, the Euro, and the Yen. Like other cryptos it uses blockchain. Unlike other cryptos, it is [according to the official Tether site] “100% backed by USD” (USD is held in reserve). The primary use of Tether is that it offers some stability to the otherwise volatile crypto space and offers liquidity to exchanges who can’t deal in dollars and with banks (for example to the sometimes controversial but leading exchange Bitfinex).The digital coins are issued by a company called Tether Limited that is governed by the laws of the British Virgin Islands, according to the legal part of its website. It is incorporated in Hong Kong. It has emerged that Jan Ludovicus van der Velde is the CEO of cryptocurrency exchange Bitfinex, which has been accused of being involved in the price manipulation of bitcoin, as well as tether. Many people trading on exchanges, including Bitfinex, will use tether to buy other cryptocurrencies like bitcoin. Tether Limited argues that using this method to buy virtual currencies allows users to move fiat in and out of an exchange more quickly and cheaply. Also, exchanges typically have rocky relationships with banks, and using Tether is a way to circumvent that.USDT is fairly simple to use. Once on exchanges like Poloniex or Bittrex, it can be used to purchase Bitcoin and other cryptocurrencies. It can be easily transferred from an exchange to any Omni Layer enabled wallet. Tether has no transaction fees, although external wallets and exchanges may charge one. In order to convert USDT to USD and vise versa through the Tether.to Platform, users must pay a small fee. Buying and selling Tether for Bitcoin can be done through a variety of exchanges like the ones mentioned previously or through the Tether.to platform, which also allows the conversion between USD to and from your bank account.", - "ko": "미국 달러화를 기반으로 한 블록체인1) 기반 암호화폐실제 달러화 유보금과 1:1정도의 비율을 유지함으로써 가치의 변동성이 거의 없다는 것이 특징가치 변동이 심한 다른 암호화폐 거래 시 안정적인 자산 운용을 위한 역할을 수행하고 있음가치암호화폐 거래를 위한 실질적 기축통화와 1:1 비율로 가치를 형성하는 거래 수단 및 극심한 변동성을 가지고 있는 다른 암호화폐를 거래하기 위한 실질적인 화폐의 기능을 수행할 수 있는 목적으로 만들어진 암호화폐 입니다.이러한 역할을 수행할 수 있는 화폐는 신뢰성을 바탕으로 운영과 관리가 되어야 하며 이를 운영사인 Tether사에서 은행에 1:1비율로 보유하고 있는 미국 달러를 토대로 투명하게 정기적으로 재무 상태를 공개하며 운영을 하는 정책을 가지고 있지만 실질적으로 2017년 들어 의혹이 생길 만한 일들이 다소 발생하였고 이로 인하여 신뢰도가 어느정도 하락한 상태입니다.하지만 아직까지는 USD를 기반으로 한 안정적인 가치의 유지는 지속되고 있으며 여전히 거래 시장 또한 활발하게 움직이고 있는 상황입니다.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x55d398326f99059ff775485246999027b3197955.png", - "isContractVerified": true, - "labels": undefined, - "name": "Tether USD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDT", - "type": "erc20", - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rango", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x69b14e8d3cebfdd8196bfe530954a0c226e5008e.png", - "isContractVerified": true, - "labels": undefined, - "name": "SPACEPI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "SPACEPI", - "type": "erc20", - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "aggregators": [ - "pancakeCoinMarketCap", - "oneInch", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "hi is leveraging blockchain technology to build services that are community powered. Members of hi are the key stakeholders of this ecosystem and the business is committed to maximize membership value - not profits. Our first product is a digital wallet that provides members with the most seamless payment experience via social messengers (initially Telegram and WhatsApp, next LINE, Facebook Messenger and others). For more information, visit hi.com.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x77087ab5df23cfb52449a188e80e9096201c2097.png", - "isContractVerified": true, - "labels": undefined, - "name": "hi Dollar", - "occurrences": 5, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "HI", - "type": "erc20", - }, - "eip155:56/erc20:0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97": { - "aggregators": [ - "pancakeCoinMarketCap", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Openfabric is a decentralized AI platform where the collaboration between AI innovators, data providers, businesses, and infrastructure providers will facilitate the creation and use of new intelligent algorithms and services.Openfabric AI is revolutionizing AI-Apps with its decentralized Layer 1 AI protocol, powered by blockchain and advanced cryptography.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97.png", - "isContractVerified": true, - "labels": undefined, - "name": "Openfabric AI", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "OFN", - "type": "erc20", - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "rubic", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d.png", - "isContractVerified": true, - "labels": undefined, - "name": "Binance-Peg USD Coin", - "occurrences": 8, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "USDC", - "type": "erc20", - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "aggregators": [ - "coinGecko", - "rubic", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": undefined, - "isContractVerified": true, - "labels": undefined, - "name": "Realio Network Token", - "occurrences": 4, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "RIO", - "type": "erc20", - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63.png", - "isContractVerified": true, - "labels": undefined, - "name": "Exverse", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "EXVG", - "type": "erc20", - }, - "eip155:56/erc20:0xbbcf57177d8752b21d080bf30a06ce20ad6333f8": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Zam.io is building a hybrid CeFi-DeFi financial ecosystem that bridges real capital to blockchain and accelerates the transition to the new decentralized economy. The ecosystem enables equity investors to extend their stocks portfolio to crypto markets using a platform for stablecoin loans secured by stocks as collateral (zMorgan Protocol).", - }, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xbbcf57177d8752b21d080bf30a06ce20ad6333f8.png", - "isContractVerified": true, - "labels": undefined, - "name": "Zam.io", - "occurrences": 3, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "ZAM", - "type": "erc20", - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "aggregators": [ - "pancakeCoinMarketCap", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": ""SafeBLAST (BLAST) is both a UTILITY and a DEFLATIONARY token available on multiple blockchains. As a utility token, you can use BLAST for direct payment on goods and services where accepted worldwide. As a deflationary token, SafeBLAST is an Autonomous yield and Liquidity generation protocol. Every time someone transfers, buys or sells BLAST tokens on PancakeSwap, the total supply goes down.Every transaction also creates a passive effortless reward distribution for all token HODLers on the BNB Blockchain, which is where PancakeSwap transactions takes place. There is NO buy or sell tax on Centralized exchanges or Uniswap, which is why there is NO reward distribution either. Distribution is only to the wallets on Binance Chain (BNB Chain).Liquidity is also generated and locked automatically to support the ecosystem on PancakeSwap. As the circulating supply becomes limited, supply and demand will play a big role in the value growth, which is a win-win for BLAST holders."", - }, - "erc20Permit": false, - "fees": { - "avgFee": 9.999999999999996, - "maxFee": 10, - "minFee": 10, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0.png", - "isContractVerified": true, - "labels": undefined, - "name": "SafeBlast", - "occurrences": 3, - "storage": { - "approval": 5, - "balance": 7, - }, - "symbol": "BLAST", - "type": "erc20", - }, - "eip155:56/erc20:0xe57f73eb27da9d17f90c994744d842e95700c100": { - "aggregators": [ - "pancakeCoinGecko", - "rango", - "sonarwatch", - ], - "coingeckoId": undefined, - "decimals": 9, - "description": { - "en": "What is the project about?The most memeable memecoin in existence. The dogs have had their day, it’s time for Pepe AI to take reign.What makes your project unique?We are PEPE with Draw PEPE AI running live, every PEPE drawn is watermark with our website for further marketing exposure.History of your project.Pepe AI is here to make memecoins great again. Launched stealth with no presale, zero taxes, LP locked and contract renounced, $PEPEAI is a coin for the people, forever. Fueled by pure memetic power, let $PEPEAI show you the way.What’s next for your project?More AI tools for Meme communities.What can your token be used for?To be paid for premium subscription for removal of watermark for AI images drawn by our AI tools.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe57f73eb27da9d17f90c994744d842e95700c100.png", - "isContractVerified": true, - "labels": undefined, - "name": "Pepe AI", - "occurrences": 3, - "storage": { - "approval": 1, - "balance": 0, - }, - "symbol": "PEPEAI", - "type": "erc20", - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "aggregators": [ - "pancakeExtended", - "liFi", - "oneInch", - "squid", - "rango", - "sonarwatch", - "sushiSwap", - "trustWallet", - "binanceDex", - ], - "coingeckoId": undefined, - "decimals": 18, - "description": undefined, - "erc20Permit": false, - "fees": { - "avgFee": 0, - "maxFee": 0, - "minFee": 0, - }, - "honeypotStatus": { - "goPlus": false, - "honeypotIs": false, - }, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/erc20/0xe9e7cea3dedca5984780bafc599bd69add087d56.png", - "isContractVerified": true, - "labels": [ - "badges:v1:stablecoin", - ], - "name": "BUSD", - "occurrences": 9, - "storage": { - "approval": 2, - "balance": 1, - }, - "symbol": "BUSD", - "type": "erc20", - }, - "eip155:56/slip44:714": { - "aggregators": [], - "coingeckoId": undefined, - "decimals": 18, - "description": { - "en": "Binance Coin is the cryptocurrency of the Binance platform. It is a trading platform exclusively for cryptocurrencies. The name "Binance" is a combination of binary and finance.Thus, the startup name shows that only cryptocurrencies can be traded against each other. It is not possible to trade crypto currencies against Fiat. The platform achieved an enormous success within a very short time and is focused on worldwide market with Malta headquarters. The cryptocurrency currently has a daily trading volume of 1.5 billion - 2 billion US dollars and is still increasing.In total, there will only be 200 million BNBs. Binance uses the ERC20 token standard from Ethereum and has distributed it as follow: 50% sold on ICO, 40% to the team and 10% to Angel investors. The coin can be used to pay fees on Binance. These include trading fees, transaction fees, listing fees and others. Binance gives you a huge discount when fees are paid in BNB. The schedule of BNB fees discount is as follow: In the first year, 50% discount on all fees, second year 25% discount, third year 12.5% discount, fourth year 6.75 % discount, and from the fifth year onwards there is no discount. This structure is used to incentivize users to buy BNB and do trades within Binance.Binance announced in a buyback plan that it would buy back up to 100 million BNB in Q1 2018. The coins are then burned. This means that they are devaluated to increase the value of the remaining coins. This benefits investors. In the future, the cryptocurrency will remain an asset on the trading platform and will be used as gas.Other tokens that are issued by exchanges include Bibox Token, OKB, Huobi Token, and more.", - }, - "erc20Permit": false, - "fees": undefined, - "honeypotStatus": {}, - "image": "https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/56/slip44/714.png", - "isContractVerified": false, - "labels": undefined, - "name": "Binance Coin", - "occurrences": 1, - "storage": undefined, - "symbol": "BNB", - "type": "native", - }, - }, - "assetsPrice": { - "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1": { - "allTimeHigh": 5.46, - "allTimeLow": 0.00604714, - "assetPriceType": "fungible", - "circulatingSupply": 69880943.68552426, - "dilutedMarketCap": 540387, - "high1d": 0.00721852, - "id": "eip155:56/erc20:0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1", - "lastUpdated": 0, - "low1d": 0.00714369, - "marketCap": 503504, - "marketCapPercentChange1d": 1.23194, - "price": 0.00720484, - "priceChange1d": 0.00008736, - "pricePercentChange14d": -23.7, - "pricePercentChange1d": 1.22737, - "pricePercentChange1h": 0.1, - "pricePercentChange1y": -92.8, - "pricePercentChange200d": -84.8, - "pricePercentChange30d": -13.5, - "pricePercentChange7d": -22.3, - "totalVolume": 185919, - "usdPrice": 0.00720484, - }, - "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 109800.696381147, - "high1d": null, - "id": "eip155:56/erc20:0x2aa504586d6cab3c59fa629f74c586d78b93a025", - "lastUpdated": 0, - "liquidity": 87007.28289524098, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001430968154, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.001430968154, - }, - "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8": { - "allTimeHigh": 0.775708, - "allTimeLow": 0.00006158, - "assetPriceType": "fungible", - "circulatingSupply": 719255546.828825, - "dilutedMarketCap": 80567, - "high1d": 0.00009934, - "id": "eip155:56/erc20:0x2b72867c32cf673f7b02d208b26889fed353b1f8", - "lastUpdated": 0, - "low1d": 0.00008185, - "marketCap": 61019, - "marketCapPercentChange1d": 2.89297, - "price": 0.00008501, - "priceChange1d": 0.00000256, - "pricePercentChange14d": -6.9, - "pricePercentChange1d": 2.73071, - "pricePercentChange1h": -2.5, - "pricePercentChange1y": -98.4, - "pricePercentChange200d": -74.5, - "pricePercentChange30d": -6.5, - "pricePercentChange7d": -1.1, - "totalVolume": 92771, - "usdPrice": 0.00008501, - }, - "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 140814.349477256, - "high1d": null, - "id": "eip155:56/erc20:0x4f0ed527e8a95ecaa132af214dfd41f30b361600", - "lastUpdated": 0, - "liquidity": 3706.966847093036, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 14.6695460693, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -3.548, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 9599.09680108329, - "totalVolume": 66.0330720783275, - "usdPrice": 14.6695460693, - }, - "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955": { - "allTimeHigh": 1.85, - "allTimeLow": 0.941022, - "assetPriceType": "fungible", - "circulatingSupply": 9184991905.680809, - "dilutedMarketCap": 9181946768, - "high1d": 0.999919, - "id": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955", - "lastUpdated": 0, - "liquidity": 613589475.6193123, - "low1d": 0.999558, - "marketCap": 9181946768, - "marketCapPercentChange1d": -0.01702, - "price": 0.9997597462199397, - "priceChange1d": -0.000169090781822367, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.02, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": 0, - "pricePercentChange30d": 0.1, - "pricePercentChange7d": 0, - "totalVolume": 1252391401, - "usdPrice": 0.9997597462199397, - }, - "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 1197830.38634154, - "high1d": null, - "id": "eip155:56/erc20:0x69b14e8d3cebfdd8196bfe530954a0c226e5008e", - "lastUpdated": 0, - "liquidity": 701831.6721570174, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 6.24277267e-10, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -4.624, - "pricePercentChange1h": -0.085, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 1999999997999990, - "totalVolume": 443.901054517397, - "usdPrice": 6.24277267e-10, - }, - "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097": { - "allTimeHigh": 1.57, - "allTimeLow": 0.00001497, - "assetPriceType": "fungible", - "circulatingSupply": 65859645815, - "dilutedMarketCap": 2196653, - "high1d": 0.00002244, - "id": "eip155:56/erc20:0x77087ab5df23cfb52449a188e80e9096201c2097", - "lastUpdated": 0, - "liquidity": 14473.719381952691, - "low1d": 0.00002161, - "marketCap": 1446708, - "marketCapPercentChange1d": null, - "price": 0.00002197, - "priceChange1d": null, - "pricePercentChange14d": -1.2, - "pricePercentChange1d": null, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -71.8, - "pricePercentChange200d": -54.6, - "pricePercentChange30d": 30.4, - "pricePercentChange7d": -0.3, - "totalVolume": 45.05, - "usdPrice": 0.00002197, - }, - "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 3569.9739533813, - "high1d": null, - "id": "eip155:56/erc20:0x8632055b9caeebef7c7dccd95461608ca5378839", - "lastUpdated": 0, - "liquidity": 0.5992849636201593, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00001784990067, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": null, - "pricePercentChange1h": null, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 0, - "usdPrice": 0.00001784990067, - }, - "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { - "allTimeHigh": 1.54, - "allTimeLow": 0.107192, - "assetPriceType": "fungible", - "circulatingSupply": 1588999877.439803, - "dilutedMarketCap": 1588817061, - "high1d": 1, - "id": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", - "lastUpdated": 0, - "liquidity": 48479575.53997608, - "low1d": 0.999718, - "marketCap": 1588817061, - "marketCapPercentChange1d": -0.00448, - "price": 0.9999793058607263, - "priceChange1d": -0.000044277307959528, - "pricePercentChange14d": 0, - "pricePercentChange1d": -0.04, - "pricePercentChange1h": 0, - "pricePercentChange1y": 0, - "pricePercentChange200d": -0.2, - "pricePercentChange30d": 0, - "pricePercentChange7d": 0, - "totalVolume": 1092971528, - "usdPrice": 0.9999793058607263, - }, - "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 131202.663241936, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0x9452d45d33490234b8c96f42342f1be28c0fe097", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 3620.847652722667, - "low1d": null, - "marketCap": 25516.6214230616, - "marketCapPercentChange1d": null, - "price": 0.0006560735838, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -2.305, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 200000000, - "totalVolume": 45.1025528431, - "usdPrice": 0.0006560735838, - }, - "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0": { - "allTimeHigh": 5.12, - "allTimeLow": 0.01342772, - "assetPriceType": "fungible", - "circulatingSupply": 330500000, - "dilutedMarketCap": 16183936, - "high1d": 0.05071, - "id": "eip155:56/erc20:0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0", - "lastUpdated": 0, - "liquidity": 286952.55296101805, - "low1d": 0.04844582, - "marketCap": 16183936, - "marketCapPercentChange1d": -1.03478, - "price": 0.04897826, - "priceChange1d": -0.00050178316195728, - "pricePercentChange14d": 1.4, - "pricePercentChange1d": -0.98825, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -82.7, - "pricePercentChange200d": -76.1, - "pricePercentChange30d": 40.3, - "pricePercentChange7d": 26.2, - "totalVolume": 204638, - "usdPrice": 0.04897826, - }, - "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 18403.4899850297, - "high1d": null, - "id": "eip155:56/erc20:0xb0eb3e295b44d7d405ba8026a9734a9ab354a8b2", - "lastUpdated": 0, - "liquidity": 1187.8332805053717, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.0001841583888, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 0, - "usdPrice": 0.0001841583888, - }, - "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 26277.6103202188, - "high1d": null, - "holderCount": null, - "id": "eip155:56/erc20:0xbb7d61d2511fd2e63f02178ca9b663458af9fc63", - "isMutable": null, - "lastUpdated": 0, - "liquidity": 1101.8053137481395, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.00006569537134, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": 0, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 400000000, - "totalVolume": 0, - "usdPrice": 0.00006569537134, - }, - "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0": { - "allTimeHigh": 0.00032667, - "allTimeLow": 8.9e-17, - "assetPriceType": "fungible", - "circulatingSupply": 0, - "dilutedMarketCap": 2871530, - "high1d": 3.006e-9, - "id": "eip155:56/erc20:0xddc0dbd7dc799ae53a98a60b54999cb6ebb3abf0", - "lastUpdated": 0, - "low1d": 2.863e-9, - "marketCap": 0, - "marketCapPercentChange1d": null, - "price": 2.871e-9, - "priceChange1d": -1.31283041e-10, - "pricePercentChange14d": -2.8, - "pricePercentChange1d": -4.40722, - "pricePercentChange1h": -0.2, - "pricePercentChange1y": -45.2, - "pricePercentChange200d": 5527215.5, - "pricePercentChange30d": 6, - "pricePercentChange7d": -0.8, - "totalVolume": 5.65, - "usdPrice": 2.871e-9, - }, - "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e": { - "allTimeHigh": 0.00502433, - "allTimeLow": 3.9844e-8, - "assetPriceType": "fungible", - "circulatingSupply": 87999997928.97575, - "dilutedMarketCap": 37045, - "high1d": 3.90567e-7, - "id": "eip155:56/erc20:0xdf9e1a85db4f985d5bb5644ad07d9d7ee5673b5e", - "lastUpdated": 0, - "low1d": 3.69265e-7, - "marketCap": 32600, - "marketCapPercentChange1d": -4.25951, - "price": 3.70568e-7, - "priceChange1d": -1.6367479209e-8, - "pricePercentChange14d": -0.7, - "pricePercentChange1d": -3.89934, - "pricePercentChange1h": -0.1, - "pricePercentChange1y": -91.6, - "pricePercentChange200d": -34.1, - "pricePercentChange30d": -0.9, - "pricePercentChange7d": 4.4, - "totalVolume": 194.16, - "usdPrice": 3.70568e-7, - }, - "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56": { - "allTimeHigh": 1.86, - "allTimeLow": 0.462821, - "assetPriceType": "fungible", - "circulatingSupply": 283188732.4703792, - "dilutedMarketCap": null, - "high1d": 1.018440961950845, - "id": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56", - "lastUpdated": 0, - "low1d": 0.995524765786234, - "marketCap": 283296437.81903726, - "marketCapPercentChange1d": null, - "price": 1.000380330628689, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.06, - "pricePercentChange1h": -0.03, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalVolume": 1031780.8750981385, - "usdPrice": 1.000380330628689, - }, - "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9": { - "allTimeHigh": null, - "allTimeLow": null, - "assetPriceType": "fungible", - "bondingCurveProgressPercent": null, - "circulatingSupply": null, - "dilutedMarketCap": 103785.929891558, - "high1d": null, - "id": "eip155:56/erc20:0xfaa0fc7b803919b091dbe5ff709b2dabb61b93d9", - "lastUpdated": 0, - "liquidity": 15553.255162248859, - "low1d": null, - "marketCap": null, - "marketCapPercentChange1d": null, - "price": 0.001037859309, - "priceChange1d": null, - "pricePercentChange14d": null, - "pricePercentChange1d": -0.225, - "pricePercentChange1h": 0, - "pricePercentChange1y": null, - "pricePercentChange200d": null, - "pricePercentChange30d": null, - "pricePercentChange7d": null, - "totalSupply": 100000000, - "totalVolume": 18.5327447356, - "usdPrice": 0.001037859309, - }, - }, - "detectedAssets": { - "b1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d": [], - }, - "updateMode": "full", -} -`; diff --git a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts index 802c13e24e3..b5e7a53ca48 100644 --- a/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts +++ b/packages/assets-controller/src/pipeline/buildFastFetchSources.bsc-spam-token-filtering.accounts-api-v6.integration.test.ts @@ -18,7 +18,6 @@ import { } from '../__fixtures__/bsc-spam-token/wallet.js'; import { createMockMessengers } from '../__fixtures__/MockAssetControllerMessenger.js'; import { createTestApiClient } from '../__fixtures__/mockTokenApi.js'; -import { withZeroedTimestamps } from '../__fixtures__/test-utils.js'; import { AccountsApiDataSource } from '../data-sources/AccountsApiDataSource.js'; import { PriceDataSource } from '../data-sources/PriceDataSource.js'; import { RpcDataSource } from '../data-sources/RpcDataSource.js'; @@ -303,15 +302,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE)', () = it('answers with an authoritative full snapshot', () => { expect(response.updateMode).toBe('full'); }); - - // Golden-record catch-all: the targeted assertions above only pin - // CDOGE/BNB. This snapshot pins the WHOLE captured row set, so any - // unexpected asset sneaking in, any captured asset dropping out, or - // any field-level drift shows up as a reviewable diff. Volatile price - // timestamps are zeroed so the record is deterministic. - it('captures the full response as a golden record', () => { - expect(withZeroedTimestamps(response)).toMatchSnapshot(); - }); }); }); @@ -373,11 +363,6 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import // retry is queued) nor left to the legacy stale-asset sweep. expect(requests).toHaveLength(0); expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toBeDefined(); - - // Golden record of the resolved-pin flow: the backend answered the - // Malicious row through the pin, so the response carries it without any - // RPC involvement. - expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); it('re-reads the custom asset on RPC when the Accounts API cannot process the includeAssetIds', async () => { @@ -403,10 +388,5 @@ describe('assets pipeline (Accounts API v6): BNB Chain spam token (CDOGE) import expect(BALANCES.lookUp(response, CDOGE_ASSET_ID_LOWERCASE)).toMatchObject({ amount: '4321', }); - - // Golden record of the unresolved-pin recovery: the Accounts API - // contributed nothing for the failed chain, so the recovered response - // is the RPC refetch merged over an empty answer. - expect(withZeroedTimestamps(response)).toMatchSnapshot(); }); });