From c34a6ee38c8f54f9b9561376f3be0a7ef7240483 Mon Sep 17 00:00:00 2001 From: Daniel Sinclair Date: Fri, 4 Aug 2023 14:52:24 -0400 Subject: [PATCH] feat: zora, base chain support (#767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Esteban MiƱo --- .env.d.ts | 2 ++ .../2_dappInteractionFlow.test.ts | 2 +- e2e/serial/swap/1_swapFlow1.test.ts | 2 +- src/core/firebase/remoteConfig.ts | 4 +++ src/core/languages/_english.json | 17 ++++++---- src/core/network/refractionAddressWs.ts | 4 +++ src/core/references/gasUnits.ts | 2 ++ src/core/references/index.ts | 8 +++++ src/core/resources/_selectors/assets.ts | 4 +++ src/core/resources/addys/addysSummary.ts | 2 ++ src/core/resources/search/tokenSearch.ts | 2 ++ src/core/state/favorites/index.ts | 4 +++ src/core/types/assets.ts | 2 ++ src/core/types/chains.ts | 6 ++++ src/core/utils/chains.ts | 20 +++++++++++- src/core/utils/connectedApps.ts | 6 ++++ src/core/utils/gas.ts | 4 +++ src/core/wagmi/createTestWagmiClient.ts | 12 +++++-- src/core/wagmi/createWagmiClient.ts | 4 +++ src/design-system/styles/designTokens.ts | 12 +++++++ src/entries/iframe/notification.tsx | 2 ++ .../components/ChainBadge/ChainBadge.tsx | 16 ++++++---- .../useApproveAppRequestValidations.ts | 12 ++++++- .../popup/hooks/swap/useSwapSettings.ts | 6 ++++ src/entries/popup/hooks/useFavoriteAssets.ts | 2 ++ .../popup/hooks/useNativeAssetForNetwork.ts | 4 +++ .../popup/hooks/useSearchCurrencyLists.ts | 28 ++++++++++++++++ src/entries/popup/hooks/useSwappableAssets.ts | 30 ++++++++++++++++++ .../TokenDropdown/TokenToBuySection.tsx | 2 ++ static/allowlist.json | 4 ++- static/assets/badges/arbitrumBadge.png | Bin 3926 -> 1025 bytes static/assets/badges/arbitrumBadge@2x.png | Bin 0 -> 2260 bytes static/assets/badges/arbitrumBadge@3x.png | Bin 0 -> 3590 bytes static/assets/badges/baseBadge.png | Bin 0 -> 505 bytes static/assets/badges/baseBadge@2x.png | Bin 0 -> 874 bytes static/assets/badges/baseBadge@3x.png | Bin 0 -> 1296 bytes static/assets/badges/bscBadge.png | Bin 2159 -> 699 bytes static/assets/badges/bscBadge@2x.png | Bin 0 -> 1390 bytes static/assets/badges/bscBadge@3x.png | Bin 0 -> 2015 bytes static/assets/badges/ethereumBadge.png | Bin 1446 -> 839 bytes static/assets/badges/ethereumBadge@2x.png | Bin 0 -> 1858 bytes static/assets/badges/ethereumBadge@3x.png | Bin 0 -> 3230 bytes static/assets/badges/hardhatBadge.png | Bin 4916 -> 811 bytes static/assets/badges/hardhatBadge@2x.png | Bin 0 -> 1954 bytes static/assets/badges/hardhatBadge@3x.png | Bin 0 -> 3433 bytes static/assets/badges/optimismBadge.png | Bin 2561 -> 628 bytes static/assets/badges/optimismBadge@2x.png | Bin 0 -> 1322 bytes static/assets/badges/optimismBadge@3x.png | Bin 0 -> 2116 bytes static/assets/badges/polygonBadge.png | Bin 3563 -> 860 bytes static/assets/badges/polygonBadge@2x.png | Bin 0 -> 1869 bytes static/assets/badges/polygonBadge@3x.png | Bin 0 -> 3078 bytes static/assets/badges/zoraBadge.png | Bin 0 -> 976 bytes static/assets/badges/zoraBadge@2x.png | Bin 0 -> 2457 bytes static/assets/badges/zoraBadge@3x.png | Bin 0 -> 4207 bytes 54 files changed, 206 insertions(+), 19 deletions(-) create mode 100644 static/assets/badges/arbitrumBadge@2x.png create mode 100644 static/assets/badges/arbitrumBadge@3x.png create mode 100644 static/assets/badges/baseBadge.png create mode 100644 static/assets/badges/baseBadge@2x.png create mode 100644 static/assets/badges/baseBadge@3x.png create mode 100644 static/assets/badges/bscBadge@2x.png create mode 100644 static/assets/badges/bscBadge@3x.png create mode 100644 static/assets/badges/ethereumBadge@2x.png create mode 100644 static/assets/badges/ethereumBadge@3x.png create mode 100644 static/assets/badges/hardhatBadge@2x.png create mode 100644 static/assets/badges/hardhatBadge@3x.png create mode 100644 static/assets/badges/optimismBadge@2x.png create mode 100644 static/assets/badges/optimismBadge@3x.png create mode 100644 static/assets/badges/polygonBadge@2x.png create mode 100644 static/assets/badges/polygonBadge@3x.png create mode 100644 static/assets/badges/zoraBadge.png create mode 100644 static/assets/badges/zoraBadge@2x.png create mode 100644 static/assets/badges/zoraBadge@3x.png diff --git a/.env.d.ts b/.env.d.ts index 416557b240..200cfad4f9 100644 --- a/.env.d.ts +++ b/.env.d.ts @@ -3,6 +3,8 @@ declare global { interface ProcessEnv { ALCHEMY_API_KEY: string; BSC_MAINNET_RPC: string; + ZORA_MAINNET_RPC: string; + BASE_MAINNET_RPC: string; ETHERSCAN_API_KEY: string; SEGMENT_WRITE_KEY: string; SENTRY_DSN: string; diff --git a/e2e/serial/dappInteractions/2_dappInteractionFlow.test.ts b/e2e/serial/dappInteractions/2_dappInteractionFlow.test.ts index 0b0fc83069..4871b863bd 100644 --- a/e2e/serial/dappInteractions/2_dappInteractionFlow.test.ts +++ b/e2e/serial/dappInteractions/2_dappInteractionFlow.test.ts @@ -256,7 +256,7 @@ describe('App interactions flow', () => { }); await findElementByTextAndClick(driver, 'bx-e2e-dapp.vercel.app'); - await findElementByTestIdAndClick({ id: 'switch-network-item-5', driver }); + await findElementByTestIdAndClick({ id: 'switch-network-item-7', driver }); await driver.get('https://bx-e2e-dapp.vercel.app/'); const dappHandler = await getWindowHandle({ driver }); diff --git a/e2e/serial/swap/1_swapFlow1.test.ts b/e2e/serial/swap/1_swapFlow1.test.ts index 96fc18c3bc..dbe601cc22 100644 --- a/e2e/serial/swap/1_swapFlow1.test.ts +++ b/e2e/serial/swap/1_swapFlow1.test.ts @@ -631,7 +631,7 @@ it('should be able to filter assets to buy by network', async () => { driver, }); await findElementByTestIdAndClick({ - id: 'switch-network-item-4', + id: 'switch-network-item-6', driver, }); await typeOnTextInput({ diff --git a/src/core/firebase/remoteConfig.ts b/src/core/firebase/remoteConfig.ts index 11448a520e..35d5c9326e 100644 --- a/src/core/firebase/remoteConfig.ts +++ b/src/core/firebase/remoteConfig.ts @@ -30,6 +30,8 @@ export interface RainbowConfig extends Record { [ChainName.optimism]: number; [ChainName.polygon]: number; [ChainName.arbitrum]: number; + [ChainName.base]: number; + [ChainName.zora]: number; [ChainName.bsc]: number; }; } @@ -47,6 +49,8 @@ const DEFAULT_CONFIG = { mainnet: 100, optimism: 200, polygon: 200, + base: 200, + zora: 200, bsc: 200, }, }; diff --git a/src/core/languages/_english.json b/src/core/languages/_english.json index 6bcaa8a3d0..bb7d72622e 100644 --- a/src/core/languages/_english.json +++ b/src/core/languages/_english.json @@ -773,15 +773,12 @@ "month": "1M", "year": "1Y", "approvals": "Token Approvals", - "this_token_is_on_network": "This %{symbol} is on the %{chainName} network", - "more_options": { "copy_address": "Copy Address", "hide": "Hide Token", "report": "Report Token" }, - "about": { "about_token": "About %{name}", "price": "Price", @@ -798,12 +795,10 @@ "title": "Fully Diluted Market Cap", "description": "The maximum possible market cap of a token if the total supply was available in circulation." }, - "supply": "Supply", "max_total_supply": "Max Total Supply", "holders": "Holders", "total_transfers": "Total Transfers", - "more_info": "More info", "token_standard": "Token Standard", "token_contract": "Token Contract", @@ -861,6 +856,16 @@ "description_1": "Binance Smart Chain, or BSC for short, is the blockchain network for the trading platform Binance.", "description_2": "It allows for cheaper and faster transactions, but unlike Layer 2 networks, BSC has its own security and consensus mechanisms that differ from Ethereum." }, + "base": { + "title": "What's Base?", + "description_1": "Base is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.", + "description_2": "It bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum." + }, + "zora": { + "title": "What's Zora?", + "description_1": "Zora is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.", + "description_2": "It bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum." + }, "link_button_label": "Read more", "action_label": "Got it" }, @@ -970,4 +975,4 @@ "after": " to request more." } } -} +} \ No newline at end of file diff --git a/src/core/network/refractionAddressWs.ts b/src/core/network/refractionAddressWs.ts index 8f0a67909f..8d6ea3fb20 100644 --- a/src/core/network/refractionAddressWs.ts +++ b/src/core/network/refractionAddressWs.ts @@ -5,6 +5,8 @@ export const refractionAddressMessages = { RECEIVED: 'received address assets', RECEIVED_ARBITRUM: 'received address arbitrum-assets', RECEIVED_OPTIMISM: 'received address optimism-assets', + RECEIVED_BASE: 'received address base-assets', + RECEIVED_ZORA: 'received address zora-assets', RECEIVED_POLYGON: 'received address polygon-assets', REMOVED: 'removed address assets', }, @@ -14,6 +16,8 @@ export const refractionAddressMessages = { RECEIVED: 'received address transactions', RECEIVED_ARBITRUM: 'received address arbitrum-transactions', RECEIVED_OPTIMISM: 'received address optimism-transactions', + RECEIVED_BASE: 'received address base-transactions', + RECEIVED_ZORA: 'received address zora-transactions', RECEIVED_POLYGON: 'received address polygon-transactions', REMOVED: 'removed address transactions', }, diff --git a/src/core/references/gasUnits.ts b/src/core/references/gasUnits.ts index d978e1e078..45c34c820a 100644 --- a/src/core/references/gasUnits.ts +++ b/src/core/references/gasUnits.ts @@ -8,6 +8,8 @@ export const gasUnits = { [ChainId.mainnet]: '200000', [ChainId.arbitrum]: '3500000', [ChainId.optimism]: '1000000', + [ChainId.base]: '1000000', + [ChainId.zora]: '1000000', [ChainId.bsc]: '600000', [ChainId.polygon]: '600000', }, diff --git a/src/core/references/index.ts b/src/core/references/index.ts index 4b9d824462..9daf9a64fb 100644 --- a/src/core/references/index.ts +++ b/src/core/references/index.ts @@ -61,6 +61,12 @@ export const USDC_OPTIMISM_ADDRESS = export const WBTC_OPTIMISM_ADDRESS = '0x68f180fcce6836688e9084f035309e29bf0a2095'; +// base +export const ETH_BASE_ADDRESS = AddressZero; + +// zora +export const ETH_ZORA_ADDRESS = AddressZero; + // bsc export const BSC_BNB_ADDRESS = AddressZero; @@ -91,6 +97,8 @@ export const NATIVE_ASSETS_PER_CHAIN = { [ChainId.bsc]: BSC_BNB_ADDRESS, [ChainId.mainnet]: ETH_ADDRESS, [ChainId.optimism]: ETH_OPTIMISM_ADDRESS, + [ChainId.base]: ETH_BASE_ADDRESS, + [ChainId.zora]: ETH_ZORA_ADDRESS, [ChainId.polygon]: MATIC_POLYGON_ADDRESS, [ChainId.hardhat]: ETH_ADDRESS, }; diff --git a/src/core/resources/_selectors/assets.ts b/src/core/resources/_selectors/assets.ts index f9c8ab02e0..247285b443 100644 --- a/src/core/resources/_selectors/assets.ts +++ b/src/core/resources/_selectors/assets.ts @@ -38,6 +38,8 @@ export function selectUserAssetsListByChainId(assets: ParsedAssetsDictByChain) { assets?.[ChainId.optimism], assets?.[ChainId.polygon], assets?.[ChainId.arbitrum], + assets?.[ChainId.base], + assets?.[ChainId.zora], assets?.[ChainId.bsc], ].flat(); return assetsByNetwork @@ -62,6 +64,8 @@ export function selectUserAssetAddressMapByChainId( [ChainId.bsc]: mapAddresses(assets?.[ChainId.bsc]) || [], [ChainId.polygon]: mapAddresses(assets?.[ChainId.polygon]) || [], [ChainId.arbitrum]: mapAddresses(assets?.[ChainId.arbitrum]) || [], + [ChainId.base]: mapAddresses(assets?.[ChainId.base]) || [], + [ChainId.zora]: mapAddresses(assets?.[ChainId.zora]) || [], }; } diff --git a/src/core/resources/addys/addysSummary.ts b/src/core/resources/addys/addysSummary.ts index 81b884bf50..9be1b3be76 100644 --- a/src/core/resources/addys/addysSummary.ts +++ b/src/core/resources/addys/addysSummary.ts @@ -16,6 +16,8 @@ enum SummarySupportedChainId { optimism = ChainId.optimism as number, polygon = ChainId.polygon as number, arbitrum = ChainId.arbitrum as number, + base = ChainId.base as number, + zora = ChainId.zora as number, bsc = ChainId.bsc as number, } diff --git a/src/core/resources/search/tokenSearch.ts b/src/core/resources/search/tokenSearch.ts index c0cacec676..95705522e3 100644 --- a/src/core/resources/search/tokenSearch.ts +++ b/src/core/resources/search/tokenSearch.ts @@ -99,6 +99,8 @@ function parseTokenSearch(assets: SearchAsset[], chainId: ChainId) { `${ETH_ADDRESS}_${ChainId.arbitrum}`, `${BNB_MAINNET_ADDRESS}_${ChainId.bsc}`, `${MATIC_MAINNET_ADDRESS}_${ChainId.polygon}`, + `${ETH_ADDRESS}_${ChainId.base}`, + `${ETH_ADDRESS}_${ChainId.zora}`, ].includes(`${a.uniqueId}_${chainId}`), mainnetAddress: a.uniqueId as Address, uniqueId: `${a.uniqueId}_${chainId}`, diff --git a/src/core/state/favorites/index.ts b/src/core/state/favorites/index.ts index 07dd31c893..717c3ca229 100644 --- a/src/core/state/favorites/index.ts +++ b/src/core/state/favorites/index.ts @@ -8,7 +8,9 @@ import { DAI_POLYGON_ADDRESS, ETH_ADDRESS, ETH_ARBITRUM_ADDRESS, + ETH_BASE_ADDRESS, ETH_OPTIMISM_ADDRESS, + ETH_ZORA_ADDRESS, MATIC_POLYGON_ADDRESS, OP_ADDRESS, SOCKS_ADDRESS, @@ -74,6 +76,8 @@ export const favoritesStore = createStore( USDC_OPTIMISM_ADDRESS, WBTC_OPTIMISM_ADDRESS, ], + [ChainId.base]: [ETH_BASE_ADDRESS], + [ChainId.zora]: [ETH_ZORA_ADDRESS], }, addFavorite: ({ address, chainId }: UpdateFavoritesArgs) => { const { favorites } = get(); diff --git a/src/core/types/assets.ts b/src/core/types/assets.ts index 59896d04ee..fc3097f9f2 100644 --- a/src/core/types/assets.ts +++ b/src/core/types/assets.ts @@ -69,6 +69,8 @@ export enum AssetType { eth = 'eth', nft = 'nft', optimism = 'optimism', + base = 'base', + zora = 'zora', polygon = 'polygon', token = 'token', trash = 'trash', diff --git a/src/core/types/chains.ts b/src/core/types/chains.ts index 22036a2592..678f3f9274 100644 --- a/src/core/types/chains.ts +++ b/src/core/types/chains.ts @@ -21,29 +21,35 @@ export const hardhat: Chain = { export enum ChainName { arbitrum = 'arbitrum', + base = 'base', bsc = 'bsc', goerli = 'goerli', optimism = 'optimism', polygon = 'polygon', + zora = 'zora', mainnet = 'mainnet', hardhat = 'hardhat', } export enum ChainId { arbitrum = chain.arbitrum.id, + base = chain.base.id, bsc = chain.bsc.id, goerli = chain.goerli.id, optimism = chain.optimism.id, mainnet = chain.mainnet.id, polygon = chain.polygon.id, + zora = chain.zora.id, hardhat = HARDHAT_CHAIN_ID, } export const ChainNameDisplay = { [ChainId.arbitrum]: 'Arbitrum', + [ChainId.base]: 'Base', [ChainId.bsc]: 'BSC', [ChainId.optimism]: 'Optimism', [ChainId.polygon]: 'Polygon', + [ChainId.zora]: 'Zora', [ChainId.mainnet]: 'Ethereum', [ChainId.hardhat]: 'Hardhat', }; diff --git a/src/core/utils/chains.ts b/src/core/utils/chains.ts index 2ab419a875..432c3574e4 100644 --- a/src/core/utils/chains.ts +++ b/src/core/utils/chains.ts @@ -1,4 +1,12 @@ -import { arbitrum, bsc, mainnet, optimism, polygon } from '@wagmi/chains'; +import { + arbitrum, + base, + bsc, + mainnet, + optimism, + polygon, + zora, +} from '@wagmi/chains'; import type { Address, Chain } from 'wagmi'; import { ETH_ADDRESS, NATIVE_ASSETS_PER_CHAIN } from '~/core/references'; @@ -11,6 +19,8 @@ export const SUPPORTED_CHAINS: Chain[] = [ polygon, optimism, arbitrum, + base, + zora, bsc, ].map((chain) => ({ ...chain, name: ChainNameDisplay[chain.id] })); @@ -24,13 +34,17 @@ export const SUPPORTED_CHAIN_IDS = SUPPORTED_CHAINS.map(({ id }) => id); export const isL2Chain = (chain: ChainName | ChainId): boolean => { switch (chain) { case ChainName.arbitrum: + case ChainName.base: case ChainName.bsc: case ChainName.optimism: case ChainName.polygon: + case ChainName.zora: case ChainId.arbitrum: + case ChainId.base: case ChainId.bsc: case ChainId.optimism: case ChainId.polygon: + case ChainId.zora: return true; default: return false; @@ -57,6 +71,10 @@ export function chainNameFromChainId(chainId: ChainId) { export function getBlockExplorerHostForChain(chainId: ChainId) { if (chainId === ChainId.optimism) { return 'optimistic.etherscan.io'; + } else if (chainId === ChainId.base) { + return 'basescan.org'; + } else if (chainId === ChainId.zora) { + return 'explorer.zora.energy'; } else if (chainId === ChainId.polygon) { return 'polygonscan.com'; } else if (chainId === ChainId.bsc) { diff --git a/src/core/utils/connectedApps.ts b/src/core/utils/connectedApps.ts index 3837b18038..a9df263b0f 100644 --- a/src/core/utils/connectedApps.ts +++ b/src/core/utils/connectedApps.ts @@ -203,6 +203,12 @@ const displayDappNames: { 'zora.co': { name: 'Zora', }, + 'base.org': { + name: 'Base', + }, + 'zora.energy': { + name: 'Zora Energy', + }, }; export const getHardcodedDappInformation = (hostName: string) => diff --git a/src/core/utils/gas.ts b/src/core/utils/gas.ts index 31bc6a5c2b..a7b78244d6 100644 --- a/src/core/utils/gas.ts +++ b/src/core/utils/gas.ts @@ -352,6 +352,10 @@ export const getChainWaitTime = (chainId: ChainId) => { return { safeWait: 6, proposedWait: 3, fastWait: 3 }; case ChainId.optimism: return { safeWait: 20, proposedWait: 20, fastWait: 20 }; + case ChainId.base: + return { safeWait: 20, proposedWait: 20, fastWait: 20 }; + case ChainId.zora: + return { safeWait: 20, proposedWait: 20, fastWait: 20 }; case ChainId.arbitrum: return { safeWait: 8, proposedWait: 8, fastWait: 8 }; default: diff --git a/src/core/wagmi/createTestWagmiClient.ts b/src/core/wagmi/createTestWagmiClient.ts index 83275d565e..87dc1596e3 100644 --- a/src/core/wagmi/createTestWagmiClient.ts +++ b/src/core/wagmi/createTestWagmiClient.ts @@ -1,5 +1,13 @@ import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'; -import { arbitrum, bsc, mainnet, optimism, polygon } from '@wagmi/chains'; +import { + arbitrum, + base, + bsc, + mainnet, + optimism, + polygon, + zora, +} from '@wagmi/chains'; import { Chain, CreateClientConfig, @@ -19,7 +27,7 @@ const noopStorage = { }; const { chains, provider, webSocketProvider } = configureChains( - [mainnet, optimism, polygon, arbitrum, bsc] as Chain[], + [mainnet, optimism, polygon, arbitrum, base, zora, bsc] as Chain[], [ jsonRpcProvider({ rpc: () => { diff --git a/src/core/wagmi/createWagmiClient.ts b/src/core/wagmi/createWagmiClient.ts index ade239a1f7..22f64b22bd 100644 --- a/src/core/wagmi/createWagmiClient.ts +++ b/src/core/wagmi/createWagmiClient.ts @@ -37,6 +37,10 @@ const { chains, provider, webSocketProvider } = configureChains( return { http: process.env.ARBITRUM_MAINNET_RPC as string }; case ChainId.polygon: return { http: process.env.POLYGON_MAINNET_RPC as string }; + case ChainId.base: + return { http: process.env.BASE_MAINNET_RPC as string }; + case ChainId.zora: + return { http: process.env.ZORA_MAINNET_RPC as string }; case ChainId.bsc: return { http: process.env.BSC_MAINNET_RPC as string }; default: diff --git a/src/design-system/styles/designTokens.ts b/src/design-system/styles/designTokens.ts index ec948c098c..2842e4e4c6 100644 --- a/src/design-system/styles/designTokens.ts +++ b/src/design-system/styles/designTokens.ts @@ -483,6 +483,8 @@ export type ForegroundColor = | 'arbitrum' | 'optimism' | 'polygon' + | 'base' + | 'zora' | 'bsc'; export const foregroundColors: Record< @@ -563,6 +565,14 @@ export const foregroundColors: Record< light: '#8247E5', dark: '#BE97FF', }, + base: { + light: '#0052FF', + dark: '#3979FF', + }, + zora: { + light: '#2B5DF0', + dark: '#6183F0', + }, bsc: { light: '#EBAF09', dark: '#EBAF09', @@ -616,6 +626,8 @@ export const textColors = selectForegroundColors( 'arbitrum', 'optimism', 'polygon', + 'base', + 'zora', 'bsc', ...genericColors, ); diff --git a/src/entries/iframe/notification.tsx b/src/entries/iframe/notification.tsx index ec50f3f656..b98eb53bc7 100644 --- a/src/entries/iframe/notification.tsx +++ b/src/entries/iframe/notification.tsx @@ -24,6 +24,8 @@ const ASSET_SOURCE = { [ChainId.optimism]: 'assets/badges/optimismBadge.png', [ChainId.arbitrum]: 'assets/badges/arbitrumBadge.png', [ChainId.polygon]: 'assets/badges/polygonBadge.png', + [ChainId.base]: 'assets/badges/baseBadge.png', + [ChainId.zora]: 'assets/badges/zoraBadge.png', [ChainId.bsc]: 'assets/badges/bscBadge.png', }; diff --git a/src/entries/popup/components/ChainBadge/ChainBadge.tsx b/src/entries/popup/components/ChainBadge/ChainBadge.tsx index 0e5c74d8dc..403d7d189b 100644 --- a/src/entries/popup/components/ChainBadge/ChainBadge.tsx +++ b/src/entries/popup/components/ChainBadge/ChainBadge.tsx @@ -1,9 +1,11 @@ -import ArbitrumBadge from 'static/assets/badges/arbitrumBadge.png'; -import BscBadge from 'static/assets/badges/bscBadge.png'; -import EthereumBadge from 'static/assets/badges/ethereumBadge.png'; -import HardhatBadge from 'static/assets/badges/hardhatBadge.png'; -import OptimismBadge from 'static/assets/badges/optimismBadge.png'; -import PolygonBadge from 'static/assets/badges/polygonBadge.png'; +import ArbitrumBadge from 'static/assets/badges/arbitrumBadge@3x.png'; +import BaseBadge from 'static/assets/badges/baseBadge@3x.png'; +import BscBadge from 'static/assets/badges/bscBadge@3x.png'; +import EthereumBadge from 'static/assets/badges/ethereumBadge@3x.png'; +import HardhatBadge from 'static/assets/badges/hardhatBadge@3x.png'; +import OptimismBadge from 'static/assets/badges/optimismBadge@3x.png'; +import PolygonBadge from 'static/assets/badges/polygonBadge@3x.png'; +import ZoraBadge from 'static/assets/badges/zoraBadge@3x.png'; import { ChainId } from '~/core/types/chains'; import { Box } from '~/design-system'; @@ -27,6 +29,8 @@ const networkBadges = { [ChainId.polygon]: PolygonBadge, [ChainId.optimism]: OptimismBadge, [ChainId.arbitrum]: ArbitrumBadge, + [ChainId.base]: BaseBadge, + [ChainId.zora]: ZoraBadge, [ChainId.bsc]: BscBadge, [ChainId.hardhat]: HardhatBadge, }; diff --git a/src/entries/popup/hooks/approveAppRequest/useApproveAppRequestValidations.ts b/src/entries/popup/hooks/approveAppRequest/useApproveAppRequestValidations.ts index cbd4290790..3ccde59c94 100644 --- a/src/entries/popup/hooks/approveAppRequest/useApproveAppRequestValidations.ts +++ b/src/entries/popup/hooks/approveAppRequest/useApproveAppRequestValidations.ts @@ -1,4 +1,12 @@ -import { arbitrum, bsc, mainnet, optimism, polygon } from '@wagmi/chains'; +import { + arbitrum, + base, + bsc, + mainnet, + optimism, + polygon, + zora, +} from '@wagmi/chains'; import { useMemo } from 'react'; import { i18n } from '~/core/languages'; @@ -14,6 +22,8 @@ import { useUserAsset } from '../useUserAsset'; const DEFAULT_NATIVE_ASSET_SYMBOL = { [ChainId.mainnet]: mainnet.nativeCurrency?.symbol, [ChainId.optimism]: optimism.nativeCurrency?.symbol, + [ChainId.base]: base.nativeCurrency?.symbol, + [ChainId.zora]: zora.nativeCurrency?.symbol, [ChainId.arbitrum]: arbitrum.nativeCurrency?.symbol, [ChainId.polygon]: polygon.nativeCurrency?.symbol, [ChainId.bsc]: bsc.nativeCurrency?.symbol, diff --git a/src/entries/popup/hooks/swap/useSwapSettings.ts b/src/entries/popup/hooks/swap/useSwapSettings.ts index 0905c77f31..5b9a92c787 100644 --- a/src/entries/popup/hooks/swap/useSwapSettings.ts +++ b/src/entries/popup/hooks/swap/useSwapSettings.ts @@ -13,6 +13,8 @@ export const DEFAULT_SLIPPAGE_BIPS = { [ChainId.polygon]: 200, [ChainId.bsc]: 200, [ChainId.optimism]: 200, + [ChainId.base]: 200, + [ChainId.zora]: 200, [ChainId.arbitrum]: 200, }; @@ -21,6 +23,8 @@ export const DEFAULT_SLIPPAGE = { [ChainId.polygon]: '2', [ChainId.bsc]: '2', [ChainId.optimism]: '2', + [ChainId.base]: '2', + [ChainId.zora]: '2', [ChainId.arbitrum]: '2', }; @@ -33,6 +37,8 @@ export const getDefaultSlippage = (chainId: ChainId) => { | ChainName.optimism | ChainName.polygon | ChainName.arbitrum + | ChainName.base + | ChainName.zora | ChainName.bsc; return slippageInBipsToString( config.default_slippage_bips[chainName] || DEFAULT_SLIPPAGE_BIPS[chainId], diff --git a/src/entries/popup/hooks/useFavoriteAssets.ts b/src/entries/popup/hooks/useFavoriteAssets.ts index b20e1d6f9b..1d6a5308e7 100644 --- a/src/entries/popup/hooks/useFavoriteAssets.ts +++ b/src/entries/popup/hooks/useFavoriteAssets.ts @@ -14,6 +14,8 @@ const FAVORITES_EMPTY_STATE = { [ChainId.bsc]: [], [ChainId.polygon]: [], [ChainId.arbitrum]: [], + [ChainId.base]: [], + [ChainId.zora]: [], [ChainId.hardhat]: [], }; diff --git a/src/entries/popup/hooks/useNativeAssetForNetwork.ts b/src/entries/popup/hooks/useNativeAssetForNetwork.ts index 8450e39ef5..916465e29f 100644 --- a/src/entries/popup/hooks/useNativeAssetForNetwork.ts +++ b/src/entries/popup/hooks/useNativeAssetForNetwork.ts @@ -22,6 +22,10 @@ const getNetworkNativeMainnetAssetAddress = ({ case ChainId.mainnet: case ChainId.optimism: return ETH_ADDRESS as Address; + case ChainId.base: + return ETH_ADDRESS as Address; + case ChainId.zora: + return ETH_ADDRESS as Address; case ChainId.bsc: return BNB_MAINNET_ADDRESS; case ChainId.polygon: diff --git a/src/entries/popup/hooks/useSearchCurrencyLists.ts b/src/entries/popup/hooks/useSearchCurrencyLists.ts index c6edb6cf1b..24dde96910 100644 --- a/src/entries/popup/hooks/useSearchCurrencyLists.ts +++ b/src/entries/popup/hooks/useSearchCurrencyLists.ts @@ -133,6 +133,20 @@ export function useSearchCurrencyLists({ fromChainId, }); + const { data: baseVerifiedAssets, isLoading: baseVerifiedAssetsLoading } = + useTokenSearch({ + chainId: ChainId.base, + ...VERIFIED_ASSETS_PAYLOAD, + fromChainId, + }); + + const { data: zoraVerifiedAssets, isLoading: zoraVerifiedAssetsLoading } = + useTokenSearch({ + chainId: ChainId.zora, + ...VERIFIED_ASSETS_PAYLOAD, + fromChainId, + }); + // current search const { data: targetVerifiedAssets, isLoading: targetVerifiedAssetsLoading } = useTokenSearch({ @@ -202,6 +216,14 @@ export function useSearchCurrencyLists({ assets: arbitrumVerifiedAssets, loading: arbitrumVerifiedAssetsLoading, }, + [ChainId.base]: { + assets: baseVerifiedAssets, + loading: baseVerifiedAssetsLoading, + }, + [ChainId.zora]: { + assets: zoraVerifiedAssets, + loading: zoraVerifiedAssetsLoading, + }, }), [ mainnetVerifiedAssets, @@ -214,6 +236,10 @@ export function useSearchCurrencyLists({ polygonVerifiedAssetsLoading, arbitrumVerifiedAssets, arbitrumVerifiedAssetsLoading, + baseVerifiedAssets, + baseVerifiedAssetsLoading, + zoraVerifiedAssets, + zoraVerifiedAssetsLoading, ], ); @@ -266,6 +292,8 @@ export function useSearchCurrencyLists({ [ChainId.bsc]: getCuratedAssets(ChainId.bsc), [ChainId.polygon]: getCuratedAssets(ChainId.polygon), [ChainId.arbitrum]: getCuratedAssets(ChainId.arbitrum), + [ChainId.base]: getCuratedAssets(ChainId.base), + [ChainId.zora]: getCuratedAssets(ChainId.zora), }), [getCuratedAssets], ); diff --git a/src/entries/popup/hooks/useSwappableAssets.ts b/src/entries/popup/hooks/useSwappableAssets.ts index ff71b46f4c..8ec0a3f1ce 100644 --- a/src/entries/popup/hooks/useSwappableAssets.ts +++ b/src/entries/popup/hooks/useSwappableAssets.ts @@ -45,6 +45,24 @@ export function useSwappableAssets(toChainId?: ChainId) { toChainId, }); + const { + data: swappableBaseAddresses, + isLoading: swappableBaseAddressesAreLoading, + } = useSwappableAddresses({ + addresses: assetAddressMap[ChainId.base], + fromChainId: ChainId.base, + toChainId, + }); + + const { + data: swappableZoraAddresses, + isLoading: swappableZoraAddressesAreLoading, + } = useSwappableAddresses({ + addresses: assetAddressMap[ChainId.zora], + fromChainId: ChainId.zora, + toChainId, + }); + const { data: swappableBscAddresses, isLoading: swappableBscAddressesAreLoading, @@ -94,6 +112,14 @@ export function useSwappableAssets(toChainId?: ChainId) { addresses: swappableArbitrumAddresses, loading: swappableArbitrumAddressesAreLoading, }, + [ChainId.base]: { + addresses: swappableBaseAddresses, + loading: swappableBaseAddressesAreLoading, + }, + [ChainId.zora]: { + addresses: swappableZoraAddresses, + loading: swappableZoraAddressesAreLoading, + }, }), [ swappableArbitrumAddresses, @@ -106,6 +132,10 @@ export function useSwappableAssets(toChainId?: ChainId) { swappableOptimismAddressesAreLoading, swappablePolygonAddresses, swappablePolygonAddressesAreLoading, + swappableBaseAddresses, + swappableBaseAddressesAreLoading, + swappableZoraAddresses, + swappableZoraAddressesAreLoading, ], ); diff --git a/src/entries/popup/pages/swap/SwapTokenInput/TokenDropdown/TokenToBuySection.tsx b/src/entries/popup/pages/swap/SwapTokenInput/TokenDropdown/TokenToBuySection.tsx index 8dc30eaab5..2f9e24dcd5 100644 --- a/src/entries/popup/pages/swap/SwapTokenInput/TokenDropdown/TokenToBuySection.tsx +++ b/src/entries/popup/pages/swap/SwapTokenInput/TokenDropdown/TokenToBuySection.tsx @@ -75,6 +75,8 @@ const bridgeSectionsColorsByChain = { [ChainId.arbitrum]: 'arbitrum' as TextStyles['color'], [ChainId.optimism]: 'optimism' as TextStyles['color'], [ChainId.polygon]: 'polygon' as TextStyles['color'], + [ChainId.base]: 'base' as TextStyles['color'], + [ChainId.zora]: 'zora' as TextStyles['color'], [ChainId.bsc]: 'bsc' as TextStyles['color'], }; diff --git a/static/allowlist.json b/static/allowlist.json index 6245d9324b..c6811fb4f5 100644 --- a/static/allowlist.json +++ b/static/allowlist.json @@ -22,6 +22,8 @@ "https://fcmregistrations.googleapis.com/v1/projects/rainbow-me/", "https://rainbow-me.firebaseapp.com", "https://icons.duckduckgo.com", - "https://*.live.ledger.com" + "https://*.live.ledger.com", + "https://rpc.zora.co", + "https://falling-wandering-film.base-mainnet.quiknode.pro" ] } \ No newline at end of file diff --git a/static/assets/badges/arbitrumBadge.png b/static/assets/badges/arbitrumBadge.png index 45a6b51793cee1a1ad8d6ab60a63d2eb99b1ebba..eb0daf16fd4e518256697a734e38314b6a74ffdf 100644 GIT binary patch literal 1025 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 diff --git a/static/assets/badges/arbitrumBadge@2x.png b/static/assets/badges/arbitrumBadge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..92d28d7e66be202cf3c7a1b817c2e4dc528286a7 GIT binary patch literal 2260 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 M07*qoM6N<$f_z5P(EtDd literal 0 HcmV?d00001 diff --git a/static/assets/badges/baseBadge.png b/static/assets/badges/baseBadge.png new file mode 100644 index 0000000000000000000000000000000000000000..76bc8d80a23583a5e90bc14eb969647e1bb80368 GIT binary patch literal 505 zcmV9?ie@dly#_13hv)DpH8_#7fqCY0qx#$g3En6ku~G{o;d)5Cv8G)9sdR|Zczb? zD^qV_-wsGVGlx{q&3<8jG&bf6&ds)^LrLnqwb4}v&M4&$BpyUerNtbvE?gSk?ibXZ z@DQ73PtXL*ozUu=G02rYMf_%j*qSYt>fyzbq1D>jFg_1#iG0q`TA1NwG7pQutyra9 v%>9kz!SnZnI+5;L!Ge3i1Oj)uuO<8f!~w0n$p!8600000NkvXXu0mjfmUGr~ literal 0 HcmV?d00001 diff --git a/static/assets/badges/baseBadge@2x.png b/static/assets/badges/baseBadge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..255f820d76ebc747b3342033faaf690cfaa1aedb GIT binary patch literal 874 zcmV-w1C{)VP)0$ctxzgFk3OVFLl`B&kI|#)RZPU40t+ zi0kn1R{6*Qm05EuXp{DKL?X`{JbLC0KB!?f^)x&V>X_ny?i>_@PrrT|F*~7VP=iK~ z?sicwT>8L1Mrwl0gqjp5Yd9iPZ=xFb6kiP~zLZEt;}|I}s^0@P?*JPMT9XUl>>TjE z11CPNL`ucTu$#Wx$kc8CI}gc+56pey+kR5O90J4R1SN$NToS1T_bn6J3ie@%8Mes5 zb7FcMxxmC4J#)3dr9khl65?fza5b%<_XOB`ibCkp%#>{4ATz^|T)yduLr%mYBE%V30LM((u+ABA(BU!{wu5#fe*k9z zr;4`ZI_5z8q$Wyr=|PU2s$h*J+O##9>QP+Iu~UV0Qs<`%f@8>u%h{||qkdNqlH1nl z&xy;OTZxG*7i^XeKiXRn*Ay+c02Si&l}w7al+MdlxyC<+b#U1^FF`|a0<*4!lJM(7 z6i;+SXbBlghr$rwLG`$%p#HL=e2U89{SbsxoawM85tJvtQ5pDy#Z{~@(!^>cJv8`) z$}kvP2B>Y)RIT}8s}h4dE-x1?g69;gNM(9Bv+TKVih=86DNhtdqh}e2I2b~vSMuXJ z983LoC=K1$R;&B7er=u@H9C^!-eEbU*xK&cI^3V#EEoB$z$M9!^hA*&zx5&^l>`{z zNbSmmxD8sPo-Cn35Jr8HtpfLBvu8^o@f;=a8NGNdv!io9Egbq!SpH=`bnw*&v& z#9oHvnxRq5N$SerWPA-Rsg;&@d(KU4O7?Hr;5jelzMheO9AnxO&K?em!4Fq*)DYV6 zA0Al6VdASEH3v>q0?&{1%&{Jm_(nlH%6p{u7pq_YK=`PT2><{907*qoM6N<$f-KXG A4*&oF literal 0 HcmV?d00001 diff --git a/static/assets/badges/baseBadge@3x.png b/static/assets/badges/baseBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..25f4883bbd5dbf0355094743b089ae1a9c63c895 GIT binary patch literal 1296 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 KMNUMnLSTZ}zW12` diff --git a/static/assets/badges/bscBadge@2x.png b/static/assets/badges/bscBadge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..00fc7b80499e3b237f57bd702c1cf704dce128c3 GIT binary patch literal 1390 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 literal 0 HcmV?d00001 diff --git a/static/assets/badges/ethereumBadge@3x.png b/static/assets/badges/ethereumBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..73fa47f4100f33307710e7078befe77498820f33 GIT binary patch literal 3230 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 literal 0 HcmV?d00001 diff --git a/static/assets/badges/hardhatBadge@3x.png b/static/assets/badges/hardhatBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..905749b8f12dfb9916d6e46bdf760b02611f4740 GIT binary patch literal 3433 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 LNkvXXu0mjf<)dIU literal 0 HcmV?d00001 diff --git a/static/assets/badges/optimismBadge.png b/static/assets/badges/optimismBadge.png index 35485a987845b4d57ed01efba91b40c9eb216dbd..73922c9ee854a6e7a2fc88003ea2c9733d86134d 100644 GIT binary patch literal 628 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 literal 0 HcmV?d00001 diff --git a/static/assets/badges/optimismBadge@3x.png b/static/assets/badges/optimismBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b06525887d72fcf7234c27c24c7eb3545295dfd8 GIT binary patch literal 2116 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 m7%-Y}OcJNZHxhy5Qk(yvgB_-x=3jXL0000 literal 3563 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 diff --git a/static/assets/badges/polygonBadge@2x.png b/static/assets/badges/polygonBadge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..062b02a9de40f0fa5cc706048e2a9b749920b940 GIT binary patch literal 1869 zcmV-T2eSByP)1maKW1K~jD`$-ckY~TzH`1a zb4%bhOY?@Vpf~NW0)k}-P=OSR0I&$z4IqiIpD-YVDZo(=_}Xe3?+oA0{A9EPcdqZP zX2wuX@HjEovk^M<~lCzIaKCVbGC zP*l{K*fhWf>6Mtw&Y;{z^9I65XyuyEO2W4U#KDkErUNJj9qv$o7?030EM@1A-K-_@G)%DLDF!cryCUK5ErGByu3X-j$)|b=}pB$7T~el}724-w_}%vpfL# z#U42IT^t5(X0o^oos6I~oy;I#F~Q2WTS_|ltv;$gt!KJGul`HMF0*^3OJNNv9tm(#bl_tuDcq6v15x7Uhcj(2OfDLABrbw*oWc> zsRY8inyyxW(3{Ez_?k(ep*O#U0;yW^kvlZi9B#w zZ4peoF9)vwGYp4!L)wQd40dDd)_Qgf*x1zCV{JibM&7tU94es;QR}tnv}`mLp(RMF@8#sB4}vuAw-E zjY63JTt0lWH3~i9Vf|f%EPG*vk5WA=OA51MN$cc!M^TTY zpk$1~#A$w*&wxyt?ic-nnSFyW{vIF9UJ?+%Ufx^`7k*B_Z+l}9?a6@bW(yE0;tUm8 z2GF4pULIba2R&EQ(0e5)`U|gvW#MX;&5VLOr!)^ zVbSh1w0|09Orl63e7sYMR_&ww*vXJN5bFxMbSfo+bo#?X-9m55D;yuKU7+0U{Jq0 z;zOI*h!98$vnzp8!|$k^o6Oq&j!>hNO4P58Fy^K=DHy<3wyx|7W+-&97lKCLZ8Ku_ zxw*?U70w}^%8l*nhoZs|FKhRdgoiy)NjQ3Qr7n!PZ8c`>AvnItBruGHkQ*3RK)h^Z zpuCynY)Ugt+VN6$f!!rCIMiH9rEwB)jX2tr$xXR}(ZP;fwp4Xh6U2Iy_B&fbyOnE< z5+;P!yx(5h2_uwI|HEp_@~&zmSj$!{{v%>;kmipH$TUDmCu61cgZ9ZSFp4s2Kqj!N zt{@I$6*FGWoXJ@WG7v>Nun0rI&orIvoOLFLkhW~D$yWXcxFO_6ktNS200000NkvXX Hu0mjf0XJs7 literal 0 HcmV?d00001 diff --git a/static/assets/badges/polygonBadge@3x.png b/static/assets/badges/polygonBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5211305476e10a0394dd09e684722622de3ff148 GIT binary patch literal 3078 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 UdHsMGn*aa+07*qoM6N<$f~Y|2-T(jq literal 0 HcmV?d00001 diff --git a/static/assets/badges/zoraBadge.png b/static/assets/badges/zoraBadge.png new file mode 100644 index 0000000000000000000000000000000000000000..06e71fe16143897d28ca9b3470a066054198cba6 GIT binary patch literal 976 zcmV;>126oEP)K~#7FZB)yS z8$}d7RbBn`tH;bE6AZM3Mj(XHL}HQb{0I0Cl4Ujs&liwAjzR^DS(K1yup*o05|JV#w3F2pRHD8Z z9Y1vW=%(kH8iq|tE|o-`E0n1~mexq6#GHtqkkkLDDA>tgZwQ5ALXd29jB=mix5nUKKhr+Qeua)Hp z;}BIgr?_V*S38jB7KACm_#8!EAZ)i`2!WE)NmGSY5F%K{NR}3|bF(L8qR=IE&J!O} zJ_XEeG)50fyiX(!)k;FiIZP*jt_xIEja(I*NYnULo8A?-80&Ft8F8TW~kyR zn6OckHfi%NO4XtL9J*bCi;T1&Au@qHHjsrJ75VV=pEI$DG10gT_PUOnQVQqE6gAht zD22L8kg4k^q8^yh0@K!=K}30pM#)VXSn@ZCy?m_w7X+%`vi40)yV-9!BzcNV`lO%& zTcb=!ga~ySp^+i#ctLVe31ZT2^(TFwO(#EobF}U&6m|OGX;9xD^j-J5+k?J};mf~} zXG_2$C*7rV9qKwVZ)$)pz((aIU6|f~<hE=K)Kjd^se%Q~#aF-lF&n?^_RW~B(x3Znlf^0@=2eL{^-sTLlcEM33dGhb*t|fS zdTz_o&^3%l-~ayP?i+t2>+$hmd&pVyP;kxb*yeL0!+_BE#+Wf4=$zgE`iI{hT=sj7 y=oLa>$XN59&@`C39$E&Uban0IWHJq|+CKv=zm_ZJ-11cb0000#RIi-0q%d&KykiNU7==S$se`WqW&sS%? zaJqGCR5i)48Abi!kOsp6ezitxP-k5!TE`=MAd<<$6?OPt<9zA; z9ADq~)+vfTlhEYqkH$)!yXAWqC+RS!VpM|+2(4RM+vtPLP%wl#7qI9#JZ=N`tpRy_ zxC2Vy0N4cj{9(;uX#WP!Ujrx=g)uHI+YMr)wWV#$W>n4jakdiO*^zN@xzEq`0>%6pLUaVak+R>$xU zJH?gms2b{cYTXg|`0UPg({KLrx0_E9y8ML~H_5xPT<#-y85}zh;vc(sy6YU^$pIEu zF`5X93mx}qRJew(Z`N6$JKM^$Y-6Wi`^hh+D?(Q%<56n#R55|hMzo}GWcZc|L8VsX zA(~nc!9%D4N-#V?h#q1gHogZ@DIdWE%XprD|1c7-LB=)>wYCYQO1jEiq)Lr3(*%B^ zAf^{Gjleq`9W=nPYf_LgmW)GG145JE~6b1{Uh(jmfIf<(C}1yxy6Q$p1$#j_K- zy!HFB5Xww4%COTsP2r0*LRBJPuqVK`*e{?g2vzH3vXmOM4+Yn*OeJyQs`9R*7JaSG zFcaZfhW#q$kp&SObEX2JYOxU1CC)8U)K|Otx}m4_oM3t`;ni*D?ig7}XPm zxWp}!s!^d3mPs^B=8(ba;ADLm2$k0EW+2n!kTGya)1W|24+?=yQ;-JDiqxqr43k;Jmh@g5D6)e=}Op3y(?)VgcgnaPk~uS2w|kC zA%9zOBBL%$E<}`ceuLnKWVL<-i^zmf2RmqUIdZO|6{GgSx~5HW(Ns6ciN{uC#}tpM-IyE1!YtsonJ{Id+8tSnw-J8$;_`_WxR8@9|M~NQD4DuB7 zF_IMhs^#Rf55fqdLYI*#x#QLXnH^W;5Y;mv2X!^V&O@9KLedK(>3=G;ozRJ(R22$_ za}=8vQg(l5+c zS>4_|tmryIH{$S(`Z*1Id7OCA5Jf3;ejoZAEnS?A6COpnhy}pam>dbQk28yvo=9CC zly&jm24U+KJ4+rbh3@TE)kVC|Sm&m!3(wJgcnUi>m#@}bEf^QjmbvMQI!tcWfGcS? zOOh%YD_P6|fRfNa6@*7r;Y8-#X?Ewh=k0s<@9#dQkf@ZjH=Q%rcFSrUa>mmJI{7-l zswEn)KXBU;)nTESEC_Yjt32{Yt-Ok>@{vMH6lz0gSLz0pkP7e3{{7$ilEYK8=9fP6 z0u=IhIJwu+n?`*Q0x&Ouh!re^6xsx=p@q+MDvM4Y!X=3FxPL6~IBd0$GN@9m{O!N~ z>!Y`hu5X?s^wGn`{L-km=bXP{c`}qS6GJ&CJ4};XOp4aP^AnR!5lX{TkSw$ap<0D( zU!d@_#?J=IqzZo%NH`tL9Ch=J`Tc|4XAg%VSj3M=a*! z%@eQHYRrpsxR^{p7+ID|>G(K*z(=ULtp;vg-tl_w&GW8 z;vFkdh)0%8@=8lMllVrv8czV^-;U|@JHPtyAG6ceIWwUZu}_1TrZ*9fDQ+K$M=2#_ zm?RV8pFwH|HgR_?qno#9^WC#P|G5br{k$|DO;nqV5`@#m7qTw3vy?{j+5GGzj($D? XT74=8ZfgB%00000NkvXXu0mjftV)S+ literal 0 HcmV?d00001 diff --git a/static/assets/badges/zoraBadge@3x.png b/static/assets/badges/zoraBadge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..53de9f4239bdc68da70095b519cb0525a04979e9 GIT binary patch literal 4207 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 FV1l9M42b{$ literal 0 HcmV?d00001