From 2c62f917dc24a35e6fc8878e0d7848491fe78e7b Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 24 Dec 2021 03:02:04 +0000 Subject: [PATCH 01/47] feat(optimism): integrate optimism into Mask ecosystem #4868 --- .vscode/schema/constants.json | 5 +- cspell.json | 1 + .../Labs/components/SwapSettingDialog.tsx | 9 + packages/dashboard/src/pages/Settings/api.ts | 5 + .../background-script/SettingsService.ts | 5 + .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 14 +- packages/maskbook/src/plugins/ITO/base.ts | 1 + .../maskbook/src/plugins/RedPacket/base.ts | 9 +- .../src/plugins/Trader/apis/trader/index.ts | 2 + .../plugins/Trader/apis/trending/hotfix.ts | 2 + .../src/plugins/Trader/constants/0x.ts | 1 + .../src/plugins/Trader/constants/dodo.ts | 1 + .../src/plugins/Trader/constants/trader.ts | 3 + packages/maskbook/src/plugins/Trader/pipes.ts | 2 + .../maskbook/src/plugins/Trader/services.ts | 9 + .../maskbook/src/plugins/Trader/settings.ts | 6 + .../src/plugins/Trader/trader/0x/useTrade.ts | 2 + .../trending/useCurrentTradeProvider.ts | 4 + .../src/plugins/Wallet/apis/debank.ts | 1 + .../src/plugins/Wallet/pipes/index.ts | 3 + .../src/plugins/Wallet/services/account.ts | 1 + .../src/plugins/Wallet/services/assets.ts | 2 +- packages/maskbook/src/settings/listener.ts | 2 + packages/maskbook/src/utils/flags.ts | 1 + packages/maskbook/src/utils/native-rpc/Web.ts | 4 + packages/public-api/src/web.ts | 1 + .../src/UI/components/NetworkIcon/index.tsx | 1 + .../wallet-network-icon/optimistic.png | Bin 0 -> 6983 bytes packages/web3-constants/compile-constants.ts | 3 + packages/web3-constants/evm/airdrop.json | 5 +- packages/web3-constants/evm/chain.json | 10 +- packages/web3-constants/evm/dhedge.json | 10 +- packages/web3-constants/evm/ethereum.json | 29 ++- packages/web3-constants/evm/gitcoin.json | 20 +- .../web3-constants/evm/good-ghosting.json | 10 +- packages/web3-constants/evm/ito.json | 35 ++- packages/web3-constants/evm/lbp.json | 5 +- packages/web3-constants/evm/mask-box.json | 25 ++- .../web3-constants/evm/nft-red-packet.json | 10 +- packages/web3-constants/evm/opensea-api.json | 15 +- packages/web3-constants/evm/pooltogether.json | 10 +- packages/web3-constants/evm/red-packet.json | 25 ++- packages/web3-constants/evm/rpc.json | 10 +- .../evm/space-station-galaxy.json | 10 +- .../evm/token-asset-base-url.json | 5 +- packages/web3-constants/evm/token.json | 205 ++++++++++++++---- packages/web3-constants/evm/trader.json | 159 +++++++++++--- packages/web3-constants/evm/trending.json | 15 +- packages/web3-shared/evm/assets/chains.json | 26 +++ packages/web3-shared/evm/pipes/index.ts | 5 + packages/web3-shared/evm/types/index.ts | 6 + .../web3-shared/evm/utils/chainDetailed.ts | 2 + pnpm-lock.yaml | 74 ++----- 53 files changed, 648 insertions(+), 178 deletions(-) create mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png diff --git a/.vscode/schema/constants.json b/.vscode/schema/constants.json index 4bff76476e14..8973b2547c04 100644 --- a/.vscode/schema/constants.json +++ b/.vscode/schema/constants.json @@ -30,7 +30,10 @@ "Matic", "Mumbai", "Arbitrum", - "Arbitrum_Rinkeby" + "Arbitrum_Rinkeby", + "Optimistic", + "Optimistic_Kovan", + "Optimistic_Goerli" ] }, "primitive": { diff --git a/cspell.json b/cspell.json index 79225a9b37b1..b88cfbf34f51 100644 --- a/cspell.json +++ b/cspell.json @@ -47,6 +47,7 @@ "ampl", "anchorme", "arbitrum", + "optimistic", "arweave", "bgcolor", "bignumber", diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 62099f1d293a..2c7fe1027bb5 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -9,6 +9,7 @@ import { usePolygonNetworkTradeProvider, useArbitrumNetworkTradeProvider, useXDaiNetworkTradeProvider, + useOptimisticNetworkTradeProvider, } from '../../Settings/api' import SettingItem from './SettingItem' @@ -45,6 +46,8 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) const arbitrumOptions = [{ label: 'UniSwap V3', value: TradeProvider.UNISWAP_V3 }] + const optimisticOptions = [{ label: 'UniSwap V3', value: TradeProvider.UNISWAP_V3 }] + const xDaiOptions = [{ label: 'SushiSwap', value: TradeProvider.SUSHISWAP }] const t = useDashboardI18N() @@ -80,6 +83,12 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) options: xDaiOptions, onChange: (value: any) => Services.Settings.setxDaiNetworkTradeProvider(+value), }, + { + legend: t.labs_settings_swap_network({ network: 'Optimism' }), + value: useOptimisticNetworkTradeProvider(), + options: optimisticOptions, + onChange: (value: any) => Services.Settings.setOptimisticNetworkTradeProvider(+value), + }, ] return ( diff --git a/packages/dashboard/src/pages/Settings/api.ts b/packages/dashboard/src/pages/Settings/api.ts index ccc70b2202cb..fa11d3c2fb04 100644 --- a/packages/dashboard/src/pages/Settings/api.ts +++ b/packages/dashboard/src/pages/Settings/api.ts @@ -34,6 +34,11 @@ export const [useXDaiNetworkTradeProvider] = createGlobalState( Messages.events.xdaiNetworkTradeProviderSettings.on, ) +export const [useOptimistcNetworkTradeProvider] = createGlobalState( + Services.Settings.getOptimisticNetworkTradeProvider, + Messages.events.optimisticNetworkTradeProviderSettings.on, +) + const BASE_RUL = 'https://vaalh28dbi.execute-api.ap-east-1.amazonaws.com/api' interface BackupBaseRequest { diff --git a/packages/maskbook/src/extension/background-script/SettingsService.ts b/packages/maskbook/src/extension/background-script/SettingsService.ts index 8fa6888fba50..da6647ebc17d 100644 --- a/packages/maskbook/src/extension/background-script/SettingsService.ts +++ b/packages/maskbook/src/extension/background-script/SettingsService.ts @@ -14,6 +14,7 @@ import { polygonNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, + optimismNetworkTradeProviderSettings, } from '../../plugins/Trader/settings' import { queryMyPersonas } from './IdentityService' import { @@ -70,6 +71,10 @@ export const [getArbitrumNetworkTradeProvider, setArbitrumNetworkTradeProvider] ) export const [getxDaiNetworkTradeProvider, setxDaiNetworkTradeProvider] = create(xdaiNetworkTradeProviderSettings) +export const [getOptimismNetworkTradeProvider, setOptimismNetworkTradeProvider] = create( + optimismNetworkTradeProviderSettings, +) + export const [getCurrentSelectedWalletProvider, setCurrentSelectedWalletProvider] = create(currentProviderSettings) export const [getCurrentSelectedWalletNetwork, setCurrentSelectedWalletNetwork] = create(currentNetworkSettings) diff --git a/packages/maskbook/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/maskbook/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 8c74396be10b..25668509ecc3 100644 --- a/packages/maskbook/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/maskbook/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -224,7 +224,9 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { } = useSpaceStationCampaignInfo(account, Flags.nft_airdrop_enabled) const [chainId, setChainId] = useState( - [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Arbitrum, ChainId.xDai].includes(currentChainId) + [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Arbitrum, ChainId.xDai, ChainId.Optimistic].includes( + currentChainId, + ) ? currentChainId : ChainId.Mainnet, ) @@ -352,8 +354,16 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { createTabItem('Polygon/Matic', ChainId.Matic), createTabItem('Arbitrum', ChainId.Arbitrum), createTabItem('xDai', ChainId.xDai), + createTabItem('Optimistic', ChainId.Optimistic), ], - index: [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Arbitrum, ChainId.xDai].indexOf(chainId), + index: [ + ChainId.Mainnet, + ChainId.BSC, + ChainId.Matic, + ChainId.Arbitrum, + ChainId.xDai, + ChainId.Optimistic, + ].indexOf(chainId), classes, hasOnlyOneChild: true, } diff --git a/packages/maskbook/src/plugins/ITO/base.ts b/packages/maskbook/src/plugins/ITO/base.ts index bce8360ab138..bbe783eb4a9e 100644 --- a/packages/maskbook/src/plugins/ITO/base.ts +++ b/packages/maskbook/src/plugins/ITO/base.ts @@ -22,6 +22,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Mumbai, ChainId.Arbitrum, ChainId.xDai, + ChainId.Optimistic, ], }, }, diff --git a/packages/maskbook/src/plugins/RedPacket/base.ts b/packages/maskbook/src/plugins/RedPacket/base.ts index be212cf0834d..eddc6749a25f 100644 --- a/packages/maskbook/src/plugins/RedPacket/base.ts +++ b/packages/maskbook/src/plugins/RedPacket/base.ts @@ -16,7 +16,14 @@ export const base: Plugin.Shared.Definition = { networks: { type: 'opt-out', networks: {} }, target: 'stable', web3: { - operatingSupportedChains: [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Arbitrum, ChainId.xDai], + operatingSupportedChains: [ + ChainId.Mainnet, + ChainId.BSC, + ChainId.Matic, + ChainId.Arbitrum, + ChainId.xDai, + ChainId.Optimistic, + ], }, }, } diff --git a/packages/maskbook/src/plugins/Trader/apis/trader/index.ts b/packages/maskbook/src/plugins/Trader/apis/trader/index.ts index b9ba608d5120..2818bebfea93 100644 --- a/packages/maskbook/src/plugins/Trader/apis/trader/index.ts +++ b/packages/maskbook/src/plugins/Trader/apis/trader/index.ts @@ -25,6 +25,8 @@ export async function getAvailableTraderProviders(chainId: ChainId) { return [TradeProvider.UNISWAP_V3] case NetworkType.xDai: return [TradeProvider.SUSHISWAP] + case NetworkType.Optimistic: + return [TradeProvider.UNISWAP_V3] default: safeUnreachable(networkType) return [] diff --git a/packages/maskbook/src/plugins/Trader/apis/trending/hotfix.ts b/packages/maskbook/src/plugins/Trader/apis/trending/hotfix.ts index b66a813fad81..04de1269490c 100644 --- a/packages/maskbook/src/plugins/Trader/apis/trending/hotfix.ts +++ b/packages/maskbook/src/plugins/Trader/apis/trending/hotfix.ts @@ -95,6 +95,7 @@ const ID_NETWORK_MAP: Record> = { 'polygon-pos': NetworkType.Polygon, 'arbitrum-one': NetworkType.Arbitrum, xdai: NetworkType.xDai, + optimistic: NetworkType.Optimistic, }, [DataProvider.COIN_MARKET_CAP]: { '1027': NetworkType.Ethereum, @@ -102,6 +103,7 @@ const ID_NETWORK_MAP: Record> = { '3890': NetworkType.Polygon, '11841': NetworkType.Arbitrum, '5601': NetworkType.xDai, + '10': NetworkType.Optimistic, }, [DataProvider.UNISWAP_INFO]: {}, } diff --git a/packages/maskbook/src/plugins/Trader/constants/0x.ts b/packages/maskbook/src/plugins/Trader/constants/0x.ts index db334f246cfd..d0c78bc2a542 100644 --- a/packages/maskbook/src/plugins/Trader/constants/0x.ts +++ b/packages/maskbook/src/plugins/Trader/constants/0x.ts @@ -6,6 +6,7 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Polygon]: 'https://polygon.api.0x.org/', [NetworkType.Arbitrum]: 'https://arbitrum.api.0x.org/', [NetworkType.xDai]: 'https://xdai.api.0x.org/', + [NetworkType.Optimistic]: 'https://optimistic.api.0x.org/', } export const ZRX_AFFILIATE_ADDRESS = '0x934B510D4C9103E6a87AEf13b816fb080286D649' diff --git a/packages/maskbook/src/plugins/Trader/constants/dodo.ts b/packages/maskbook/src/plugins/Trader/constants/dodo.ts index d351190412fd..36015c89b025 100644 --- a/packages/maskbook/src/plugins/Trader/constants/dodo.ts +++ b/packages/maskbook/src/plugins/Trader/constants/dodo.ts @@ -8,4 +8,5 @@ export const networkNames: Record = { [NetworkType.Polygon]: 'matic', [NetworkType.Arbitrum]: 'arbitrum', [NetworkType.xDai]: 'xdai', + [NetworkType.Optimistic]: 'optimistic', } diff --git a/packages/maskbook/src/plugins/Trader/constants/trader.ts b/packages/maskbook/src/plugins/Trader/constants/trader.ts index 90933745a6c0..a41ee675bad3 100644 --- a/packages/maskbook/src/plugins/Trader/constants/trader.ts +++ b/packages/maskbook/src/plugins/Trader/constants/trader.ts @@ -60,6 +60,9 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Arbitrum]: [WNATIVE[ChainId.Arbitrum]], [ChainId.Arbitrum_Rinkeby]: [WNATIVE[ChainId.Arbitrum_Rinkeby]], [ChainId.xDai]: [WNATIVE[ChainId.xDai]], + [ChainId.Optimistic]: [WNATIVE[ChainId.Optimistic]], + [ChainId.Optimistic_Kovan]: [WNATIVE[ChainId.Optimistic_Kovan]], + [ChainId.Optimistic_Goerli]: [WNATIVE[ChainId.Optimistic_Goerli]], } export const BIPS_BASE = new BigNumber(10000) diff --git a/packages/maskbook/src/plugins/Trader/pipes.ts b/packages/maskbook/src/plugins/Trader/pipes.ts index 432b56a9b5b8..2aad7514b782 100644 --- a/packages/maskbook/src/plugins/Trader/pipes.ts +++ b/packages/maskbook/src/plugins/Trader/pipes.ts @@ -134,6 +134,8 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri return `https://analytics-aribtrum.sushi.com/pairs/${address}` case NetworkType.xDai: return `https://analytics-xdai.sushi.com/pairs/${address}` + case NetworkType.Optimistic: + return `` default: safeUnreachable(networkType) return '' diff --git a/packages/maskbook/src/plugins/Trader/services.ts b/packages/maskbook/src/plugins/Trader/services.ts index 9039ed24bf41..20c12dd50ef7 100644 --- a/packages/maskbook/src/plugins/Trader/services.ts +++ b/packages/maskbook/src/plugins/Trader/services.ts @@ -11,6 +11,7 @@ import { polygonNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, + optimisticNetworkTradeProviderSettings, } from './settings' import { DataProvider, TradeProvider } from '@masknet/public-api' @@ -41,6 +42,11 @@ currentChainIdSettings.addListener((chainId: ChainId) => { if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP break + case NetworkType.Optimistic: + currentTradeProviderSettings.value = TradeProvider.UNISWAP_V3 + if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) + currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP + break default: unreachable(networkType) } @@ -65,6 +71,9 @@ currentTradeProviderSettings.addListener((tradeProvider: TradeProvider) => { case NetworkType.xDai: xdaiNetworkTradeProviderSettings.value = tradeProvider break + case NetworkType.Optimistic: + optimisticNetworkTradeProviderSettings.value = tradeProvider + break default: unreachable(networkType) } diff --git a/packages/maskbook/src/plugins/Trader/settings.ts b/packages/maskbook/src/plugins/Trader/settings.ts index c7231cc1d3c5..afaacba79418 100644 --- a/packages/maskbook/src/plugins/Trader/settings.ts +++ b/packages/maskbook/src/plugins/Trader/settings.ts @@ -77,6 +77,12 @@ export const xdaiNetworkTradeProviderSettings = createGlobalSettings '' }, ) +export const optimisticNetworkTradeProviderSettings = createGlobalSettings( + `${PLUGIN_IDENTIFIER}+optimistic+tradeProvider`, + TradeProvider.UNISWAP_V3, + { primary: () => '' }, +) + //#region trade provider general settings export interface TradeProviderSettings { pools: ZrxTradePool[] diff --git a/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts b/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts index d35c8afb4992..2b3aefe93887 100644 --- a/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts +++ b/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts @@ -27,6 +27,8 @@ export function getNativeTokenLabel(networkType: NetworkType) { return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.xDai: return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' + case NetworkType.Optimistic: + return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' default: safeUnreachable(networkType) return '' diff --git a/packages/maskbook/src/plugins/Trader/trending/useCurrentTradeProvider.ts b/packages/maskbook/src/plugins/Trader/trending/useCurrentTradeProvider.ts index 116302a5f34a..ddd145e5142f 100644 --- a/packages/maskbook/src/plugins/Trader/trending/useCurrentTradeProvider.ts +++ b/packages/maskbook/src/plugins/Trader/trending/useCurrentTradeProvider.ts @@ -5,6 +5,7 @@ import { binanceNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, + optimisticNetworkTradeProviderSettings, } from '../settings' import { ChainId, getNetworkTypeFromChainId, NetworkType } from '@masknet/web3-shared-evm' import { unreachable } from '@dimensiondev/kit' @@ -18,6 +19,7 @@ export function useCurrentTradeProvider(chainId?: ChainId) { const binanceNetworkTradeProvider = useValueRef(binanceNetworkTradeProviderSettings) const arbitrumNetworkTradeProvider = useValueRef(arbitrumNetworkTradeProviderSettings) const xdaiNetworkTradeProvider = useValueRef(xdaiNetworkTradeProviderSettings) + const optimisticNetworkTradeProvider = useValueRef(optimisticNetworkTradeProviderSettings) if (!networkType) return TradeProvider.UNISWAP_V2 switch (networkType) { @@ -31,6 +33,8 @@ export function useCurrentTradeProvider(chainId?: ChainId) { return arbitrumNetworkTradeProvider case NetworkType.xDai: return xdaiNetworkTradeProvider + case NetworkType.Optimistic: + return optimisticNetworkTradeProvider default: unreachable(networkType) } diff --git a/packages/maskbook/src/plugins/Wallet/apis/debank.ts b/packages/maskbook/src/plugins/Wallet/apis/debank.ts index 0f92b3262246..f5249cfcc219 100644 --- a/packages/maskbook/src/plugins/Wallet/apis/debank.ts +++ b/packages/maskbook/src/plugins/Wallet/apis/debank.ts @@ -20,6 +20,7 @@ const chainIdMap: Record = { [ChainId.xDai]: 'xdai', [ChainId.Matic]: 'matic', [ChainId.Arbitrum]: 'arb', + [ChainId.Optimistic]: 'op', } const getDebankChain = (chainId: number) => { diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index b51f32d8cbb6..33ee68a55775 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -37,6 +37,7 @@ export const resolveDebankChainName = createLookupTableResolver = { [NetworkType.Polygon]: new URL('./wallet-network-icon/polygon.png', import.meta.url).toString(), [NetworkType.Arbitrum]: new URL('./wallet-network-icon/arbitrum.png', import.meta.url).toString(), [NetworkType.xDai]: new URL('./wallet-network-icon/xdai.png', import.meta.url).toString(), + [NetworkType.Optimistic]: new URL('./wallet-network-icon/optimistic.png', import.meta.url).toString(), } export function NetworkIcon(props: NetworkIconProps) { diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f505ed22148c3a3ca83c11e299253deaca8848 GIT binary patch literal 6983 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 Xw&~ctym09{b&9wr!_U7upDp|s=^d~> literal 0 HcmV?d00001 diff --git a/packages/web3-constants/compile-constants.ts b/packages/web3-constants/compile-constants.ts index e212fab9c60f..842c2b4fa350 100644 --- a/packages/web3-constants/compile-constants.ts +++ b/packages/web3-constants/compile-constants.ts @@ -52,6 +52,9 @@ compileConstants(path.join(__dirname, 'evm'), [ 'Arbitrum', 'Arbitrum_Rinkeby', 'xDai', + 'Optimistic', + 'Optimistic_Kovan', + 'Optimistic_Goerli', ]) compileConstants(path.join(__dirname, 'solana'), ['mainnet-beta', 'testnet', 'devnet']) diff --git a/packages/web3-constants/evm/airdrop.json b/packages/web3-constants/evm/airdrop.json index 4ae4b5891613..1360cb9c5b87 100644 --- a/packages/web3-constants/evm/airdrop.json +++ b/packages/web3-constants/evm/airdrop.json @@ -11,6 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/chain.json b/packages/web3-constants/evm/chain.json index 770b0df1a336..100acf549b00 100644 --- a/packages/web3-constants/evm/chain.json +++ b/packages/web3-constants/evm/chain.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "EXPLORER_API_KEY": { "Mainnet": "99IX9MBZKG8FYQUECXDNDPATGVDDH6JCWW", @@ -25,6 +28,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/dhedge.json b/packages/web3-constants/evm/dhedge.json index 629305125d65..1054bc99d7bf 100644 --- a/packages/web3-constants/evm/dhedge.json +++ b/packages/web3-constants/evm/dhedge.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "API_URL": { "Mainnet": "https://api-v2.dhedge.org/graphql", @@ -25,6 +28,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 1bd8c554e8ff..7e14d6cbced3 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -24,7 +24,14 @@ "Arbitrum_Rinkeby": [ "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/421611/tokens.json" ], - "xDai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/100/tokens.json"] + "xDai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/100/tokens.json"], + "Optimistic": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/10/tokens.json"], + "Optimistic_Kovan": [ + "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/69/tokens.json" + ], + "Optimistic_Goerli": [ + "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/420/tokens.json" + ] }, "BALANCE_CHECKER_ADDRESS": { "Mainnet": "0xb1F8e55c7f64D203C1400B9D8555d050F94aDF39", @@ -38,7 +45,10 @@ "Mumbai": "0xFEd05EE9b7DdbAb97Abc55e27EF95C7c14688Aad", "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", - "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186" + "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MULTICALL_ADDRESS": { "Mainnet": "0x1F98415757620B543A52E61c46B32eB19261F984", @@ -52,7 +62,10 @@ "Mumbai": "", "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", - "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B" + "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ENS_REGISTRAR_ADDRESS": { "Mainnet": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", @@ -66,7 +79,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ENS_REVERSE_RECORDS_ADDRESS": { "Mainnet": "0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C", @@ -80,6 +96,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index 68a2058fd096..3b83688cb48e 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BULK_CHECKOUT_ADDRESS": { "Mainnet": "0x7d655c57f71464B6f83811C55D84009Cd9f5221C", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "GITCOIN_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -39,7 +45,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "GITCOIN_TIP_PERCENTAGE": { "Mainnet": 5, @@ -53,6 +62,9 @@ "Mumbai": 5, "Arbitrum": 0, "Arbitrum_Rinkeby": 0, - "xDai": 0 + "xDai": 0, + "Optimistic": 0, + "Optimistic_Kovan": 0, + "Optimistic_Goerli": 0 } } diff --git a/packages/web3-constants/evm/good-ghosting.json b/packages/web3-constants/evm/good-ghosting.json index 758b65734b01..dcaa60fd8941 100644 --- a/packages/web3-constants/evm/good-ghosting.json +++ b/packages/web3-constants/evm/good-ghosting.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "GOOD_GHOSTING_INCENTIVES_CONTRACT_ADDRESS": { "Mainnet": "", @@ -25,6 +28,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 4d75bc6a5565..e737a612821c 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MASK_ITO_CONTRACT_ADDRESS": { "Mainnet": "0x86812da3A623ab9606976078588b80C315E55FA3", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ITO2_CONTRACT_ADDRESS": { "Mainnet": "0xc2CFbF22d6Dc87D0eE18d38d73733524c109Ff46", @@ -39,7 +45,10 @@ "Mumbai": "", "Arbitrum": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", - "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c" + "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ITO2_CONTRACT_CREATION_BLOCK_HEIGHT": { "Mainnet": 12766513, @@ -53,7 +62,10 @@ "Mumbai": 0, "Arbitrum": 102022, "Arbitrum_Rinkeby": 708696, - "xDai": 17865755 + "xDai": 17865755, + "Optimistic": 0, + "Optimistic_Kovan": 0, + "Optimistic_Goerli": 0 }, "DEFAULT_QUALIFICATION_ADDRESS": { "Mainnet": "0x81b6ae377e360dcad63611846a2516f4ba8c88ac", @@ -67,7 +79,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "DEFAULT_QUALIFICATION2_ADDRESS": { "Mainnet": "0x4dC5f343Fe57E4fbDA1B454d125D396A3181272c", @@ -81,7 +96,10 @@ "Mumbai": "", "Arbitrum": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", "Arbitrum_Rinkeby": "0xEbd753E66649C824241E63894301BA8Db5DBF5Bb", - "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9" + "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-mainnet", @@ -95,6 +113,9 @@ "Mumbai": "", "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-arbitrum-one", "Arbitrum_Rinkeby": "", - "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-xdai" + "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-xdai", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/lbp.json b/packages/web3-constants/evm/lbp.json index bc0554b5bf79..295a4f28cdcf 100644 --- a/packages/web3-constants/evm/lbp.json +++ b/packages/web3-constants/evm/lbp.json @@ -11,6 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index c8084a4fc5ae..0f68dd9a4f73 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MASK_BOX_CONTRACT_FROM_BLOCK": { "Mainnet": 13396393, @@ -25,7 +28,10 @@ "Mumbai": 0, "Arbitrum": 0, "Arbitrum_Rinkeby": 0, - "xDai": 0 + "xDai": 0, + "Optimistic": 0, + "Optimistic_Kovan": 0, + "Optimistic_Goerli": 0 }, "MASK_BOX_TEST_NFT": { "Mainnet": "", @@ -39,7 +45,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "WHITE_LIST_QUALIFICATION_CONTRACT_ADDRESS": { "Mainnet": "", @@ -53,7 +62,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SIG_VERIFY_QULIFICATION_CONTRACT_ADDRESS": { "Mainnet": "", @@ -67,6 +79,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index e5861953638b..ca0606318af0 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-mainnet", @@ -25,6 +28,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/opensea-api.json b/packages/web3-constants/evm/opensea-api.json index e91d10a4f3ef..4f9ee5b46383 100644 --- a/packages/web3-constants/evm/opensea-api.json +++ b/packages/web3-constants/evm/opensea-api.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "GET_SINGLE_ASSET_URL": { "Mainnet": "https://api.opensea.io/api/v1/asset", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "GET_ASSETS_URL": { "Mainnet": "https://api.opensea.io/api/v1/assets", @@ -39,6 +45,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/pooltogether.json b/packages/web3-constants/evm/pooltogether.json index 768c6c688fe5..978790213a53 100644 --- a/packages/web3-constants/evm/pooltogether.json +++ b/packages/web3-constants/evm/pooltogether.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MASK_POOL_ADDRESS": { "Mainnet": "", @@ -25,6 +28,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index f33db96a1a77..796f35044a6a 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "HAPPY_RED_PACKET_ADDRESS_V2": { "Mainnet": "0x8D8912E1237F9FF3EF661F32743CFB276E052F98", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "HAPPY_RED_PACKET_ADDRESS_V3": { "Mainnet": "", @@ -39,7 +45,10 @@ "Mumbai": "0x0061E06c9f640a03C4981f43762d2AE5e03873c5", "Arbitrum": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", "Arbitrum_Rinkeby": "0x6B70EC653c4331bdD0D0DCC7C941eb594e69a91d", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "HAPPY_RED_PACKET_ADDRESS_V4": { "Mainnet": "0xaBBe1101FD8fa5847c452A6D70C8655532B03C33", @@ -53,7 +62,10 @@ "Mumbai": "", "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", - "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B" + "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", @@ -67,6 +79,9 @@ "Mumbai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mumbai", "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-arbitrum-one", "Arbitrum_Rinkeby": "", - "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai" + "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index b6ddf4eb70ba..d68c134a0880 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -11,7 +11,10 @@ "Mumbai": ["https://polygon-mumbai.infura.io/v3/d74bd8586b9e44449cef131d39ceeefb"], "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], - "xDai": ["https://rpc.xdaichain.com/"] + "xDai": ["https://rpc.xdaichain.com/"], + "Optimistic": ["https://mainnet.optimism.io"], + "Optimistic_Kovan": ["https://kovan.optimism.io"], + "Optimistic_Goerli": ["https://goerli.optimism.io"] }, "RPC_WEIGHTS": { "Mainnet": [0, 0, 0, 0], @@ -25,6 +28,9 @@ "Mumbai": [0, 0, 0, 0], "Arbitrum": [0, 0, 0, 0], "Arbitrum_Rinkeby": [0, 0, 0, 0], - "xDai": [0, 0, 0, 0] + "xDai": [0, 0, 0, 0], + "Optimistic": [0, 0, 0, 0], + "Optimistic_Kovan": [0, 0, 0, 0], + "Optimistic_Goerli": [0, 0, 0, 0] } } diff --git a/packages/web3-constants/evm/space-station-galaxy.json b/packages/web3-constants/evm/space-station-galaxy.json index fa06ca4ca769..8099fe968ac8 100644 --- a/packages/web3-constants/evm/space-station-galaxy.json +++ b/packages/web3-constants/evm/space-station-galaxy.json @@ -11,7 +11,10 @@ "Mumbai": "0x1e82cFbcF7292DEf91a2A5736265555883FF0289", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUBGRAPH_URL": { "Mainnet": "", @@ -25,6 +28,9 @@ "Mumbai": "https://graphigo.stg.galaxy.eco/query", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/token-asset-base-url.json b/packages/web3-constants/evm/token-asset-base-url.json index 9568962517e5..0166388ef98d 100644 --- a/packages/web3-constants/evm/token-asset-base-url.json +++ b/packages/web3-constants/evm/token-asset-base-url.json @@ -38,6 +38,9 @@ ], "Arbitrum": [], "Arbitrum_Rinkeby": [], - "xDai": [] + "xDai": [], + "Optimistic": [], + "Optimistic_Kovan": [], + "Optimistic_Goerli": [] } } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index aa614681e0b9..982dcde44a36 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -11,7 +11,10 @@ "Mumbai": "0x0000000000000000000000000000000000000000", "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", - "xDai": "0x0000000000000000000000000000000000000000" + "xDai": "0x0000000000000000000000000000000000000000", + "Optimistic": "0x0000000000000000000000000000000000000000", + "Optimistic_Kovan": "0x0000000000000000000000000000000000000000", + "Optimistic_Goerli": "0x0000000000000000000000000000000000000000" }, "WNATIVE_ADDRESS": { "Mainnet": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", @@ -25,7 +28,10 @@ "Mumbai": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", "Arbitrum": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "Arbitrum_Rinkeby": "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", - "xDai": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" + "xDai": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", + "Optimistic": "0x4200000000000000000000000000000000000006", + "Optimistic_Kovan": "0x4200000000000000000000000000000000000006", + "Optimistic_Goerli": "0x4200000000000000000000000000000000000006" }, "USDC_ADDRESS": { "Mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", @@ -39,7 +45,10 @@ "Mumbai": "", "Arbitrum": "0xe865dF68133fcEd7c2285ff3896B406CAfAa2dB8", "Arbitrum_Rinkeby": "", - "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83" + "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", + "Optimistic": "0x7f5c764cbc14f9669b88837ca1490cca17c31607", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "USDT_ADDRESS": { "Mainnet": "0xdAC17F958D2ee523a2206206994597C13D831ec7", @@ -53,7 +62,10 @@ "Mumbai": "", "Arbitrum": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "Arbitrum_Rinkeby": "", - "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6" + "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", + "Optimistic": "0x94b008aa00579c1307b0ef2c499ad98a8ce58e58", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "HUSD_ADDRESS": { "Mainnet": "0xdf574c24545e5ffecb9a659c229253d4111d87e1", @@ -67,7 +79,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0x1e37E5b504F7773460d6eB0e24D2e7C223B66EC7" + "xDai": "0x1e37E5b504F7773460d6eB0e24D2e7C223B66EC7", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BUSD_ADDRESS": { "Mainnet": "0x4fabb145d64652a948d72533023f6e7a623c7c53", @@ -81,7 +96,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff" + "xDai": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "COMP_ADDRESS": { "Mainnet": "0xc00e94Cb662C3520282E6f5717214004A7f26888", @@ -95,7 +113,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "EASY_ADDRESS": { "Mainnet": "", @@ -109,7 +130,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MKR_ADDRESS": { "Mainnet": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", @@ -123,7 +147,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MASK_ADDRESS": { "Mainnet": "0x69af81e73A73B40adF4f3d4223Cd9b1ECE623074", @@ -137,7 +164,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MSKA_ADDRESS": { "Mainnet": "", @@ -151,7 +181,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MSKB_ADDRESS": { "Mainnet": "", @@ -165,7 +198,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MSKC_ADDRESS": { "Mainnet": "", @@ -179,7 +215,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MSKD_ADDRESS": { "Mainnet": "", @@ -193,7 +232,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "MSKE_ADDRESS": { "Mainnet": "", @@ -207,7 +249,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "DAI_ADDRESS": { "Mainnet": "0x6B175474E89094C44Da98b954EedeAC495271d0F", @@ -221,7 +266,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "AMPL_ADDRESS": { "Mainnet": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", @@ -235,7 +283,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "OKB_ADDRESS": { "Mainnet": "0x75231F58b43240C9718Dd58B4967c5114342a86c", @@ -249,7 +300,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UST_ADDRESS": { "Mainnet": "0xa47c8bf37f92aBed4A126BDA807A7b7498661acD", @@ -263,7 +317,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "eUSDC_ADDRESS": { "Mainnet": "", @@ -277,7 +334,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "eUSDT_ADDRESS": { "Mainnet": "", @@ -291,7 +351,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "eDAI_ADDRESS": { "Mainnet": "", @@ -305,7 +368,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNITOKEN_ADDRESS": { "Mainnet": "", @@ -319,7 +385,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "TT01_ADDRESS": { "Mainnet": "", @@ -333,7 +402,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "TT02_ADDRESS": { "Mainnet": "", @@ -347,7 +419,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "QUICK_ADDRESS": { "Mainnet": "", @@ -361,7 +436,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "WBTC_ADDRESS": { "Mainnet": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", @@ -375,7 +453,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252" + "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252", + "Optimistic": "0x68f180fcce6836688e9084f035309e29bf0a2095", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "IGG_ADDRESS": { "Mainnet": "", @@ -389,7 +470,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "OM_ADDRESS": { "Mainnet": "", @@ -403,7 +487,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUSHI_ADDRESS": { "Mainnet": "0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", @@ -417,7 +504,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "YAM_ADDRESS": { "Mainnet": "0x0e2298E3B3390e3b945a5456fBf59eCc3f55DA16", @@ -431,7 +521,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "RUNE_ADDRESS": { "Mainnet": "0x3155BA85D5F96b2d030a4966AF206230e46849cb", @@ -445,7 +538,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "YFI_ADDRESS": { "Mainnet": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", @@ -459,7 +555,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "sUSD_ADDRESS": { "Mainnet": "0x57ab1ec28d129707052df4df418d58a2d46d5f51", @@ -473,7 +572,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BTCB_ADDRESS": { "Mainnet": "", @@ -487,7 +589,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "CAKE_ADDRESS": { "Mainnet": "", @@ -501,7 +606,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "maUSDC_ADDRESS": { "Mainnet": "", @@ -515,7 +623,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "stETH_ADDRESS": { "Mainnet": "0xDFe66B14D37C77F4E9b180cEb433d1b164f0281D", @@ -529,7 +640,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "NFTX_ADDRESS": { "Mainnet": "0x87d73E916D7057945c9BcD8cdd94e42A6F47f776", @@ -543,7 +657,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ETHER_ADDRESS": { "Mainnet": "", @@ -557,7 +674,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "NATIVE_TOKEN_ADDRESS": { "Mainnet": "0x0000000000000000000000000000000000000000", @@ -571,6 +691,9 @@ "Mumbai": "0x0000000000000000000000000000000000000000", "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", - "xDai": "0x0000000000000000000000000000000000000000" + "xDai": "0x0000000000000000000000000000000000000000", + "Optimistic": "0x0000000000000000000000000000000000000000", + "Optimistic_Kovan": "0x0000000000000000000000000000000000000000", + "Optimistic_Goerli": "0x0000000000000000000000000000000000000000" } } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index f9b466a0d1dc..265c1479b7c4 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_V2_FACTORY_ADDRESS": { "Mainnet": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_V2_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2", @@ -39,7 +45,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_V2_INIT_CODE_HASH": { "Mainnet": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", @@ -53,7 +62,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_SWAP_ROUTER_ADDRESS": { "Mainnet": "0xe592427a0aece92de3edee1f18e0157c05861564", @@ -67,7 +79,10 @@ "Mumbai": "", "Arbitrum": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Arbitrum_Rinkeby": "0xE592427A0AEce92De3Edee1F18E0157C05861564", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_V3_FACTORY_ADDRESS": { "Mainnet": "0x1F98431c8aD98523631AE4a59f267346ea31F984", @@ -81,7 +96,10 @@ "Mumbai": "", "Arbitrum": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Arbitrum_Rinkeby": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "xDai": "" + "xDai": "", + "Optimistic": "0x1F98431c8aD98523631AE4a59f267346ea31F984", + "Optimistic_Kovan": "0x1F98431c8aD98523631AE4a59f267346ea31F984", + "Optimistic_Goerli": "0x1F98431c8aD98523631AE4a59f267346ea31F984" }, "UNISWAP_V3_QUOTER_ADDRESS": { "Mainnet": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", @@ -95,7 +113,10 @@ "Mumbai": "", "Arbitrum": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Arbitrum_Rinkeby": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", - "xDai": "" + "xDai": "", + "Optimistic": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "Optimistic_Kovan": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "Optimistic_Goerli": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6" }, "UNISWAP_V3_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", @@ -109,7 +130,10 @@ "Mumbai": "", "Arbitrum": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Arbitrum_Rinkeby": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + "Optimistic_Goerli": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3" }, "UNISWAP_V3_INIT_CODE_HASH": { "Mainnet": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", @@ -121,9 +145,12 @@ "BSCT": "", "Matic": "", "Mumbai": "", - "Arbitrum": "", - "Arbitrum_Rinkeby": "", - "xDai": "" + "Arbitrum": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Arbitrum_Rinkeby": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "xDai": "", + "Optimistic": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Optimistic_Kovan": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Optimistic_Goerli": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54" }, "SUSHISWAP_ROUTER_ADDRESS": { "Mainnet": "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", @@ -151,7 +178,10 @@ "Mumbai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum_Rinkeby": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", - "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4" + "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUSHISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/zippoxer/sushiswap-subgraph-fork", @@ -165,7 +195,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SUSHISWAP_INIT_CODE_HASH": { "Mainnet": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", @@ -179,7 +212,10 @@ "Mumbai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum_Rinkeby": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", - "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303" + "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SASHIMISWAP_ROUTER_ADDRESS": { "Mainnet": "0xe4fe6a45f354e845f954cddee6084603cedb9410", @@ -193,7 +229,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SASHIMISWAP_FACTORY_ADDRESS": { "Mainnet": "0xF028F723ED1D0fE01cC59973C49298AA95c57472", @@ -207,7 +246,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SASHIMISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/sashimiproject/sashimi", @@ -221,7 +263,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "SASHIMISWAP_INIT_CODE_HASH": { "Mainnet": "0xb465bbe4edb8c9b0da8ff0b2b36ce0065de9fcd5a33f32c6856ea821779c8b72", @@ -235,7 +280,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "QUICKSWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -249,7 +297,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "QUICKSWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -263,7 +314,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "QUICKSWAP_THEGRAPH": { "Mainnet": "", @@ -277,7 +331,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "QUICKSWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -291,7 +348,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "PANCAKESWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -305,7 +365,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "PANCAKESWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -319,7 +382,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "PANCAKESWAP_THEGRAPH": { "Mainnet": "", @@ -333,7 +399,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "PANCAKESWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -347,7 +416,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BALANCER_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -361,7 +433,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BALANCER_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21", @@ -375,7 +450,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BALANCER_POOLS_URL": { "Mainnet": "https://ipfs.fleek.co/ipns/balancer-bucket.storage.fleek.co/balancer-exchange/pools", @@ -389,7 +467,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "DODO_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -403,7 +484,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "DODO_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149", @@ -417,7 +501,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BANCOR_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -431,7 +518,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "BANCOR_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x2F9EC37d6CcFFf1caB21733BdaDEdE11c823cCB0", @@ -445,6 +535,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-constants/evm/trending.json b/packages/web3-constants/evm/trending.json index 41b00629b33d..9268c9dbf7d9 100644 --- a/packages/web3-constants/evm/trending.json +++ b/packages/web3-constants/evm/trending.json @@ -11,7 +11,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "UNISWAP_V2_HEALTH_URL": { "Mainnet": "https://api.thegraph.com/index-node/graphql", @@ -25,7 +28,10 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" }, "ETHEREUM_BLOCKS_SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/blocklytics/ethereum-blocks", @@ -39,6 +45,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "" } } diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 6cf783d64c85..42df33535ca8 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -334,6 +334,32 @@ "chainId": 10, "networkId": 10 }, + { + "name": "Optimistic Ethereum Testnet Kovan", + "chain": "KOR", + "network": "testnet", + "rpc": ["https://kovan.optimism.io/"], + "faucets": [], + "features": [], + "nativeCurrency": { "name": "Ether", "symbol": "KOR", "decimals": 18 }, + "infoURL": "https://optimism.io", + "shortName": "gor", + "chainId": 69, + "networkId": 69 + }, + { + "name": "Optimistic Ethereum Testnet Goerli", + "chain": "OPT", + "network": "testnet", + "rpc": ["https://goerli.optimism.io/"], + "faucets": [], + "features": [], + "nativeCurrency": { "name": "Ether", "symbol": "GOR", "decimals": 18 }, + "infoURL": "https://optimism.io", + "shortName": "gor", + "chainId": 420, + "networkId": 420 + }, { "name": "Metadium Mainnet", "chain": "META", diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index d5442c7511bc..d95779b1e1db 100644 --- a/packages/web3-shared/evm/pipes/index.ts +++ b/packages/web3-shared/evm/pipes/index.ts @@ -29,6 +29,7 @@ export const resolveNetworkAddressPrefix = createLookupTableResolver [NetworkType.Ethereum]: 'Ethereum', [NetworkType.Arbitrum]: 'Arbitrum', [NetworkType.xDai]: 'xDai', + [NetworkType.Optimistic]: 'Optimistic', }, 'Unknown', ) @@ -68,6 +70,9 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Arbitrum]: 'rgb(36, 150, 238)', [ChainId.Arbitrum_Rinkeby]: 'rgb(36, 150, 238)', [ChainId.xDai]: 'rgb(73, 169, 166)', + [ChainId.Optimistic]: 'rgb(255, 3, 33)', + [ChainId.Optimistic_Kovan]: 'rgb(255, 3, 33)', + [ChainId.Optimistic_Goerli]: 'rgb(255, 3, 33)', }, 'rgb(214, 217, 220)', ) diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index 2306ac03a7bf..40b2167da9d2 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -40,6 +40,11 @@ export enum ChainId { // xDai xDai = 100, + + //Optimistic + Optimistic = 10, + Optimistic_Kovan = 69, + Optimistic_Goerli = 420, } export enum ProviderType { @@ -63,6 +68,7 @@ export enum NetworkType { Polygon = 'Polygon', Arbitrum = 'Arbitrum', xDai = 'xDai', + Optimistic = 'Optimistic', } export interface Wallet { diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 33dfa7af8f65..a10096a9382a 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -85,6 +85,7 @@ export const getChainIdFromNetworkType = createLookupTableResolver { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3289fffcb1bc..1881416b22c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -569,7 +569,7 @@ importers: '@masknet/theme': link:../../theme '@masknet/web3-shared-evm': link:../../web3-shared/evm bignumber.js: 9.0.1 - react-use: 17.3.1 + react-use: 17.3.1_809e898db569a1fe7ae9ea851da8594e web3-core-helpers: 1.5.2 packages/plugins/example: @@ -11871,7 +11871,7 @@ packages: /core-js/2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. + deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. requiresBuild: true dev: false @@ -13799,6 +13799,7 @@ packages: /eth-sig-util/1.4.2: resolution: {integrity: sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=} + deprecated: Deprecated in favor of '@metamask/eth-sig-util' dependencies: ethereumjs-abi: github.com/ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0 ethereumjs-util: 5.2.1 @@ -18536,22 +18537,6 @@ packages: resolution: {integrity: sha1-ulSMh578+5DaHE2eCX20pGySVe8=} dev: false - /nano-css/5.3.1: - resolution: {integrity: sha512-ENPIyNzANQRyYVvb62ajDd7PAyIgS2LIUnT9ewih4yrXSZX4hKoUwssy8WjUH++kEOA5wUTMgNnV7ko5n34kUA==} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - css-tree: 1.1.3 - csstype: 3.0.8 - fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 6.0.0 - rtl-css-js: 1.14.2 - sourcemap-codec: 1.4.8 - stacktrace-js: 2.0.2 - stylis: 4.0.10 - dev: false - /nano-css/5.3.1_809e898db569a1fe7ae9ea851da8594e: resolution: {integrity: sha512-ENPIyNzANQRyYVvb62ajDd7PAyIgS2LIUnT9ewih4yrXSZX4hKoUwssy8WjUH++kEOA5wUTMgNnV7ko5n34kUA==} peerDependencies: @@ -20471,15 +20456,6 @@ packages: tslib: 2.3.1 dev: false - /react-universal-interface/0.6.2_tslib@2.3.1: - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: '*' - tslib: '*' - dependencies: - tslib: 2.3.1 - dev: false - /react-use/15.3.8_809e898db569a1fe7ae9ea851da8594e: resolution: {integrity: sha512-GeGcrmGuUvZrY5wER3Lnph9DSYhZt5nEjped4eKDq8BRGr2CnLf9bDQWG9RFc7oCPphnscUUdOovzq0E5F2c6Q==} peerDependencies: @@ -20504,28 +20480,6 @@ packages: tslib: 2.3.1 dev: false - /react-use/17.3.1: - resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@types/js-cookie': 2.2.7 - '@xobotyi/scrollbar-width': 1.9.5 - copy-to-clipboard: 3.3.1 - fast-deep-equal: 3.1.3 - fast-shallow-equal: 1.0.0 - js-cookie: 2.2.1 - nano-css: 5.3.1 - react-universal-interface: 0.6.2_tslib@2.3.1 - resize-observer-polyfill: 1.5.1 - screenfull: 5.1.0 - set-harmonic-interval: 1.0.1 - throttle-debounce: 3.0.1 - ts-easing: 0.2.0 - tslib: 2.3.1 - dev: false - /react-use/17.3.1_809e898db569a1fe7ae9ea851da8594e: resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} peerDependencies: @@ -25218,6 +25172,26 @@ packages: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: true + github.com/ProjectOpenSea/wyvern-js/1634ad0e2f9961accca62edbf4ac624effa18552: + resolution: {tarball: https://codeload.github.com/ProjectOpenSea/wyvern-js/tar.gz/1634ad0e2f9961accca62edbf4ac624effa18552} + name: wyvern-js + version: 3.2.0 + dependencies: + '@0xproject/abi-gen': 0.1.7 + '@0xproject/assert': 0.0.11 + '@0xproject/json-schemas': 0.7.24 + '@0xproject/utils': 0.1.3 + '@0xproject/web3-wrapper': 0.1.14 + 0x.js: 0.29.2 + bn.js: 4.12.0 + ethereumjs-abi: github.com/ProjectWyvern/ethereumjs-abi/3d2d89641a6ad5984929b6ca4b646452ec74f73d + ethereumjs-util: 5.2.1 + json-loader: 0.5.7 + jsonschema: 1.4.0 + lodash: 4.17.21 + web3: 0.20.7 + dev: false + github.com/ProjectOpenSea/wyvern-js/fabb7660f23f2252c141077e32193d281036299e: resolution: {tarball: https://codeload.github.com/ProjectOpenSea/wyvern-js/tar.gz/fabb7660f23f2252c141077e32193d281036299e} name: wyvern-js @@ -25260,7 +25234,7 @@ packages: bignumber.js: 6.0.0 typed-promisify: 0.4.0 web3-provider-engine: 13.8.0 - wyvern-js: github.com/ProjectOpenSea/wyvern-js/fabb7660f23f2252c141077e32193d281036299e + wyvern-js: github.com/ProjectOpenSea/wyvern-js/1634ad0e2f9961accca62edbf4ac624effa18552 transitivePeerDependencies: - debug dev: false From 4f9a737627e9a0c5d72397b5657e133ff5bb8921 Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 24 Dec 2021 03:38:08 +0000 Subject: [PATCH 02/47] chore(optimistic): fixed import warnings --- packages/dashboard/src/pages/Settings/api.ts | 2 +- .../src/extension/background-script/SettingsService.ts | 6 +++--- packages/maskbook/src/plugins/Trader/pipes.ts | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/dashboard/src/pages/Settings/api.ts b/packages/dashboard/src/pages/Settings/api.ts index fa11d3c2fb04..56c576321774 100644 --- a/packages/dashboard/src/pages/Settings/api.ts +++ b/packages/dashboard/src/pages/Settings/api.ts @@ -34,7 +34,7 @@ export const [useXDaiNetworkTradeProvider] = createGlobalState( Messages.events.xdaiNetworkTradeProviderSettings.on, ) -export const [useOptimistcNetworkTradeProvider] = createGlobalState( +export const [useOptimisticNetworkTradeProvider] = createGlobalState( Services.Settings.getOptimisticNetworkTradeProvider, Messages.events.optimisticNetworkTradeProviderSettings.on, ) diff --git a/packages/maskbook/src/extension/background-script/SettingsService.ts b/packages/maskbook/src/extension/background-script/SettingsService.ts index da6647ebc17d..b846a0a468b8 100644 --- a/packages/maskbook/src/extension/background-script/SettingsService.ts +++ b/packages/maskbook/src/extension/background-script/SettingsService.ts @@ -14,7 +14,7 @@ import { polygonNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, - optimismNetworkTradeProviderSettings, + optimisticNetworkTradeProviderSettings, } from '../../plugins/Trader/settings' import { queryMyPersonas } from './IdentityService' import { @@ -71,8 +71,8 @@ export const [getArbitrumNetworkTradeProvider, setArbitrumNetworkTradeProvider] ) export const [getxDaiNetworkTradeProvider, setxDaiNetworkTradeProvider] = create(xdaiNetworkTradeProviderSettings) -export const [getOptimismNetworkTradeProvider, setOptimismNetworkTradeProvider] = create( - optimismNetworkTradeProviderSettings, +export const [getOptimisticNetworkTradeProvider, setOptimisticNetworkTradeProvider] = create( + optimisticNetworkTradeProviderSettings, ) export const [getCurrentSelectedWalletProvider, setCurrentSelectedWalletProvider] = create(currentProviderSettings) diff --git a/packages/maskbook/src/plugins/Trader/pipes.ts b/packages/maskbook/src/plugins/Trader/pipes.ts index 2aad7514b782..fcfae1b0b9cc 100644 --- a/packages/maskbook/src/plugins/Trader/pipes.ts +++ b/packages/maskbook/src/plugins/Trader/pipes.ts @@ -80,6 +80,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://aribitrum.api.0x.org/' case NetworkType.xDai: return 'https://xdai.api.0x.org/' + case NetworkType.Optimistic: + return 'https://optimistic.api.0x.org/' default: safeUnreachable(networkType) return '' From ba97f5a49412f3cb18ba463e1736f4af170cd6ad Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 30 Dec 2021 19:56:57 +0000 Subject: [PATCH 03/47] feat(optimistc): add events optimistic --- packages/shared-base/src/Messages/Mask.ts | 1 + pnpm-lock.yaml | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/shared-base/src/Messages/Mask.ts b/packages/shared-base/src/Messages/Mask.ts index 0886d8c45c1f..1ef82fa42168 100644 --- a/packages/shared-base/src/Messages/Mask.ts +++ b/packages/shared-base/src/Messages/Mask.ts @@ -35,6 +35,7 @@ export interface MaskSettingsEvents { xdaiNetworkTradeProviderSettings: TradeProvider fantomNetworkTradeProviderSettings: TradeProvider celoNetworkTradeProviderSettings: TradeProvider + optimisticNetworkTradeProviderSettings: TradeProvider } export interface MaskMobileOnlyEvents { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1935102b547c..71abef900029 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1072,7 +1072,7 @@ packages: bintrees: 1.0.2 bn.js: 4.12.0 compare-versions: 3.6.0 - ethereumjs-abi: 0.6.6 + ethereumjs-abi: 0.6.8 ethereumjs-blockstream: 2.0.7 ethereumjs-util: 5.2.1 find-versions: 2.0.0 @@ -9492,7 +9492,7 @@ packages: /axios/0.21.1: resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} dependencies: - follow-redirects: 1.14.6 + follow-redirects: 1.14.5 transitivePeerDependencies: - debug dev: false @@ -13531,11 +13531,11 @@ packages: resolution: {integrity: sha512-5qwJ5n3YhjSpE6O/WEBXCAb2nagUgyagJ6C0lGUBWC4LjKp/rRzD+pwtDJ6KCiITFEAoX4eIrWOjRy0Sylq5Hg==} dev: false - /ethereumjs-abi/0.6.6: - resolution: {integrity: sha512-w8KubDsA/+OAuqtIR9RGsMcoZ5nhM8vxwjJAJvEIY+clhxA3BHoLG3+ClYQaQhD0n3mlDt3U5rBrmSVJvI3c8A==} + /ethereumjs-abi/0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: bn.js: 4.12.0 - ethereumjs-util: 5.2.1 + ethereumjs-util: 6.2.1 dev: false /ethereumjs-account/2.0.5: @@ -14372,7 +14372,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: true /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} From 2130a87991d1b45946b85c1979feca5fd246ca32 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 4 Jan 2022 17:41:16 +0000 Subject: [PATCH 04/47] feat(optimistic): add contracts --- docs/evm-integration.md | 23 ++++++++++--------- .../Labs/components/SwapSettingDialog.tsx | 3 ++- .../components/shared/ApplicationBoard.tsx | 1 + .../src/plugins/Trader/constants/uniswap.ts | 1 + packages/web3-constants/evm/debank.json | 2 +- packages/web3-constants/evm/ethereum.json | 6 ++--- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/evm-integration.md b/docs/evm-integration.md index 4bb9084f6125..0bc059331a85 100644 --- a/docs/evm-integration.md +++ b/docs/evm-integration.md @@ -28,7 +28,7 @@ Mask Network fetches on-chain data from various data sources. Therefore, you can #### Learn more -- https://api.coingecko.com/api/v3/asset_platforms +- ### Token List @@ -44,10 +44,10 @@ Mask Network has integrated Uniswap V2 and Uniswap V3 into the trader plugin. If For API-based DEX, please ref to how other DEXes integrated: -| DEX | Pull Request Link | -| --------- | -------------------------------------------------- | -| DODO | https://github.com/DimensionDev/Maskbook/pull/3882 | -| OpenOcean | https://github.com/DimensionDev/Maskbook/pull/5198 | +| DEX | Pull Request Link | +| --------- | ---------------------------------------------------- | +| DODO | | +| OpenOcean | | ### Deploy Contracts @@ -87,9 +87,10 @@ Goto `chrome-extension://jkoeaghipilijlahjplgbfiocjhldnap/dashboard.html#/wallet ## Learn More -| Chain | Pull Request Link | -| -------- | -------------------------------------------------- | -| CELO | https://github.com/DimensionDev/Maskbook/pull/5052 | -| Fantom | https://github.com/DimensionDev/Maskbook/pull/5036 | -| xDai | https://github.com/DimensionDev/Maskbook/pull/4140 | -| Arbitrum | https://github.com/DimensionDev/Maskbook/pull/3558 | +| Chain | Pull Request Link | +| ---------- | ---------------------------------------------------- | +| CELO | | +| Fantom | | +| xDai | | +| Arbitrum | | +| Optimistic | | diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index a0ace14f52a9..af70dd9cf952 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -113,7 +113,8 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) legend: t.labs_settings_swap_network({ network: 'Optimism' }), value: useOptimisticNetworkTradeProvider(), options: optimisticOptions, - onChange: (value: string) => Services.Settings.setOptimisticNetworkTradeProvider(+value), + onChange: (value: string) => + Services.Settings.setOptimisticNetworkTradeProvider(Number.parseInt(value, 10)), }, ] diff --git a/packages/mask/src/components/shared/ApplicationBoard.tsx b/packages/mask/src/components/shared/ApplicationBoard.tsx index 8dedbed99845..23e5788d4198 100644 --- a/packages/mask/src/components/shared/ApplicationBoard.tsx +++ b/packages/mask/src/components/shared/ApplicationBoard.tsx @@ -316,6 +316,7 @@ export function ApplicationBoard({ secondEntries, secondEntryChainTabs }: MaskAp ChainId.xDai, ChainId.Celo, ChainId.Fantom, + ChainId.Optimistic, ], ), undefined, diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index ae337d9f65e2..1724019b1cdd 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -22,6 +22,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), [ChainId.Rinkeby]: [WNATIVE, MSKA, MSKB, MSKC].map((x) => x[ChainId.Rinkeby]), + [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), } export const MAX_HOP = 3 diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index 6705450cd65d..2a21ff1aa322 100644 --- a/packages/web3-constants/evm/debank.json +++ b/packages/web3-constants/evm/debank.json @@ -14,6 +14,6 @@ "xDai": "xdai", "Celo": "celo", "Fantom": "ftm", - "Optimistic": "opt" + "Optimistic": "op" } } diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 67fa54016dc3..0b8d2b0a5826 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -31,9 +31,9 @@ "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimistic": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", + "Optimistic_Kovan": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", + "Optimistic_Goerli": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", "Fantom": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c" }, From a4f20b4e8ff353e7602bd56e9d0efe5bfb931873 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 4 Jan 2022 23:27:18 +0000 Subject: [PATCH 05/47] feat(dHEDGE): add optimistic network --- packages/mask/src/components/shared/ApplicationBoard.tsx | 1 + packages/web3-constants/evm/dhedge.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mask/src/components/shared/ApplicationBoard.tsx b/packages/mask/src/components/shared/ApplicationBoard.tsx index 23e5788d4198..2c92d8ae9cea 100644 --- a/packages/mask/src/components/shared/ApplicationBoard.tsx +++ b/packages/mask/src/components/shared/ApplicationBoard.tsx @@ -289,6 +289,7 @@ export function ApplicationBoard({ secondEntries, secondEntryChainTabs }: MaskAp ChainId.xDai, ChainId.Celo, ChainId.Fantom, + ChainId.Optimistic, ], ), undefined, diff --git a/packages/web3-constants/evm/dhedge.json b/packages/web3-constants/evm/dhedge.json index 4c34db5b847b..ffdba64af975 100644 --- a/packages/web3-constants/evm/dhedge.json +++ b/packages/web3-constants/evm/dhedge.json @@ -12,7 +12,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "https://app.dhedge.org", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", @@ -31,7 +31,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "https://api-v2.dhedge.org/graphql", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", From 232d7c82eb03e097ef8d165703d0553f74f297c9 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 4 Jan 2022 23:49:15 +0000 Subject: [PATCH 06/47] feat(optimistic): enable unlock protocol --- packages/mask/src/plugins/UnlockProtocol/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mask/src/plugins/UnlockProtocol/base.ts b/packages/mask/src/plugins/UnlockProtocol/base.ts index 47001914e48f..b658d64c7785 100644 --- a/packages/mask/src/plugins/UnlockProtocol/base.ts +++ b/packages/mask/src/plugins/UnlockProtocol/base.ts @@ -14,7 +14,7 @@ export const base: Plugin.Shared.Definition = { target: 'stable', web3: { [NetworkPluginID.PLUGIN_EVM]: { - supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby], + supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimistic], }, }, }, From 807e6f8b50b309c9b6cd484f96dc954870f41a76 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 6 Jan 2022 16:51:44 +0000 Subject: [PATCH 07/47] feat(optimistic): add contracts addres --- packages/web3-constants/evm/ethereum.json | 4 ++-- packages/web3-constants/evm/ito.json | 2 +- packages/web3-constants/evm/mask-box.json | 2 +- packages/web3-constants/evm/nft-red-packet.json | 2 +- packages/web3-constants/evm/red-packet.json | 7 +++++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 0b8d2b0a5826..5c10cb08c17a 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -12,8 +12,8 @@ "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", - "Optimistic": "", - "Optimistic_Kovan": "", + "Optimistic": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", + "Optimistic_Kovan": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", "Optimistic_Goerli": "", "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", "Fantom": "0xc119574d5fb333f5ac018658d4d8b5035e16bf39" diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index b9befb5869d1..0a329f5919bf 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -51,7 +51,7 @@ "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", "Optimistic": "", - "Optimistic_Kovan": "", + "Optimistic_Kovan": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", "Optimistic_Goerli": "", "Celo": "", "Fantom": "" diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index 8aafb2df43c7..2496977531f6 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -13,7 +13,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Optimistic": "", - "Optimistic_Kovan": "", + "Optimistic_Kovan": "0xdb93ccd481012bb5d1e2c8d0af7c5f2940c00fdc", "Optimistic_Goerli": "", "Celo": "", "Fantom": "" diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index a9e4fe52ebf1..92b0b6a9a0de 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -13,7 +13,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Optimistic": "", - "Optimistic_Kovan": "", + "Optimistic_Kovan": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Optimistic_Goerli": "", "Celo": "", "Fantom": "" diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index 930e0383b6b4..6388f84ebd07 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -70,7 +70,7 @@ "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", "Optimistic": "", - "Optimistic_Kovan": "", + "Optimistic_Kovan": "0x97369fee7db34e0bfe47861f2ec44b4378d13eb4", "Optimistic_Goerli": "", "Celo": "", "Fantom": "" @@ -89,7 +89,10 @@ "Arbitrum_Rinkeby": 0, "xDai": 18101937, "Celo": 0, - "Fantom": 0 + "Fantom": 0, + "Optimistic": 0, + "Optimistic_Kovan": 792040, + "Optimistic_Goerli": 0 }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", From 9e304a32ba8bea7cb5bb1091798e0abba84837e2 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 10 Jan 2022 10:38:22 +0100 Subject: [PATCH 08/47] chore(optimistic): add ignore word on cspell --- cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell.json b/cspell.json index f8d29379af82..31a5cfd63aa8 100644 --- a/cspell.json +++ b/cspell.json @@ -302,6 +302,7 @@ "inpage", "irss", "isfacebook", + "jkoeaghipilijlahjplgbfiocjhldnap", "jsxs", "koda", "Kodav", From 60a385ab219f9097c644c8ed5baf8a1cb531b038 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 13 Jan 2022 19:40:02 +0100 Subject: [PATCH 09/47] feat(optimistic): add mainnet contracts --- cspell.json | 2 +- docs/evm-integration.md | 2 + .../src/plugins/Wallet/services/assets.ts | 2 +- packages/web3-constants/evm/coingecko.json | 14 +++--- .../web3-constants/evm/coinmarketcap.json | 6 ++- packages/web3-constants/evm/cryptoartai.json | 9 ++++ packages/web3-constants/evm/debank.json | 6 ++- packages/web3-constants/evm/explorer.json | 44 +++++++++---------- packages/web3-constants/evm/gitcoin.json | 6 +-- packages/web3-constants/evm/ito.json | 2 +- .../web3-constants/evm/nft-red-packet.json | 4 +- packages/web3-constants/evm/red-packet.json | 12 ++--- packages/web3-constants/evm/token-list.json | 3 ++ packages/web3-constants/evm/token.json | 9 ++++ packages/web3-constants/evm/trader.json | 9 ++++ packages/web3-constants/evm/zerion.json | 6 +++ packages/web3-providers/src/zerion/format.ts | 2 +- packages/web3-shared/evm/assets/chains.json | 14 +++++- 18 files changed, 104 insertions(+), 48 deletions(-) diff --git a/cspell.json b/cspell.json index 31a5cfd63aa8..34fb3b625fe5 100644 --- a/cspell.json +++ b/cspell.json @@ -158,6 +158,7 @@ "nftscan", "nowallet", "nums", + "OETH", "opensea", "optimistic", "overridable", @@ -302,7 +303,6 @@ "inpage", "irss", "isfacebook", - "jkoeaghipilijlahjplgbfiocjhldnap", "jsxs", "koda", "Kodav", diff --git a/docs/evm-integration.md b/docs/evm-integration.md index 0bc059331a85..75a7b4d5f010 100644 --- a/docs/evm-integration.md +++ b/docs/evm-integration.md @@ -74,6 +74,8 @@ Before we ship the chain to the user, we need to do basic ability checks. - [ ] Check if the gas estimate dialog is working. - Setup the chain for CoinGecko API. + + Goto `chrome-extension://jkoeaghipilijlahjplgbfiocjhldnap/dashboard.html#/wallets/transfer` and check the estimated USD value is working. ![image](https://user-images.githubusercontent.com/52657989/144754866-9c5f389b-6eb4-4325-8f3d-ae53ee6e3b4a.png) diff --git a/packages/mask/src/plugins/Wallet/services/assets.ts b/packages/mask/src/plugins/Wallet/services/assets.ts index 40c842d88c64..531a8e078b86 100644 --- a/packages/mask/src/plugins/Wallet/services/assets.ts +++ b/packages/mask/src/plugins/Wallet/services/assets.ts @@ -180,7 +180,7 @@ function formatAssetsFromZerion( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'OETH'].includes(symbol) return { token: { diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index bc263bd9b93f..c2330d443b05 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -12,9 +12,11 @@ "Arbitrum": "arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "xdai", + "Optimistic": "optimistic-ethereum", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "celo", - "Fantom": "fantom", - "Optimistic": "optimistic-ethereum" + "Fantom": "fantom" }, "COIN_ID": { "Mainnet": "ethereum", @@ -26,11 +28,13 @@ "BSCT": "", "Matic": "matic-network", "Mumbai": "arbitrum-one", - "Arbitrum": "", + "Arbitrum": "ethereum", "Arbitrum_Rinkeby": "", "xDai": "xdai", + "Optimistic": "ethereum", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "celo", - "Fantom": "fantom", - "Optimistic": "optimistic-ethereum" + "Fantom": "fantom" } } diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index 8311c719ee91..6c29e87438ec 100644 --- a/packages/web3-constants/evm/coinmarketcap.json +++ b/packages/web3-constants/evm/coinmarketcap.json @@ -12,8 +12,10 @@ "Arbitrum": "11841", "Arbitrum_Rinkeby": "", "xDai": "5601", + "Optimistic": "10", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "5567", - "Fantom": "3513", - "Optimistic": "10" + "Fantom": "3513" } } diff --git a/packages/web3-constants/evm/cryptoartai.json b/packages/web3-constants/evm/cryptoartai.json index d4e9200b7a36..3eb13e6ed07c 100644 --- a/packages/web3-constants/evm/cryptoartai.json +++ b/packages/web3-constants/evm/cryptoartai.json @@ -12,6 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "" }, @@ -28,6 +31,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "" }, @@ -44,6 +50,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index 2a21ff1aa322..ec29bb9c4351 100644 --- a/packages/web3-constants/evm/debank.json +++ b/packages/web3-constants/evm/debank.json @@ -12,8 +12,10 @@ "Arbitrum": "arb", "Arbitrum_Rinkeby": "", "xDai": "xdai", + "Optimistic": "op", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "celo", - "Fantom": "ftm", - "Optimistic": "op" + "Fantom": "ftm" } } diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 25be336f7f6e..7a7d35bd2e14 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -1,4 +1,23 @@ { + "API_KEYS": { + "Mainnet": ["26GHYKIAZREN4HWJ5NCICTGKC183IGXY9A"], + "Ropsten": [], + "Rinkeby": [], + "Kovan": [], + "Gorli": [], + "BSC": ["5FQ5JHS1BEK4186QCZASE3SD23YD8FIMM8"], + "BSCT": [], + "Matic": ["5HVFKYFPQXWNQ2TFHCAYJJZ3YIYPWQ5HP8"], + "Mumbai": [], + "Arbitrum": ["BE8VU1P9FUKRT15FBHKQMU84829VITWWF2"], + "Arbitrum_Rinkeby": [], + "xDai": [], + "Optimistic": [], + "Optimistic_Kovan": [], + "Optimistic_Goerli": [], + "Celo": [], + "Fantom": ["AST4WWPNEYDURUXG2GH32JZMYWEFDP999S"] + }, "EXPLORER_API": { "Mainnet": "https://api.etherscan.io/api", "Ropsten": "", @@ -11,30 +30,11 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimistic": "", + "xDai": "https://blockscout.com/xdai/mainnet/api", + "Optimistic": "https://api-optimistic.etherscan.io/api", "Optimistic_Kovan": "", "Optimistic_Goerli": "", - "Celo": "", + "Celo": "https://explorer.celo.org/api", "Fantom": "https://api.ftmscan.com/api" - }, - "EXPLORER_API_KEY": { - "Mainnet": "99IX9MBZKG8FYQUECXDNDPATGVDDH6JCWW", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "7IJXTFIFB28ARWKZVA78GS29TT5YG82M5Z", - "BSCT": "", - "Matic": "PEMG6SUGQ71X55MVW2A1YK5J49V8VV6RF9", - "Mumbai": "", - "Arbitrum": "", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", - "Celo": "", - "Fantom": "" } } diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index c6a514840e60..810daf4933a6 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -66,12 +66,12 @@ "BSCT": 5, "Matic": 5, "Mumbai": 5, - "Optimistic": 5, - "Optimistic_Kovan": 0, - "Optimistic_Goerli": 0, "Arbitrum": 5, "Arbitrum_Rinkeby": 5, "xDai": 5, + "Optimistic": 5, + "Optimistic_Kovan": 0, + "Optimistic_Goerli": 0, "Celo": 5, "Fantom": 5 } diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 0a329f5919bf..350a098f7fd0 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -50,7 +50,7 @@ "Arbitrum": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", - "Optimistic": "", + "Optimistic": "0x1d4c400F9706a3b6fc9fe4246548954C556b7E2f", "Optimistic_Kovan": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", "Optimistic_Goerli": "", "Celo": "", diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index 92b0b6a9a0de..5d7e40029087 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -12,7 +12,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "0xC86e48D8FE6E8b999840927859290F4e41bDa779", "Optimistic_Kovan": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Optimistic_Goerli": "", "Celo": "", @@ -31,7 +31,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-op", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index 6388f84ebd07..bca66b6981da 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -69,7 +69,7 @@ "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", - "Optimistic": "", + "Optimistic": "0xdc461a5b7Dd3527612867b08A2cCc87416b44879", "Optimistic_Kovan": "0x97369fee7db34e0bfe47861f2ec44b4378d13eb4", "Optimistic_Goerli": "", "Celo": "", @@ -88,11 +88,11 @@ "Arbitrum": 909051, "Arbitrum_Rinkeby": 0, "xDai": 18101937, - "Celo": 0, - "Fantom": 0, - "Optimistic": 0, + "Optimistic": 2282786, "Optimistic_Kovan": 792040, - "Optimistic_Goerli": 0 + "Optimistic_Goerli": 0, + "Celo": 0, + "Fantom": 0 }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", @@ -107,7 +107,7 @@ "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai", - "Optimistic": "", + "Optimistic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-op", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 6b18d73e9def..c163fbb89f6e 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -25,6 +25,9 @@ "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/421611/tokens.json" ], "xDai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/100/tokens.json"], + "Optimistic": [], + "Optimistic_Kovan": [], + "Optimistic_Goerli": [], "Celo": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/42220/tokens.json"], "Fantom": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/250/tokens.json"] } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index d8cd4b49a4f5..f2e88efb518e 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -392,6 +392,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "0x049d68029688eAbF473097a2fC38ef61633A3C7A" }, @@ -750,6 +753,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "" }, @@ -766,6 +772,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "" }, diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 62f8ec7a62dd..99007d3bd5d0 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -183,6 +183,9 @@ "Arbitrum": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Arbitrum_Rinkeby": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "0x1421bDe4B10e8dd459b3BCb598810B1337D56842", "Fantom": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506" }, @@ -617,6 +620,9 @@ "Arbitrum": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Arbitrum_Rinkeby": "", "xDai": "0x0000000000000000000000000000000000000000", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "" }, @@ -633,6 +639,9 @@ "Arbitrum": "0x6352a56caadc4f1e25cd6c75970fa768a3304e64", "Arbitrum_Rinkeby": "", "xDai": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/zerion.json b/packages/web3-constants/evm/zerion.json index 98708cd1b302..46baaed61aeb 100644 --- a/packages/web3-constants/evm/zerion.json +++ b/packages/web3-constants/evm/zerion.json @@ -12,6 +12,9 @@ "Arbitrum": "arbitrum-assets", "Arbitrum_Rinkeby": "", "xDai": "xdai-assets", + "Optimistic": "opt-assets", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "celo-assets", "Fantom": "fantom-assets" }, @@ -28,6 +31,9 @@ "Arbitrum": "arbitrum-transactions", "Arbitrum_Rinkeby": "", "xDai": "xdai-transactions", + "Optimistic": "opt-transactions", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "celo-transactions", "Fantom": "fantom-transactions" } diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index 3253b0ff1291..099a5b4ac4be 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -57,7 +57,7 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'OETH'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 7290bac131cd..7dc72e58e5ef 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -328,7 +328,12 @@ "rpc": ["https://mainnet.optimism.io/"], "faucets": [], "features": [], - "nativeCurrency": { "name": "Ether", "symbol": "OETH", "decimals": 18 }, + "nativeCurrency": { + "name": "Ether", + "symbol": "OETH", + "decimals": 18, + "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" + }, "infoURL": "https://optimism.io", "shortName": "oeth", "chainId": 10, @@ -341,7 +346,12 @@ "rpc": ["https://kovan.optimism.io/"], "faucets": [], "features": [], - "nativeCurrency": { "name": "Ether", "symbol": "KOR", "decimals": 18 }, + "nativeCurrency": { + "name": "Ether", + "symbol": "KOR", + "decimals": 18, + "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" + }, "infoURL": "https://optimism.io", "shortName": "gor", "chainId": 69, From 56dd7cd4a27f27e39477e33c3c4b1cc430afff0f Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 13 Jan 2022 19:51:33 +0100 Subject: [PATCH 10/47] feat(optimistic): add maskbox contract mainnet --- packages/web3-constants/evm/mask-box.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index 2496977531f6..b4ac4ae1bfd4 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -12,7 +12,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "0x9D205B3A1B2724d545Ca7e3717ea629b9844401a", "Optimistic_Kovan": "0xdb93ccd481012bb5d1e2c8d0af7c5f2940c00fdc", "Optimistic_Goerli": "", "Celo": "", @@ -31,7 +31,7 @@ "Arbitrum": 0, "Arbitrum_Rinkeby": 0, "xDai": 0, - "Optimistic": 0, + "Optimistic": 2283229, "Optimistic_Kovan": 0, "Optimistic_Goerli": 0, "Celo": 0, From 406a1437891efee662a5c78c283f0174734bff4d Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 13 Jan 2022 20:34:43 +0100 Subject: [PATCH 11/47] feat(optimistic): add mask token address on optimistic --- packages/web3-constants/evm/token.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index f2e88efb518e..0bf269f46a89 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -164,7 +164,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "0x3390108E913824B8eaD638444cc52B9aBdF63798", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", From d25c186f72b1073fc794a3e87b984d71f3716fc2 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 13 Jan 2022 21:15:30 +0100 Subject: [PATCH 12/47] chore(optimistic): fixed trader plugin --- .../components/AddTokenConfirmUI/index.tsx | 1 + .../src/plugins/EVM/assets/optimistic.png | Bin 6983 -> 42536 bytes packages/mask/src/plugins/EVM/constants.ts | 2 +- .../Trader/SNSAdaptor/trending/TraderView.tsx | 2 +- .../src/plugins/Trader/helpers/uniswap.ts | 2 +- .../wallet-network-icon/optimistic.png | Bin 6983 -> 0 bytes packages/web3-constants/evm/token-list.json | 2 +- packages/web3-constants/evm/token.json | 2 +- packages/web3-shared/evm/assets/chains.json | 12 +++++++++--- .../web3-shared/evm/utils/chainDetailed.ts | 2 +- 10 files changed, 16 insertions(+), 9 deletions(-) delete mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png diff --git a/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx b/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx index be023076b0c5..b477b89bae91 100644 --- a/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx @@ -53,6 +53,7 @@ export const AddTokenConfirmUI = memo(({ token, balance, {t.wallets_assets_balance()} + {console.log(token?.address)} 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 X0MW`4|Y2yS8P`gIHS$_6`>td9_+ac|?% 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 literal 6983 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 Xw&~ctym09{b&9wr!_U7upDp|s=^d~> diff --git a/packages/mask/src/plugins/EVM/constants.ts b/packages/mask/src/plugins/EVM/constants.ts index 06fa6cdc0b9d..1aff2b3b207b 100644 --- a/packages/mask/src/plugins/EVM/constants.ts +++ b/packages/mask/src/plugins/EVM/constants.ts @@ -154,7 +154,7 @@ export const PLUGIN_NETWORKS: Web3Plugin.NetworkDescriptor[] = [ type: NetworkType.Optimistic, name: 'Optimistic', icon: new URL('./assets/optimistic.png', import.meta.url), - iconColor: 'rgb(254 5 33)', + iconColor: 'rgb(254, 5, 33)', isMainnet: true, }, ] diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx index f95b935300e5..b9e45e56b823 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx @@ -205,7 +205,7 @@ export function TraderView(props: TraderViewProps) { const isSwappable = (!!trending?.coin.contract_address || - ['eth', 'matic', 'bnb'].includes(trending?.coin.symbol.toLowerCase() ?? '')) && + ['eth', 'matic', 'bnb', 'oeth'].includes(trending?.coin.symbol.toLowerCase() ?? '')) && chainIdValid && tradeProviders.length //#endregion diff --git a/packages/mask/src/plugins/Trader/helpers/uniswap.ts b/packages/mask/src/plugins/Trader/helpers/uniswap.ts index ae9ba1b47d7e..b6aff625ad43 100644 --- a/packages/mask/src/plugins/Trader/helpers/uniswap.ts +++ b/packages/mask/src/plugins/Trader/helpers/uniswap.ts @@ -101,7 +101,7 @@ export function uniswapPriceTo(price: Price) { export function uniswapTokenTo(token: Token) { return { - type: ['eth', 'matic', 'bnb'].includes(token.name?.toLowerCase() ?? '') + type: ['eth', 'matic', 'bnb', 'oeth'].includes(token.name?.toLowerCase() ?? '') ? EthereumTokenType.Native : EthereumTokenType.ERC20, name: token.name, diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/optimistic.png deleted file mode 100644 index b6f505ed22148c3a3ca83c11e299253deaca8848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6983 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 Xw&~ctym09{b&9wr!_U7upDp|s=^d~> diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index c163fbb89f6e..2daad01fd4a6 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -25,7 +25,7 @@ "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/421611/tokens.json" ], "xDai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/100/tokens.json"], - "Optimistic": [], + "Optimistic": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/10/tokens.json"], "Optimistic_Kovan": [], "Optimistic_Goerli": [], "Celo": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/42220/tokens.json"], diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 0bf269f46a89..f9c5cb71b78a 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -810,7 +810,7 @@ "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", "xDai": "0x0000000000000000000000000000000000000000", - "Optimistic": "0x0000000000000000000000000000000000000000", + "Optimistic": "0x4200000000000000000000000000000000000006", "Optimistic_Kovan": "0x0000000000000000000000000000000000000000", "Optimistic_Goerli": "0x0000000000000000000000000000000000000000", "Celo": "0x471ece3750da237f93b8e339c536989b8978a438", diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 7dc72e58e5ef..77bb32e9fe6f 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -323,7 +323,7 @@ }, { "name": "Optimistic Ethereum", - "chain": "OPT", + "chain": "OP", "network": "mainnet", "rpc": ["https://mainnet.optimism.io/"], "faucets": [], @@ -335,9 +335,15 @@ "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" }, "infoURL": "https://optimism.io", - "shortName": "oeth", + "shortName": "op", "chainId": 10, - "networkId": 10 + "networkId": 10, + "explorers": [ + { + "name": "optimisc", + "url": "https://optimistic.etherscan.io/" + } + ] }, { "name": "Optimistic Ethereum Testnet Kovan", diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 546129fde5e5..d6b198811baa 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -105,7 +105,7 @@ export function getNetworkTypeFromChainId(chainId: ChainId, value?: boolean) { [NetworkType.Polygon]: 'Polygon', [NetworkType.Arbitrum]: 'Arbitrum', [NetworkType.xDai]: 'xDai', - [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Optimistic]: 'OP', [NetworkType.Celo]: 'CELO', [NetworkType.Fantom]: 'FTM', } From 250456c5c21d068719c4c5af2d83641d0554b58b Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 13 Jan 2022 23:45:15 +0100 Subject: [PATCH 13/47] chore(optimistic): rename optmistic to op --- .../src/pages/Labs/components/SwapSettingDialog.tsx | 13 ++++++------- packages/dashboard/src/pages/Settings/api.ts | 6 +++--- .../Wallets/components/AddTokenConfirmUI/index.tsx | 1 - .../extension/background-script/SettingsService.ts | 6 ++---- .../Trader/SNSAdaptor/trending/TraderView.tsx | 2 +- packages/mask/src/plugins/Trader/helpers/uniswap.ts | 2 +- packages/mask/src/plugins/Trader/services.ts | 4 ++-- packages/mask/src/plugins/Trader/settings.ts | 4 ++-- .../Trader/trending/useCurrentTradeProvider.ts | 4 ++-- packages/mask/src/settings/listener.ts | 4 ++-- packages/mask/src/utils/native-rpc/Web.ts | 4 ++-- packages/shared-base/src/Messages/Mask.ts | 2 +- packages/web3-constants/evm/token.json | 4 ++-- packages/web3-shared/evm/assets/chains.json | 5 +++-- 14 files changed, 29 insertions(+), 32 deletions(-) diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index af70dd9cf952..05b20541436d 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -9,7 +9,7 @@ import { usePolygonNetworkTradeProvider, useArbitrumNetworkTradeProvider, useXDaiNetworkTradeProvider, - useOptimisticNetworkTradeProvider, + useOpNetworkTradeProvider, useCeloNetworkTradeProvider, useFantomNetworkTradeProvider, } from '../../Settings/api' @@ -60,7 +60,7 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) ] const fantomOptions = xDaiOptions - const optimisticOptions = [{ label: 'UniSwap V3', value: TradeProvider.UNISWAP_V3 }] + const opOptions = [{ label: 'UniSwap V3', value: TradeProvider.UNISWAP_V3 }] const celoOptions = [{ label: 'SushiSwap', value: TradeProvider.SUSHISWAP }] @@ -110,11 +110,10 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) onChange: (value: string) => Services.Settings.setFantomNetworkTradeProvider(Number.parseInt(value, 10)), }, { - legend: t.labs_settings_swap_network({ network: 'Optimism' }), - value: useOptimisticNetworkTradeProvider(), - options: optimisticOptions, - onChange: (value: string) => - Services.Settings.setOptimisticNetworkTradeProvider(Number.parseInt(value, 10)), + legend: t.labs_settings_swap_network({ network: 'Optimistic' }), + value: useOpNetworkTradeProvider(), + options: opOptions, + onChange: (value: string) => Services.Settings.setOpNetworkTradeProvider(Number.parseInt(value, 10)), }, ] diff --git a/packages/dashboard/src/pages/Settings/api.ts b/packages/dashboard/src/pages/Settings/api.ts index 85e67e317c94..c3fb038b7b6b 100644 --- a/packages/dashboard/src/pages/Settings/api.ts +++ b/packages/dashboard/src/pages/Settings/api.ts @@ -43,9 +43,9 @@ export const [useCeloNetworkTradeProvider] = createGlobalState( Messages.events.celoNetworkTradeProviderSettings.on, ) -export const [useOptimisticNetworkTradeProvider] = createGlobalState( - Services.Settings.getOptimisticNetworkTradeProvider, - Messages.events.optimisticNetworkTradeProviderSettings.on, +export const [useOpNetworkTradeProvider] = createGlobalState( + Services.Settings.getOpNetworkTradeProvider, + Messages.events.opNetworkTradeProviderSettings.on, ) const BASE_RUL = 'https://vaalh28dbi.execute-api.ap-east-1.amazonaws.com/api' diff --git a/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx b/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx index b477b89bae91..be023076b0c5 100644 --- a/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/AddTokenConfirmUI/index.tsx @@ -53,7 +53,6 @@ export const AddTokenConfirmUI = memo(({ token, balance, {t.wallets_assets_balance()} - {console.log(token?.address)} ) { export function uniswapTokenTo(token: Token) { return { - type: ['eth', 'matic', 'bnb', 'oeth'].includes(token.name?.toLowerCase() ?? '') + type: ['eth', 'matic', 'bnb'].includes(token.name?.toLowerCase() ?? '') ? EthereumTokenType.Native : EthereumTokenType.ERC20, name: token.name, diff --git a/packages/mask/src/plugins/Trader/services.ts b/packages/mask/src/plugins/Trader/services.ts index d070f4e4d220..c77b9185e3fe 100644 --- a/packages/mask/src/plugins/Trader/services.ts +++ b/packages/mask/src/plugins/Trader/services.ts @@ -11,7 +11,7 @@ import { polygonNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, - optimisticNetworkTradeProviderSettings, + opNetworkTradeProviderSettings, celoNetworkTradeProviderSettings, fantomNetworkTradeProviderSettings, } from './settings' @@ -84,7 +84,7 @@ currentTradeProviderSettings.addListener((tradeProvider: TradeProvider) => { xdaiNetworkTradeProviderSettings.value = tradeProvider break case NetworkType.Optimistic: - optimisticNetworkTradeProviderSettings.value = tradeProvider + opNetworkTradeProviderSettings.value = tradeProvider break case NetworkType.Celo: celoNetworkTradeProviderSettings.value = tradeProvider diff --git a/packages/mask/src/plugins/Trader/settings.ts b/packages/mask/src/plugins/Trader/settings.ts index 615fcb27afd3..d00e07f606f7 100644 --- a/packages/mask/src/plugins/Trader/settings.ts +++ b/packages/mask/src/plugins/Trader/settings.ts @@ -88,8 +88,8 @@ export const celoNetworkTradeProviderSettings = createGlobalSettings '' }, ) -export const optimisticNetworkTradeProviderSettings = createGlobalSettings( - `${PLUGIN_ID}+optimistic+tradeProvider`, +export const opNetworkTradeProviderSettings = createGlobalSettings( + `${PLUGIN_ID}+op+tradeProvider`, TradeProvider.UNISWAP_V3, { primary: () => '' }, ) diff --git a/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts b/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts index e3316f2c0f7b..afd648d60d3d 100644 --- a/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts +++ b/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts @@ -5,7 +5,7 @@ import { binanceNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, - optimisticNetworkTradeProviderSettings, + opNetworkTradeProviderSettings, celoNetworkTradeProviderSettings, fantomNetworkTradeProviderSettings, } from '../settings' @@ -21,7 +21,7 @@ export function useCurrentTradeProvider(chainId?: ChainId) { const binanceNetworkTradeProvider = useValueRef(binanceNetworkTradeProviderSettings) const arbitrumNetworkTradeProvider = useValueRef(arbitrumNetworkTradeProviderSettings) const xdaiNetworkTradeProvider = useValueRef(xdaiNetworkTradeProviderSettings) - const optimisticNetworkTradeProvider = useValueRef(optimisticNetworkTradeProviderSettings) + const optimisticNetworkTradeProvider = useValueRef(opNetworkTradeProviderSettings) const celoNetworkTradeProvider = useValueRef(celoNetworkTradeProviderSettings) const fantomNetworkTradeProvider = useValueRef(fantomNetworkTradeProviderSettings) diff --git a/packages/mask/src/settings/listener.ts b/packages/mask/src/settings/listener.ts index 2ccf9e464d0f..5ff4d68b390a 100644 --- a/packages/mask/src/settings/listener.ts +++ b/packages/mask/src/settings/listener.ts @@ -25,7 +25,7 @@ import { binanceNetworkTradeProviderSettings, arbitrumNetworkTradeProviderSettings, xdaiNetworkTradeProviderSettings, - optimisticNetworkTradeProviderSettings, + opNetworkTradeProviderSettings, celoNetworkTradeProviderSettings, fantomNetworkTradeProviderSettings, } from '../plugins/Trader/settings' @@ -57,6 +57,6 @@ export function ToBeListened(): ToBeListedSettings { xdaiNetworkTradeProviderSettings, celoNetworkTradeProviderSettings, fantomNetworkTradeProviderSettings, - optimisticNetworkTradeProviderSettings, + opNetworkTradeProviderSettings, } } diff --git a/packages/mask/src/utils/native-rpc/Web.ts b/packages/mask/src/utils/native-rpc/Web.ts index 82807fd85134..84c19c74c174 100644 --- a/packages/mask/src/utils/native-rpc/Web.ts +++ b/packages/mask/src/utils/native-rpc/Web.ts @@ -116,7 +116,7 @@ export const MaskNetworkAPI: MaskNetworkAPIs = { case NetworkType.xDai: return Services.Settings.getxDaiNetworkTradeProvider() case NetworkType.Optimistic: - return Services.Settings.getOptimisticNetworkTradeProvider() + return Services.Settings.getOpNetworkTradeProvider() case NetworkType.Celo: return Services.Settings.getCeloNetworkTradeProvider() case NetworkType.Fantom: @@ -138,7 +138,7 @@ export const MaskNetworkAPI: MaskNetworkAPIs = { case NetworkType.xDai: return Services.Settings.setxDaiNetworkTradeProvider(provider) case NetworkType.Optimistic: - return Services.Settings.setOptimisticNetworkTradeProvider(provider) + return Services.Settings.setOpNetworkTradeProvider(provider) case NetworkType.Celo: return Services.Settings.setCeloNetworkTradeProvider(provider) case NetworkType.Fantom: diff --git a/packages/shared-base/src/Messages/Mask.ts b/packages/shared-base/src/Messages/Mask.ts index 676ad4997963..d5f07c9e1582 100644 --- a/packages/shared-base/src/Messages/Mask.ts +++ b/packages/shared-base/src/Messages/Mask.ts @@ -35,7 +35,7 @@ export interface MaskSettingsEvents { xdaiNetworkTradeProviderSettings: TradeProvider fantomNetworkTradeProviderSettings: TradeProvider celoNetworkTradeProviderSettings: TradeProvider - optimisticNetworkTradeProviderSettings: TradeProvider + opNetworkTradeProviderSettings: TradeProvider } export interface MaskMobileOnlyEvents { diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index f9c5cb71b78a..be25c0d506d7 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -278,7 +278,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", @@ -810,7 +810,7 @@ "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", "xDai": "0x0000000000000000000000000000000000000000", - "Optimistic": "0x4200000000000000000000000000000000000006", + "Optimistic": "0x0000000000000000000000000000000000000000", "Optimistic_Kovan": "0x0000000000000000000000000000000000000000", "Optimistic_Goerli": "0x0000000000000000000000000000000000000000", "Celo": "0x471ece3750da237f93b8e339c536989b8978a438", diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 77bb32e9fe6f..270af06e5520 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -324,12 +324,13 @@ { "name": "Optimistic Ethereum", "chain": "OP", + "fullName": "Optimism", "network": "mainnet", "rpc": ["https://mainnet.optimism.io/"], "faucets": [], "features": [], "nativeCurrency": { - "name": "Ether", + "name": "Optimism Ether", "symbol": "OETH", "decimals": 18, "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" @@ -365,7 +366,7 @@ }, { "name": "Optimistic Ethereum Testnet Goerli", - "chain": "OPT", + "chain": "OP", "network": "testnet", "rpc": ["https://goerli.optimism.io/"], "faucets": [], From 52e7d8d3df0d73ebd2740c40936588bd82e4dbcc Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 14 Jan 2022 09:16:53 +0100 Subject: [PATCH 14/47] chore(optimistic): change redPacket address to implementer Mask deployer --- packages/mask/src/plugins/Trader/trader/0x/constants.ts | 2 +- packages/web3-constants/evm/red-packet.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/0x/constants.ts b/packages/mask/src/plugins/Trader/trader/0x/constants.ts index 2a304dd09531..f813794fe02e 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/constants.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/constants.ts @@ -1,3 +1,3 @@ import { ChainId } from '@masknet/web3-shared-evm' -export const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.BSC, ChainId.Matic] +export const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Optimistic] diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index bca66b6981da..f7954f3c948e 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -69,8 +69,8 @@ "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", - "Optimistic": "0xdc461a5b7Dd3527612867b08A2cCc87416b44879", - "Optimistic_Kovan": "0x97369fee7db34e0bfe47861f2ec44b4378d13eb4", + "Optimistic": "0x981be454a930479d92C91a0092D204b64845A5D6", + "Optimistic_Kovan": "0x68EDbfA3E564C987FaaAB54f4FD1E7567D4151Dd", "Optimistic_Goerli": "", "Celo": "", "Fantom": "" @@ -88,8 +88,8 @@ "Arbitrum": 909051, "Arbitrum_Rinkeby": 0, "xDai": 18101937, - "Optimistic": 2282786, - "Optimistic_Kovan": 792040, + "Optimistic": 1266143, + "Optimistic_Kovan": 442843, "Optimistic_Goerli": 0, "Celo": 0, "Fantom": 0 From 9b2467045d87cbf626e1b94f3ad522ce0ecaff55 Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 14 Jan 2022 10:07:20 +0100 Subject: [PATCH 15/47] chore(optimistic): change OETH to ETH --- packages/mask/src/plugins/Trader/constants/openocean.ts | 2 +- packages/mask/src/plugins/Wallet/services/assets.ts | 2 +- packages/web3-providers/src/zerion/format.ts | 2 +- packages/web3-shared/evm/assets/chains.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index 3a00daf12b60..fd02b1d5a20d 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -10,5 +10,5 @@ export const networkNames: Record = { [NetworkType.xDai]: 'xdai', [NetworkType.Celo]: 'celo', [NetworkType.Fantom]: 'fantom', - [NetworkType.Optimistic]: 'optimistic', + [NetworkType.Optimistic]: 'op', } diff --git a/packages/mask/src/plugins/Wallet/services/assets.ts b/packages/mask/src/plugins/Wallet/services/assets.ts index 531a8e078b86..40c842d88c64 100644 --- a/packages/mask/src/plugins/Wallet/services/assets.ts +++ b/packages/mask/src/plugins/Wallet/services/assets.ts @@ -180,7 +180,7 @@ function formatAssetsFromZerion( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'OETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH'].includes(symbol) return { token: { diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index 099a5b4ac4be..3253b0ff1291 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -57,7 +57,7 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'OETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 270af06e5520..ccdd78c1d828 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -331,7 +331,7 @@ "features": [], "nativeCurrency": { "name": "Optimism Ether", - "symbol": "OETH", + "symbol": "ETH", "decimals": 18, "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" }, From 359f3a04b8a2343d060d4c2da9b218a7d953ca88 Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 14 Jan 2022 18:02:55 +0100 Subject: [PATCH 16/47] chore(optimistic): change mainnet name Optimistic to Optimism --- .../src/pages/Labs/components/SwapSettingDialog.tsx | 2 +- packages/mask/src/components/shared/ApplicationBoard.tsx | 2 +- packages/mask/src/plugins/EVM/constants.ts | 6 +++--- packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 2 +- packages/mask/src/plugins/ITO/base.ts | 2 +- packages/mask/src/plugins/RedPacket/base.ts | 2 +- packages/mask/src/plugins/Trader/apis/trader/index.ts | 2 +- packages/mask/src/plugins/Trader/constants/0x.ts | 2 +- packages/mask/src/plugins/Trader/constants/dodo.ts | 2 +- packages/mask/src/plugins/Trader/constants/openocean.ts | 2 +- packages/mask/src/plugins/Trader/constants/trader.ts | 2 +- packages/mask/src/plugins/Trader/constants/uniswap.ts | 2 +- packages/mask/src/plugins/Trader/pipes.ts | 4 ++-- packages/mask/src/plugins/Trader/services.ts | 4 ++-- packages/mask/src/plugins/Trader/trader/0x/constants.ts | 2 +- packages/mask/src/plugins/Trader/trader/0x/useTrade.ts | 2 +- .../src/plugins/Trader/trending/useCurrentTradeProvider.ts | 2 +- packages/mask/src/plugins/UnlockProtocol/base.ts | 2 +- packages/mask/src/plugins/Wallet/services/account.ts | 2 +- packages/mask/src/utils/native-rpc/Web.ts | 4 ++-- packages/public-api/src/web.ts | 2 +- packages/web3-constants/evm/explorer.json | 4 ++-- packages/web3-constants/evm/openocean.json | 3 +++ packages/web3-constants/evm/trader.json | 4 ++-- packages/web3-shared/evm/pipes/index.ts | 6 +++--- packages/web3-shared/evm/types/index.ts | 6 +++--- packages/web3-shared/evm/utils/chainDetailed.ts | 4 ++-- 27 files changed, 41 insertions(+), 38 deletions(-) diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 05b20541436d..412852848e25 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -110,7 +110,7 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) onChange: (value: string) => Services.Settings.setFantomNetworkTradeProvider(Number.parseInt(value, 10)), }, { - legend: t.labs_settings_swap_network({ network: 'Optimistic' }), + legend: t.labs_settings_swap_network({ network: 'Optimism' }), value: useOpNetworkTradeProvider(), options: opOptions, onChange: (value: string) => Services.Settings.setOpNetworkTradeProvider(Number.parseInt(value, 10)), diff --git a/packages/mask/src/components/shared/ApplicationBoard.tsx b/packages/mask/src/components/shared/ApplicationBoard.tsx index a7d564f433cf..abcac19574c7 100644 --- a/packages/mask/src/components/shared/ApplicationBoard.tsx +++ b/packages/mask/src/components/shared/ApplicationBoard.tsx @@ -92,7 +92,7 @@ const SUPPORTED_CHAIN_ID_LIST = [ ChainId.xDai, ChainId.Celo, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ] export interface MaskAppEntry { diff --git a/packages/mask/src/plugins/EVM/constants.ts b/packages/mask/src/plugins/EVM/constants.ts index 1aff2b3b207b..fdbb193f77b0 100644 --- a/packages/mask/src/plugins/EVM/constants.ts +++ b/packages/mask/src/plugins/EVM/constants.ts @@ -148,10 +148,10 @@ export const PLUGIN_NETWORKS: Web3Plugin.NetworkDescriptor[] = [ isMainnet: true, }, { - ID: `${PLUGIN_ID}_optimistic`, + ID: `${PLUGIN_ID}_optimism`, networkSupporterPluginID: PLUGIN_ID, - chainId: ChainId.Optimistic, - type: NetworkType.Optimistic, + chainId: ChainId.Optimism, + type: NetworkType.Optimism, name: 'Optimistic', icon: new URL('./assets/optimistic.png', import.meta.url), iconColor: 'rgb(254, 5, 33)', diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 199fdd9dfd5f..e0464c40d586 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -220,7 +220,7 @@ const SUPPORTED_CHAIN_ID_LIST = [ ChainId.Arbitrum, ChainId.xDai, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ] export function ClaimAllDialog(props: ClaimAllDialogProps) { diff --git a/packages/mask/src/plugins/ITO/base.ts b/packages/mask/src/plugins/ITO/base.ts index 3edea2a56486..4abf59617c84 100644 --- a/packages/mask/src/plugins/ITO/base.ts +++ b/packages/mask/src/plugins/ITO/base.ts @@ -23,7 +23,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Mumbai, ChainId.Arbitrum, ChainId.xDai, - ChainId.Optimistic, + ChainId.Optimism, ], }, }, diff --git a/packages/mask/src/plugins/RedPacket/base.ts b/packages/mask/src/plugins/RedPacket/base.ts index 529cd7e638d0..bda115051726 100644 --- a/packages/mask/src/plugins/RedPacket/base.ts +++ b/packages/mask/src/plugins/RedPacket/base.ts @@ -24,7 +24,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Arbitrum, ChainId.xDai, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ], }, }, diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 622cfe6659f4..d774775d197d 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -43,7 +43,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { return [TradeProvider.SUSHISWAP] case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] - case NetworkType.Optimistic: + case NetworkType.Optimism: return [TradeProvider.UNISWAP_V3] default: safeUnreachable(networkType) diff --git a/packages/mask/src/plugins/Trader/constants/0x.ts b/packages/mask/src/plugins/Trader/constants/0x.ts index 8ba697b8817b..172f997d877c 100644 --- a/packages/mask/src/plugins/Trader/constants/0x.ts +++ b/packages/mask/src/plugins/Trader/constants/0x.ts @@ -6,7 +6,7 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Polygon]: 'https://polygon.api.0x.org/', [NetworkType.Arbitrum]: 'https://arbitrum.api.0x.org/', [NetworkType.xDai]: 'https://xdai.api.0x.org/', - [NetworkType.Optimistic]: 'https://optimistic.api.0x.org/', + [NetworkType.Optimism]: 'https://optimistic.api.0x.org/', [NetworkType.Celo]: 'https://celo.api.0x.org/', [NetworkType.Fantom]: 'https://fantom.api.0x.org/', } diff --git a/packages/mask/src/plugins/Trader/constants/dodo.ts b/packages/mask/src/plugins/Trader/constants/dodo.ts index 2a4afbd5514b..ae8773160e9d 100644 --- a/packages/mask/src/plugins/Trader/constants/dodo.ts +++ b/packages/mask/src/plugins/Trader/constants/dodo.ts @@ -8,7 +8,7 @@ export const networkNames: Record = { [NetworkType.Polygon]: 'matic', [NetworkType.Arbitrum]: 'arbitrum', [NetworkType.xDai]: 'xdai', - [NetworkType.Optimistic]: 'optimistic', + [NetworkType.Optimism]: 'optimistic', [NetworkType.Celo]: 'celo', [NetworkType.Fantom]: 'fantom', } diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index fd02b1d5a20d..cdc99d50b91e 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -10,5 +10,5 @@ export const networkNames: Record = { [NetworkType.xDai]: 'xdai', [NetworkType.Celo]: 'celo', [NetworkType.Fantom]: 'fantom', - [NetworkType.Optimistic]: 'op', + [NetworkType.Optimism]: 'op', } diff --git a/packages/mask/src/plugins/Trader/constants/trader.ts b/packages/mask/src/plugins/Trader/constants/trader.ts index 02a57347e4f4..e19b483feeb3 100644 --- a/packages/mask/src/plugins/Trader/constants/trader.ts +++ b/packages/mask/src/plugins/Trader/constants/trader.ts @@ -64,7 +64,7 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Arbitrum]: [WNATIVE[ChainId.Arbitrum]], [ChainId.Arbitrum_Rinkeby]: [WNATIVE[ChainId.Arbitrum_Rinkeby]], [ChainId.xDai]: [WNATIVE[ChainId.xDai]], - [ChainId.Optimistic]: [WNATIVE[ChainId.Optimistic]], + [ChainId.Optimism]: [WNATIVE[ChainId.Optimism]], [ChainId.Optimistic_Kovan]: [WNATIVE[ChainId.Optimistic_Kovan]], [ChainId.Optimistic_Goerli]: [WNATIVE[ChainId.Optimistic_Goerli]], [ChainId.Celo]: [WNATIVE[ChainId.Celo]], diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index 1724019b1cdd..fec31eb8e182 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -22,7 +22,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), [ChainId.Rinkeby]: [WNATIVE, MSKA, MSKB, MSKC].map((x) => x[ChainId.Rinkeby]), - [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism]), } export const MAX_HOP = 3 diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index aa078c9c6995..b8efb88dc5a6 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -81,7 +81,7 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://aribitrum.api.0x.org/' case NetworkType.xDai: return 'https://xdai.api.0x.org/' - case NetworkType.Optimistic: + case NetworkType.Optimism: return 'https://optimistic.api.0x.org/' case NetworkType.Celo: return 'https://celo.api.0x.org/' @@ -143,7 +143,7 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri return `https://analytics-aribtrum.sushi.com/pairs/${address}` case NetworkType.xDai: return `https://analytics-xdai.sushi.com/pairs/${address}` - case NetworkType.Optimistic: + case NetworkType.Optimism: return '' case NetworkType.Celo: return `https://analytics-celo.sushi.com/pairs/${address}` diff --git a/packages/mask/src/plugins/Trader/services.ts b/packages/mask/src/plugins/Trader/services.ts index c77b9185e3fe..22821224b1b3 100644 --- a/packages/mask/src/plugins/Trader/services.ts +++ b/packages/mask/src/plugins/Trader/services.ts @@ -44,7 +44,7 @@ currentChainIdSettings.addListener((chainId: ChainId) => { if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP break - case NetworkType.Optimistic: + case NetworkType.Optimism: currentTradeProviderSettings.value = TradeProvider.UNISWAP_V3 if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP @@ -83,7 +83,7 @@ currentTradeProviderSettings.addListener((tradeProvider: TradeProvider) => { case NetworkType.xDai: xdaiNetworkTradeProviderSettings.value = tradeProvider break - case NetworkType.Optimistic: + case NetworkType.Optimism: opNetworkTradeProviderSettings.value = tradeProvider break case NetworkType.Celo: diff --git a/packages/mask/src/plugins/Trader/trader/0x/constants.ts b/packages/mask/src/plugins/Trader/trader/0x/constants.ts index f813794fe02e..2a304dd09531 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/constants.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/constants.ts @@ -1,3 +1,3 @@ import { ChainId } from '@masknet/web3-shared-evm' -export const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Optimistic] +export const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.BSC, ChainId.Matic] diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts index d4f574a9032d..c489057b03c3 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts @@ -30,7 +30,7 @@ export function getNativeTokenLabel(networkType: NetworkType) { case NetworkType.xDai: case NetworkType.Celo: case NetworkType.Fantom: - case NetworkType.Optimistic: + case NetworkType.Optimism: return NATIVE_TOKEN_ADDRESS default: safeUnreachable(networkType) diff --git a/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts b/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts index afd648d60d3d..097fa6ecd3f4 100644 --- a/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts +++ b/packages/mask/src/plugins/Trader/trending/useCurrentTradeProvider.ts @@ -37,7 +37,7 @@ export function useCurrentTradeProvider(chainId?: ChainId) { return arbitrumNetworkTradeProvider case NetworkType.xDai: return xdaiNetworkTradeProvider - case NetworkType.Optimistic: + case NetworkType.Optimism: return optimisticNetworkTradeProvider case NetworkType.Celo: return celoNetworkTradeProvider diff --git a/packages/mask/src/plugins/UnlockProtocol/base.ts b/packages/mask/src/plugins/UnlockProtocol/base.ts index b658d64c7785..6e54e966d551 100644 --- a/packages/mask/src/plugins/UnlockProtocol/base.ts +++ b/packages/mask/src/plugins/UnlockProtocol/base.ts @@ -14,7 +14,7 @@ export const base: Plugin.Shared.Definition = { target: 'stable', web3: { [NetworkPluginID.PLUGIN_EVM]: { - supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimistic], + supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimism], }, }, }, diff --git a/packages/mask/src/plugins/Wallet/services/account.ts b/packages/mask/src/plugins/Wallet/services/account.ts index 621b40af99db..a6e9da8667ae 100644 --- a/packages/mask/src/plugins/Wallet/services/account.ts +++ b/packages/mask/src/plugins/Wallet/services/account.ts @@ -124,7 +124,7 @@ export async function getSupportedNetworks() { Flags.polygon_enabled ? NetworkType.Polygon : undefined, Flags.arbitrum_enabled ? NetworkType.Arbitrum : undefined, Flags.xdai_enabled ? NetworkType.xDai : undefined, - Flags.optimistic_enabled ? NetworkType.Optimistic : undefined, + Flags.optimistic_enabled ? NetworkType.Optimism : undefined, Flags.celo_enabled ? NetworkType.Celo : undefined, Flags.fantom_enabled ? NetworkType.Fantom : undefined, ].filter(Boolean) as NetworkType[] diff --git a/packages/mask/src/utils/native-rpc/Web.ts b/packages/mask/src/utils/native-rpc/Web.ts index 84c19c74c174..365d5d910edb 100644 --- a/packages/mask/src/utils/native-rpc/Web.ts +++ b/packages/mask/src/utils/native-rpc/Web.ts @@ -115,7 +115,7 @@ export const MaskNetworkAPI: MaskNetworkAPIs = { return Services.Settings.getArbitrumNetworkTradeProvider() case NetworkType.xDai: return Services.Settings.getxDaiNetworkTradeProvider() - case NetworkType.Optimistic: + case NetworkType.Optimism: return Services.Settings.getOpNetworkTradeProvider() case NetworkType.Celo: return Services.Settings.getCeloNetworkTradeProvider() @@ -137,7 +137,7 @@ export const MaskNetworkAPI: MaskNetworkAPIs = { return Services.Settings.setArbitrumNetworkTradeProvider(provider) case NetworkType.xDai: return Services.Settings.setxDaiNetworkTradeProvider(provider) - case NetworkType.Optimistic: + case NetworkType.Optimism: return Services.Settings.setOpNetworkTradeProvider(provider) case NetworkType.Celo: return Services.Settings.setCeloNetworkTradeProvider(provider) diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 660db9ce6b50..e5850eb23341 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -191,7 +191,7 @@ export enum NetworkType { Polygon = 'Polygon', Arbitrum = 'Arbitrum', xDai = 'xDai', - Optimistic = 'Optimistic', + Optimism = 'Optimism', Celo = 'Celo', Fantom = 'Fantom', } diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 0a2a7515436b..c40ec63a5c86 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -32,8 +32,8 @@ "Arbitrum_Rinkeby": "", "xDai": "https://blockscout.com/xdai/mainnet/api", "Optimistic": "https://api-optimistic.etherscan.io/api", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimistic_Kovan": "https://kovan-optimistic.etherscan.io", + "Optimistic_Goerli": "https://goerli-optimistic.etherscan.io", "Celo": "https://explorer.celo.org/api", "Fantom": "https://api.ftmscan.com/api" } diff --git a/packages/web3-constants/evm/openocean.json b/packages/web3-constants/evm/openocean.json index fc2575110fc0..159c7a72dc57 100644 --- a/packages/web3-constants/evm/openocean.json +++ b/packages/web3-constants/evm/openocean.json @@ -12,6 +12,9 @@ "Arbitrum": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Arbitrum_Rinkeby": "", "xDai": "0x934B510D4C9103E6a87AEf13b816fb080286D649", + "Optimistic": "0x934B510D4C9103E6a87AEf13b816fb080286D649", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Celo": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Fantom": "0x934B510D4C9103E6a87AEf13b816fb080286D649" } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 99007d3bd5d0..d7a5b7097d94 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -620,7 +620,7 @@ "Arbitrum": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Arbitrum_Rinkeby": "", "xDai": "0x0000000000000000000000000000000000000000", - "Optimistic": "", + "Optimistic": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", @@ -639,7 +639,7 @@ "Arbitrum": "0x6352a56caadc4f1e25cd6c75970fa768a3304e64", "Arbitrum_Rinkeby": "", "xDai": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", - "Optimistic": "", + "Optimistic": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Celo": "", diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index 5539880afd82..61dad7c605be 100644 --- a/packages/web3-shared/evm/pipes/index.ts +++ b/packages/web3-shared/evm/pipes/index.ts @@ -64,7 +64,7 @@ export const resolveNetworkAddressPrefix = createLookupTableResolver [NetworkType.Polygon]: 'Polygon', [NetworkType.Arbitrum]: 'Arbitrum', [NetworkType.xDai]: 'xDai', - [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Optimism]: 'Optimistic', [NetworkType.Celo]: 'Celo', [NetworkType.Fantom]: 'Fantom', }, @@ -109,7 +109,7 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Arbitrum]: 'rgb(36, 150, 238)', [ChainId.Arbitrum_Rinkeby]: 'rgb(36, 150, 238)', [ChainId.xDai]: 'rgb(73, 169, 166)', - [ChainId.Optimistic]: 'rgb(255, 3, 33)', + [ChainId.Optimism]: 'rgb(255, 3, 33)', [ChainId.Optimistic_Kovan]: 'rgb(255, 3, 33)', [ChainId.Optimistic_Goerli]: 'rgb(255, 3, 33)', [ChainId.Celo]: 'rgb(53, 208, 127)', diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index 7c8f729ef80b..0c4ed520b899 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -59,8 +59,8 @@ export enum ChainId { // xDai xDai = 100, - //Optimistic - Optimistic = 10, + // Optimism + Optimism = 10, Optimistic_Kovan = 69, Optimistic_Goerli = 420, @@ -96,7 +96,7 @@ export enum NetworkType { Polygon = 'Polygon', Arbitrum = 'Arbitrum', xDai = 'xDai', - Optimistic = 'Optimistic', + Optimism = 'Optimism', Celo = 'Celo', Fantom = 'Fantom', } diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index d6b198811baa..3cef59cc1735 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -91,7 +91,7 @@ export const getChainIdFromNetworkType = createLookupTableResolver Date: Tue, 18 Jan 2022 14:59:16 +0100 Subject: [PATCH 17/47] feat(docs): improve docs for evm integrations and add contracts repo --- docs/evm-integration.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/evm-integration.md b/docs/evm-integration.md index 75a7b4d5f010..b528f0e08279 100644 --- a/docs/evm-integration.md +++ b/docs/evm-integration.md @@ -55,7 +55,9 @@ If there is no one deployed [these contracts](https://github.com/DimensionDev/mi - [ ] Multicall Contract - [ ] BalanceChecker -- [ ] Other contracts from the Mask team +- [ ] [Mask Box](https://github.com/DimensionDev/MysteryBox/tree/add_more_networks) +- [ ] [Red Packet and NFT Packet](https://github.com/DimensionDev/RedPacket/tree/add_more_networks) +- [ ] [ITO](https://github.com/DimensionDev/InitialTwitterOffering/tree/add_more_networks) Congratulation! You have done the coding part. From c31470f22a96491244cb7afad7dd5000138e714d Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 25 Jan 2022 02:41:37 +0100 Subject: [PATCH 18/47] feat(optimistic): add jugglerred dex --- cspell.json | 1 + .../SNSAdaptor/trader/TradeProviderIcon.tsx | 13 ++- .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/constants/index.ts | 1 + .../plugins/Trader/constants/jugglerred.ts | 15 +++ .../src/plugins/Trader/constants/openocean.ts | 3 +- .../src/plugins/Trader/constants/uniswap.ts | 1 + packages/mask/src/plugins/Trader/pipes.ts | 7 ++ packages/mask/src/plugins/Trader/settings.ts | 3 + .../Trader/trader/useAllTradeComputed.ts | 13 +++ .../Trader/trader/useGetTradeContext.ts | 14 +++ .../plugins/Trader/trader/useTradeCallback.ts | 2 + .../plugins/Trader/trader/useTradeContext.ts | 14 +++ .../mask/src/plugins/Trader/types/trader.ts | 1 + packages/mask/src/resources/jugglerred.png | Bin 0 -> 196981 bytes packages/public-api/src/web.ts | 1 + packages/web3-constants/evm/trader.json | 92 ++++++++++++++++++ 17 files changed, 178 insertions(+), 5 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/jugglerred.ts create mode 100644 packages/mask/src/resources/jugglerred.png diff --git a/cspell.json b/cspell.json index ca2a10c7dbeb..dbfc363f7e14 100644 --- a/cspell.json +++ b/cspell.json @@ -116,6 +116,7 @@ "jailbroken", "jsbi", "jsonml", + "jugglerred", "juicebox", "kdfparams", "keccak", diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx index 517038b2ea52..bf5fa7e6417b 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx @@ -17,6 +17,7 @@ const quickswapIcon = new URL('../../../../resources/quickswap.png', import.meta const pancakeswapIcon = new URL('../../../../resources/pancakeswap.png', import.meta.url).toString() const traderjoeIcon = new URL('../../../../resources/traderjoe.png', import.meta.url).toString() const wannaswapIcon = new URL('../../../../resources/wannaswap.png', import.meta.url).toString() +const jugglerredIcon = new URL('../../../../resources/jugglerred.png', import.meta.url).toString() const useStyles = makeStyles()((theme) => ({ icon: { @@ -63,8 +64,16 @@ export function TradeProviderIcon(props: TradeProviderIconProps) { case TradeProvider.WANNASWAP: return ( {resolveTradeProviderName(TradeProvider.PANCAKESWAP)} + ) + case TradeProvider.JUGGLERRED: + return ( + {resolveTradeProviderName(TradeProvider.JUGGLERRED)} ) diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index ae2ad672340c..73af7ca6e056 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -49,7 +49,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Optimistic: - return [TradeProvider.UNISWAP_V3] + return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Boba: diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 7cde5749d988..8813ab00c87c 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -13,4 +13,5 @@ export * from './traderjoe' export * from './pangolindex' export * from './wannaswap' export * from './trisolaris' +export * from './jugglerred' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/jugglerred.ts b/packages/mask/src/plugins/Trader/constants/jugglerred.ts new file mode 100644 index 000000000000..9bcf59ce2e14 --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/jugglerred.ts @@ -0,0 +1,15 @@ +import { ChainId } from '@masknet/web3-shared-evm' +import { DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from './trader' +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const JUGGLERRED_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const JUGGLERRED_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), + [ChainId.Optimistic_Kovan]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic_Kovan]), +} diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index 7437010bd077..c420353f5332 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -10,11 +10,10 @@ export const networkNames: Record = { [NetworkType.xDai]: 'xdai', [NetworkType.Celo]: 'celo', [NetworkType.Fantom]: 'fantom', - [NetworkType.Optimistic]: 'op', [NetworkType.Avalanche]: 'avalanche', [NetworkType.Aurora]: 'aurora', [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', - [NetworkType.Optimistic]: '', + [NetworkType.Optimistic]: 'optimistic', } diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index ae337d9f65e2..c90d9574471d 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -21,6 +21,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), + [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), [ChainId.Rinkeby]: [WNATIVE, MSKA, MSKB, MSKC].map((x) => x[ChainId.Rinkeby]), } diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 88738cdfd33a..b3cacd24c5c5 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -61,6 +61,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) @@ -128,6 +129,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://www.trisolaris.io/#/swap' case TradeProvider.WANNASWAP: return 'https://wannaswap.finance/exchange/swap' + case TradeProvider.JUGGLERRED: + return 'https://juggler.red/swap' default: unreachable(tradeProvider) } @@ -207,6 +210,9 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri case TradeProvider.WANNASWAP: // TODO - add WannaSwap analytics return '' + case TradeProvider.JUGGLERRED: + // TODO - add JUGGLERRED + return '' default: unreachable(tradeProvider) } @@ -300,6 +306,7 @@ export const resolveZrxTradePoolName = createLookupTableResolver(`${PLUGIN_ID}+tradeProvi const openoceanSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+openocean`, '') const trisolarisSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+trisolaris`, '') const wannaswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+wannaswap`, '') +const jugglerredSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+jugglerred`, '') /** * The general settings of specific tarde provider @@ -161,6 +162,8 @@ export function getCurrentTradeProviderGeneralSettings(tradeProvider: TradeProvi return trisolarisSettings case TradeProvider.WANNASWAP: return wannaswapSettings + case TradeProvider.JUGGLERRED: + return jugglerredSettings default: unreachable(tradeProvider) } diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index 3a849211b895..f347dc358286 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -236,6 +236,18 @@ export function useAllTradeComputed( const wannaswap = useUniswapTradeComputed(wannaswap_.value, inputToken, outputToken) const wannaSwapEstimateGas = useUniswapTradeGasLimit(wannaswap, TradeProvider.WANNASWAP) + // Juggler Red + const jugglerred_ = useUniswapV2Trade( + TradeProvider.JUGGLERRED, + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.JUGGLERRED) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.JUGGLERRED) ? outputToken : undefined, + ) + const jugglerred = useUniswapTradeComputed(jugglerred_.value, inputToken, outputToken) + const jugglerredEstimateGas = useUniswapTradeGasLimit(jugglerred, TradeProvider.JUGGLERRED) + const allTradeResult = [ { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, @@ -252,6 +264,7 @@ export function useAllTradeComputed( { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, + { provider: TradeProvider.JUGGLERRED, ...jugglerred_, value: jugglerred, gas: jugglerredEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 77533cc926e2..d8fc5a358f33 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -21,6 +21,8 @@ import { WANNASWAP_CUSTOM_BASES, TRISOLARIS_BASE_AGAINST_TOKENS, TRISOLARIS_CUSTOM_BASES, + JUGGLERRED_BASE_AGAINST_TOKENS, + JUGGLERRED_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -150,6 +152,18 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: TRISOLARIS_CUSTOM_BASES, } + case TradeProvider.JUGGLERRED: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.JUGGLERRED_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.JUGGLERRED_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_FACTORY_ADDRESS, + AGAINST_TOKENS: JUGGLERRED_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: JUGGLERRED_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index 0b1efad1cc0d..5aad0013a366 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -100,6 +100,8 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.TRISOLARIS: return uniswapV2Like + case TradeProvider.JUGGLERRED: + return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 3db649333430..4f62ce4255c7 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -21,6 +21,8 @@ import { WANNASWAP_CUSTOM_BASES, TRISOLARIS_CUSTOM_BASES, TRISOLARIS_BASE_AGAINST_TOKENS, + JUGGLERRED_CUSTOM_BASES, + JUGGLERRED_BASE_AGAINST_TOKENS, } from '../constants' import type { TradeContext as TradeContext_ } from '../types' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -171,6 +173,18 @@ export function useTradeContext(tradeProvider: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: PANGOLIN_CUSTOM_BASES, } + case TradeProvider.JUGGLERRED: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.JUGGLERRED_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.JUGGLERRED_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_FACTORY_ADDRESS, + AGAINST_TOKENS: JUGGLERRED_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: JUGGLERRED_CUSTOM_BASES, + } case TradeProvider.OPENOCEAN: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index fb0d655737ee..6be0f0c25ce2 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -75,6 +75,7 @@ export enum ZrxTradePool { PangolinDex = 'PangolinDex', Trisolaris = 'Trisolaris', WannaSwap = 'WannaSwap', + JugglerRed = 'JugglerRed', } export interface TradeComputed { diff --git a/packages/mask/src/resources/jugglerred.png b/packages/mask/src/resources/jugglerred.png new file mode 100644 index 0000000000000000000000000000000000000000..286d9f4c81224f374f41317eee8069c2da19bd5a GIT binary patch literal 196981 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

YJ#&twVB_)D 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≀Ck zqHj#)Am+E-%P=^{jQ)$ShV{}{B^gh-?NZ@1v83xQwjncj9Sg$?w!o{LJ;k$V82D%z zv4@78Vm~)wE zBtn;tc?v!pbS$a%UNtIqn&!r^HUvB}8Xh*32uv+CNe@p3KGsgw9Zn16eKg0PZEqld zSGixd`SdY)LqZr`CAagBm9G?pg=1zQGobFZ&BO!Z>h}0LLq>1+DebAxB_CYy11cg5 zNr}LWeB|s!B5p|^5Tw68;*5cv{YjQJR)>O=uku~o`mGi9a3*|GtCyQW3C{NlQhBF2>@ph$oS9J>l4ufFFW_#D`ST&&NSbWLcY7evImjwisNQ&%z_Kexf7@QoBI7DIr{R$Iohd_Q zUe6sNq~ucjb)IMIB_hHlZb+Nmx4<}w!|EiH=$+`Zzj$UNQu&X4;2Tzo*KlgO$m)lV z|9-){Shj2!^6O&{(pTfphb*u^=V; z6JTlc*+>~Uc!9D|3o39Hv6~X1A@O;S8}jR9W`~zNC@_d;ig6_S5Q=^pGzPo>ee0^g zx@io`*iIYBYS_*1d64>Z3<{|vK$#DaM#EN)0#2|yRRy{L1l03 zwu2W~1#?9n)pzRkN0Lgdm#2IpLDWyIoD9Go)&e;RX}7f#)Vg<$G^z58bcGgl>tFR- z)~*?-Q@$W*2#0Rx47bnYD@}zMWwLwOjY=9f=BUQHk&GU!i1WPi5gWc@=$=g3P4#_b zbQLg9ki=0y%w2?sD)lP89FIC{6xZ!|H+%WDVcLh|5v$aVN;di~KL~Y>O^&e9D#Z8y z4-V~te9(Qy>+eL=+HniCl>YE=o2K-=h{NIu=xzvMq1DZJHVWXna`aTM_k4n#M9(kP zC$3GAk<=}@_X(M*{PEF9`PWPFX@=P}*(WKjJb!4GZ8PhHd7^(2S4M5qdKG1xS%eQH z0wPvulbHz9Ot98ppdB@==M?00d#x0F=TiX`q*PlE&UvT;3F2;;n#cwr%fT{cn2nLE z0ZQOJ>wiupG;ge*kq;&Mw$-#2E!~Mu|y?TwlP~eEh8N&VOfs*SN>JI4x1k zA0FtBzfUlLSta2mNX+iO&0$ErE)W>B&EXx4Vx zQ=ui@A!CAt3DT#|%2BZzZ1{}-=_PsBnZ+5fzKN0mJ-BWRff~KN7dFGqvaZ!MbMq{U z;iaQB^VJ$)KcQie^=ExH_0~@_v2M)z@p_5QJ5nk{<$HIiF`wiNzg(j3B87!~&KCj4 zBs5-=$@$Bh;j-$GvCDVGQjs{kTOodIyg{4^lk9Sa4 zADe@`N@*?s>;By5bMspk#90wNR=zDCv-)u~pz5NB$N1~KH0pSxhbG3@k3>9cik9OD z=0bnxkA~8SZvE2o4^aM$ppH!94})YaDXpaVI$h(!V{2{J=ift#>i+;t*J?}w-y!_C zoiF){d>>{ec+v`69vH@}f28MdF^UzCbUWX$*)lAuSPz;&G_j@=a0VqRL6vvdq?ak* zf83nuDj>WBrAy9Ly_CPe8J(Et)|R zUT&~{1aKpCzeSj0M~t!+O=Zy&`~v4`b^P;Tz>KPU8u*xcDJKmU#avQx6t=Q%BE|h``$}F!JvlB`X13I=`CgHdlyxS zU!JRc&Ef+&YXk10jlIi*4i|aTh6}fAplXE9oD|L>#iTnXaePCI_|`D+%yTORpQntsrEx%J|H2M-dwg zsnjw`PX5o8aR1;#^a(Mu6Q0lfCeq^6`TRXTU|S(ZQIJ4+xI1;iM4M|r z4~57s`-hDSu01^qYCoz-ai7SnM}1m5q#M8Tp0Cbz+nDq^a zCImr`gMPLfx@DCQS^Yy? z$s*mk6(Ntg9IpBK!W`FjEv`-=LZ4ayR};wnE>%DW_pr1i#ZD#p-vAOkjb2}S#L*KaN_Y9o2AVt!G~Xg2S#5qI?OCMXP=+0{KVYxZtuzP*^;Zm$7U=f z6SgV1{X>9*x!lIOmiH0P)WDN4WCIoZERPbs2GIf)tmLI9q4E7|Ioz6+OOu!R4NET_#yEuPm(qR9X(RYGUQo778#(o))y`1U z4K7y95n?^0U9$KiF7j6~f_;Yzv+H_L1jRa0w)6S zE7i!plfRzj_g|Te&L`ASB#LJ0m4f}BW@NuH2b2XEH&s_LPjbrXe9wkAY#98N%zT^0 zJ@Fy1wt><&of=;rw??`BjW*eRzAzw4LBp@FhTQ8e0y4d;!*%i>d(-z_X1_#Xg zZ7%EzfjJ#Mk5GVPY<&q);~Uk%q^vvD;gvnq3yMu-%Q%Qnu_Sef@W@jy%5^%&&F|o+ z=gU67+}!`vKmMB{qQ|B}D|m#`efGN%`gMN08pGusmk66_P&MIjKt@D_hx4t-YJ>!* z8&0(fX)-@9F`utVvtIZHA&!D^Ft-)wd8yX(0w(0#23MZ4u+cDKXX|3QYmql+KI2#b zm{Zw`WRgksxNV$Ir~wY?x^uEd+_K(a`;EH;?ZQ>nI8sqsCF0`5Cps_wCiV^vlcX4n z1^=SEdj$jw#~-c#NXbcNN^Rt5G?Yij2uK+^XH;yPk9=KI@V+_b>9x<(*ug{R4<6eh!|4{IHGb&ooG0qjZg1M zNV9AzHgiTE%t?Rwv2c}MX>k$-sG+2P4qBVKGhPH%gT8&)zgk8GfVANf)|&I-Iu198Us zaKG5VG}*KviqXKM7LowA>k-XX`B#&g5aQIo>PJc(CW~SefI~H<6}v3~(oaMOWdW%* zFZl>#1>dpGJkyqbZ?Q%9^7D3R12A-%T^a9%&0`_cG(n>)1OBEh7(d)u+k{Npt`MGd z$kCWp(;yBrGdm#^eyX#prZHS}gg%(JLYf~m`=7$?8dF2tZ&(S>>u)W*F5C_^$U9CO z2LjqJd2n&Rg48#%6+TezhYn4eY|zzQ+N(JViK~&2N>N9)zQ--dIu@TJw-Zd<`>m@y z$j|tvFRK5e^Yg5ggmAzNFB7s45cOq#i?Te!aQE4dbCUhqPNM>zNgiKQL#pB2T$=4^ zxh?a1s8PM52Ot(pKO|@qJZBNcBE9I^=9bJm{naDI$v8of&vf|kV`m6AsDlb%T0rU$Mwy+zbT%Un=Y1mw1%nr$OI>E^PlR5 z)uh8HVM%2Z7x&nNj`D<#2o%cEbpIYvRfFY}cjIxy4)qTb!68=B!Tf3NT+ovU00h*! z^##<)M5y`cI~$Nk&BtXB@w~U!>E+e6h$gU9`&T64b5VO1B2c;h&qsSqDXgzaJHm#q zCDVFJNwb5nryh)GLqCssRuDWE?8HoQqZ6jNm#9Xa8SZ}I=x7RX;JS?Gy1G@FJ&R(h zq`99A#ptXe!MDf_B8!m!ibsSu67_uE#((b|giEYM9D##FBoc8p6G8JU+-AsgJ45>k zMI@9zy3x){E0SI4mOE7QArtF0gM`-H)tIDsx_98Tb^4-|DJqATE%zA86I=e9_QT5* zvi?i!BW-9(!|vNJY5^dg4r?Btb7W}1iIhT53m(1zN;*h$8DJ|}$wpLC;aeXX-j*** z=$$*X5jaq67&O0(gQ~V)cY6jOcml?FZq#;?A?C^4c>X)N?E=O@E6U!>#DOWX(P92m zBVD}CNVToKdafC+9xE}On2-I;^q1Z@_b!H4freJp2p}LAr|mqby^}fcF(2VMK6?FV z|GwRrMZ@h2No+b~4jR|x-Rq2IeK^ca91klFqtnE4MK@HR{li%QgyZz4;8c<`8y@d$ zZ~^#({khE9i#qtp1@pm5`D3{BrTL3nq5M*-t53O_qgV};Kk%eYg7qd%v6nitBzjWdMZ_6Ph!1AFFc+2bm=;?%mTHA0p0T1D=qp8>|k zlb7U#?Obmr)5+-zYs3ZA35?PXfQlSVfO!;k8{3U#EX|7 zFg0WX_ullD_dzcp3Pyr@3BuPtA^@Tr8r_m~(ew-72VUMq8HBQO__*u(iM>0P&?Cyk zrkAgdMiYKxtz`2M$Z>LM#aH0v^+ifvJGouCD!ws3BgAUm#&uTW0g_5^UaqxSCaN8S zRj{&XUE%rh@IRoN#`-B!Q8kh<#p^zF;KO%h{d^bFA_wOiJ=@@-M9%cob1I5pMbi)x zVZ!xO9Q!?`R!`WHraI|MH|{Yix`UpOu$f?p{m=NW3Vf|Z;mmlw@vi}c6ErivfR#76 zXq8p#iF2!;9G?l-=SC7gCw?>xk(>Q#QhA%qzvurquNu9kL7-|MN|EA@<)0VZ-bvxmjbR85Q`7mi4Xp!1gX=`57 zR8PoBx7Pe|P-zhPQOw%F>;4lvn6CWp*4NqU?PDEi0=9t6RwhMSjhimn7USbY|AsU( z%rVk#!akm?8{f6z@`gole+u9Yh#CUJ`xfD)Yd|d-bVd!~0t6fbTw)%H?)ZNvR~t#H zW(<-(CWDt_7WWmN?`u^w+DAi~)>%l^#VQtR5vXwU0>pdzB zsEhth&Q^EdpgEc@*PF?!ZBLRa?#)ND@YekH;Gdh%40biRC)=nMeHjU3_y7(5Z%qe` z;KipZ+;>1Pqfx_EPRml1fSIUH^$nNBn_@fCCx0DucpmBd-^uXe{`u1YQ8>PnSmajT zxO2*QuLao@%T2*npoWx47>d+C>mV8|pW(OZqo0@kDrwB_Xg57YO=S8L2bc^>&)e_m zdfHuKhEK77XQ=h?8=w5&&|TmzrVr-)fD-b6tB#>(-!z_Q?cvp9{9Ipb2?5x9-LRb* zU8})I1~<#Ht+Y_|IcIc!A79Q5Bfl{H%;#PR-Sgvf#m*bLi!*u8I-$%izG&UbJFdSq`q z6{>QDL2rYL$o|YtTAMBbW};i;rWBr9r5{|qNfl4aG=6U|Z33+XOWv{PQTV?4@VxBm z!}`RGXK)d)(TpBx;PB8$ehcNDUzmT3^L~k=^m1wr9HGL~?~vl)Q+^Tz*AsxoKa~eHdsop<<>Z{bX}G zP#ljylV_R=4;L`0FNTeq}7T>`e(~Y`s=+AG0 zf1diwI{$FB{?%c_Jl2h(|3h~CDR&Ssu!bPaHgv0fA1-QebXIoDAf6nem`Aq%3yUB& z+IU9URjZ{oZ*CzBrk4YG_XgW1ZEXz98y!IRdjS|IqdrahSMj(3x`W{l;6(R0YE+PP z$gf~XPAI2*8MPIFmO2+RVMN29PYZ;|ACOSVsYSU8B zN-H@ja|>vTK6zI>>v5}}uZWy%bNlU~o{#K*BYe7meEnbOKFsP6yjQZ=EVc?SGqYce zPTVfE7NUVvvus7nD;>XVUTQD>r4izH@}smE*Gw~o3i6Ci++K4LW)1YIrsyJ;B#mMv z=IfVBE#n4r!)*@^>e-V}f=~qlRKJQd#+>#q0=)IX3m)?xO@E9piT=EI-7Farr&>&c zQJ27iyBM!LJ7|Mj2i6s1w&8n?C;~*P9d{(ZtYx^=Hyf0HTn>tsX^VkvEBdo0b{t`R zxCLDT_9-$sh-25OV$@m6(Q~ z{kcOcx(du}7u&-|%0C*vFg~rW1n~pX{azaMkv*7I(#|scB%({VTKSn_ct4T7*%kVT zvO+-CREuc(XPSzomfF`13In6Za{?7C(R2Q3q zsybSbw1jHqWWpZsdf!C8_@qaYd$vgk@n(pv?o2?p`q)_iJ&fi~5pgK^!bI&$HAx|W zD#_-EGWo~2>KOyUwTId`!8~6)YR-Stof3gVNxTjDOS1~P|jE!-y*Mp}GjTmKfKDbVi|A~S*s)=!S zh7SJV9jx-X+;b7~PkZIz@cCEe(a+l_#D6YS0#zVPm!V!dcz1-+AnI<`&4<#guC^c@ z2#5+&EB(OuttthMlB32#y>#sVc>S5ZJlaAX3JMPTi})BD;Y6{=cx}O6GLv89WaRCG zuTs4sjS`8A9sGr3w@~;GJGd*swji4K-^L~6fVtr6Nk}Rk<6IMyJRYfcM4|!XK>Q~! zudKEd{0dTvdv=kTo!cWl*c8=zI<`EaXfV$81dlZT@^)g-;oyg7^z;9R&Ej{}eB zhv071s9-u3+i<5{o(a?LhnNjw!{KO^=k)z=fmzq-D%&x1KjfuN^qI?Jvvv#__X~`^ z{ut(sqFrQQuMku=q|(-a)uEVMKYUYAE7iStS3u=UhQciWqAsL6zjzEBgI51brL?a5 z5Ntl5K%1cHeha{Fmao8IE;s90@9@usLJEC1veTWo@yw-q>*)Jqg&$`J~ON&cCY7a+iJKh-bA$aLn!pHd#&xC(d_ z@A6e{=anUHQ>_RUMFLiDwVX6vf(J{!O*O@8dp|HV12%@VxZ-kx%#@3~{-+T}QuNIn2N)OOG=YP@f7|zu&nrErwn6 z|ILqP1+;3pP4=TpI#3pLn>W;zpq$YR+}2y+iANLG%ZaNvihfp#%hHuu8?wyF%qe72CJhgnOSaeaMzEPAzCLrLXqPirruKllIYJj`UecwI2NFC zFrNh&YX8jy-ck5jHigu}&V@!ZczEwJ9uuJXg%kjjXkb~GUf#b^WxDSI18g#{2$f5t zHCb9RMgsmeD=Q8m;O1Mi1=d4g>-C8s+RM0|{(#`4I<4Ig3vcwJf0MloITeLF%O)1Q zWq{Lt$GYsC{8}qoI`g&_<%ezpih5vG5$+WP#f$F#vDgQcpmbY zJ7SW6ddp!+J)YY7d@>an{hoq_W|EKB!$MGn%J1J5pd20IlZ>>-itFPqx;@8{y&omY z_*%#lsPVn#*HpnLy8Ip5OG2OL^QInFi2?%C>8`kF^ck&nYOsDOtMS zs*;L@pm`1QN&R68@W@s{86gG{(lJ~+;4dz5T}RhmI(93);C{l{@3E0AZv<*NMV)l(g;$uP&31?ngIesJHBg8g zXQfi&jkXu}OT%P9OS_b4ab$PYZt+p(FY#YC5nr)^heZ3pOdAr!r@PqfQfXm9&XT;h zf(N*?uL{-ko?)-wRvz>3yutu29S%?HH^)EM@TreZyABVX$%M}W-(mn%+tq2oa8Q8a zvfN^tPkJyeQ~c6Jm}X^K@otWOv+c2`PQ!!T=Y{f-+*?fYa~Ac^g#V$x2fnJ9NmuMsB` zcZIbCpCTmO-yk={AV+cQ6TupaojVI@brnn5e(Gy`zC6nZPw-3y(QVFGKggYT{Ru|n z=}OJFFT(trH4J29<$~o*1tlM-E3N##6!XbC3H}v%8Z1(Ewx=43=vKl&9a?h2Vf3Fs zO|=5vJ$x?WaJJuYvX#2fJ|Qq6BD^f}v)x(NuL^VX(R!~cNVu0Pz%mbqE8dNo@Z8|0 zJ7(g!u*<3^l#%Q%jP+sZE^*G(RhKbd_=_SClTY4f%c!2^Zm3`Rwj&dn=sxGN=f@)# zE|XfOGm2=kjOonE9DxAEw1WtUK}T4@kZJa@fS80mE_=^ymLj~eRV#so|yv$MZn0wxrkekoLNw=vCk z5<*`ZD1J7atxHh2fhTxNNn4%>0g9#iu%KWzOL0k-Er#ktN8?yB?xg7K?B_o&!wb`Y zjg5@zio!LLg4qVI^AO_ziedvouvyEz?%yeH`Gv7&JmL)~3)Msb4gncN4u z9B;_=!9v*RgB#g~88Q03$@i0Siq&`iCpmc6(G0SrN7+Mc{YPm?IDXmb6bAHIm=V`oF*$3r3q$Wt7OFmwGs)NJ z{t3`eV8(|0wDj72^(f}<`m}8I0Z$71H>C!42`mlm^BK!#h$|a+Tbd_q?f5Iz_e0=d z_pe9fqj?ES*Vi1TljQHLDd|qGPwS6Yw9%0i59@(C`Z52b>8c;1?7HB>(w)*JB}jKK z9nuYw(kUqoyMTa%lG5EJNK1osHwY>%-Mz5!@&54r3(tA(+&gp5oXP)XueSJxVLnk~ zHI2+9C(LVWc7B*|rkK{7Q0!)}$-|O=vNz>#BF-Li$#&#GQ0{7mH8gTJ+jO1G>uT zuIarLwW@6mD*vxMF$6MU!yTS;_S%1f$A&U=QiTB~6pU5QwMT4pS(kRG2RP9dYnk69 zsx7&#GQq}Lyb9BAQnIc>(fjVto1VRbO;SP8T-}|I1bDRMu~Dj2_~A{t#M8lV!x274 zZ9^oty-k`EQZN19xf!#W3EX_kUdv!<1OHetPOMv~Sk@jD-pT#wkk5*2vk?BWj&R3K z0mnBWc&ZRS&KunnwOH4LU*SK4%H5_@?17V@puMIh2IHTR8W|5=)2hLN8k{1q(an9j zsUi(e?MKX1Sv_c~bH&1R^#WaO6#bEs3+~x=i?Ar!-D!V=*8Ev~1~_b4N5_el6Un;Y z7dUE_)Wm#MOng-!?lEaQ`!ISzigj@ld+siO3Q7O-Q^}`~VfWyfGjEnu>wn4yWC)>X zt|Qz1WZy=vzYl^|Y9#Q*CU^tsBAE7kaM=C=@qsIZg8XooSNhJ<0~W}@3H?XIo9Jem z4|^V96vuyMlf4(Am4LE$62F2YZnmFJ4Kx|l9poJvVi=m+?$>>05FVk&P;8V^M<9Tw z^Wcx5-}T{MtQAIifd+tCGx3PJbGdPm*Ea^F5b|ABg*-fiuqNO8g}86ab>_j>4MK*X zFICieW|DNfKL!StPGEjrlaa}P#rEDpEvmp!ysvYIYDez@pDsOEn?{T#PCq8}V)WR( z?stR&`(}K8PJ+Z?Wny4V5o8}Ma(CnV8mNbjL+AxmZm-va_Vv?gk2S@&{E|t~U|CbA z%-VcONkL3)Sp2lXC9{o9#a0+zlHw{WHJZbA9v?DI?t2Neb{aPDAwDW1naB8^)Hxge zZZ=kb-EY+yPYQwS=$oKZS)Z9-VDgW}Ba;neyC6)ACRAde70`3~sj*67_*Vm)Y#x{G zo1OBa#2$OAE+{(?3yYvoQvipRXmO4qgb9ik@&IR8BBuyJ-F7SWR_;-o!{N7r_yACe z0R4zck^~%|ktoZNt0mj2U0&Xa6u^?ss*X3)G2a0WpZ;-0;5^En)ou7J!%dj_n!I=U zJZ-LoXQDl8&;!0V3K!=Crmf4N~HmjJ~r%h%g?iUfQ zbgQb67e}Z!FP*;oVyH*v2@oD~6sx(trTtZjYg`8Y)--`CFk$%vL3Cxceu zDAqnBw$ec~=C0`~^G?rszI-bvj#%LqBMEVHR&nWG6rhX*=Lt>das{h-M zTzGxKZVUv<9@E|a|I*?YkPENFClnd%&FCzo`T*i!P#ifDD+_Yps`7?G1u8b zLemIHe2SWV610Eecnb>H)8|!7TpNH&&M|&}0}8$`DV<3{zKkK|5xBmuL>Xn2H$-mU z621!^Y97PPSa=w|`SE2j^$!On#qdhWiUMxAr4uf*HYHjDn|t$445&@GEU?`}oYD#q95Y@c-psEl| zo2+*#l_Z84zaOzW%b@ z1iU}xz{*73M^v#?;Y}8t4fr9)M2=@jeXO<{xv_-Z)2n5G4S!tN{s$0i^*7tS&_P z0e{8oCpQ|DAx)%>FMF~HEkySK+B(B~*2fL#TFvxwd>%d+bI}fF`q}SiQg%u*^~umw z6_xa?XJb5mlUgxjd0He;eo{j5Aub0!{=?)p?_A(Z?6T^8k9ezE5)u5)3ieHxAUjt6x!I%SCNNekBNMr*^DvrUP6@8 z@ygtvRQ67EB;+iO^Ny~QOLysWwyO$Ij7*}Eukj| zbC@F~a}#TqVp%9AxSNa7Zv~K7I((ZS>f*jP9F0(~bjyT7d>Fwrl*PIEMY5 z<@!Av>zh8efmKF$HF>yrBYN8im$TdE750r_*NLyFrdNPp9|IN{8k?c|4Q%E;>wHMX z>YZ~d$yTibsqz%$j|LHBo0W8Vo26u|!xLr8$Yg;#a)%3A-_q=Qo_QCYji5OD;_{rV z0M1=REWX-1uASQOw-*K-+s|kiXR1}`f$gr68+cg;J!F7;3|8S#M-L==CawezzZ)e; z6*;IC1+=DUe0sP1o*jx!f^|ThfEd;^JbUeKd>@65kiA}*$)#Uy6Ut5?!E#Em>JxGT zmdB^*#5Unah|A_V#L5^zAZ+Y#S~StR3A+%tA=ax<2*8Q)EsE3 zjAF0z|0WBOw<^H#A`L?PqWNj;rsRW9sW*3m@;vQ+gX6z*@wZwWyZga}J|%~2@DBV$ zp^Gn8o8aYye{X?(RTK}{>w|&3PCoJ>b0Pg_E~MINWG1i%!psfUl0IkaVQn@b(fcK({~;)Y*xL(M;L2mBc^RFM>P z8I2>7&TLB9VX-u0@-1VwVsN{GW2c9sKpoUXWO@b-F`r$n!KXAGf_N;M- z?!H~~vbhUCl$@?9paZCoW%UL;VYVQZT$_)(24NN&w5hD%>3H5Fm)om-JTMNL?CCUc zSE-WBCtU1SlY$s9cyGN=G1j|?#sz^6yawVECTx@frvbkfu>t%Vi*P1-P=awrDC$+C zOPA4t&zQT`UBlz>=2~66y|m33;A4oEFBwGV4xKWwatcs5)}zp5O_J&3U6^(`uZH(S z<~Qa>7rO{-pBRm0q;GcEhClHhy2BeHvVIRghkmN%Jcgyep&8+f;FgMC73mJxIB z?PRQaomwNjjms8iY&{#oV1yUkl5u)C(@lT#=<70EPlGF6`x{z8ih_`vv@N93R;hQvGx~f;wp3a>*w(p6B3(ry&0fLgl9V9Q-%7H) z&0KO?gZT+psA^Oz4z8Vrh}dP&gPlnyW+8c~mBzriHBoElIO^eoqT zwY;*mE>=cDeauAF=@pY`VD zQ7ETMH^EJ`>}Wuv_dbnBPubdiFZ{}iKxQRN>bX2;p_|Fi7>N7jJp%SYv^!ZD1xdCPZ9C>;^V-T&0jtq+?8&8%;@V7uhE zKE6{u_6U1b&pY_RDooU~`p`ki=s=B`A%`&5%EYTfc)^-pnD>R+yms&N!ogpUhF5I>zzwm3fa&(Xmh}dVKGxV? z^|7l))9_=U9ntI_i}GL(YLu^2ckyF91_T00X4H)Lvtycupd@|Hn_}tc7G}-XUGBIM zeU)Re4nEEoJ1>BpDKG8{tfW>+;a|b<(o23Ejhsqeq>NW=;~o{S$3Lbk=&n@ZN`ZQy4|tL`7U_{#+v|a?e7Do zRwkj1#WkkiI&gI$bPMq5q2{ z4BKzpI~7wxRdnn#Dna={gcHsYU#)-Kw7A9Ok;v*AU{SSAq9Q)4$5W)pVMu+f!qyQOtbM{zS=bJEuz5!RgN++ZE(s+Fc*EF3@amN4CMvv*a4H7z({&L$3db zfHGKAfXqPonZ)V{9)9Fz%ig*7R4^vGE(xHJ@|+n+ zUim0V_%7_=Q2Sy1H~N$<0rrdBOq51m*%4tBfosBhx2DKe&$9 zFbSDs$&Je}sy0v17EG74a4Z7tclz<)8aqCx4Epsifm+qYgN&rhqO3Xo-Is-yudMUZ zojQS`Ou0=Yv%lJf-Fi?h@v2TlmF&23)IW_2G@4LJ$`}w0>T`+l=N%T5_wK)+a=2dA zKKrqA7REkv)?f>`xXQ5bDVGemy4V_cy087#6C{+c2q2Pr-w;9l24`}&CI;_2g6HX* z*kgQHY^(HfUAp_5OIFV)v3To3I~Q_0o1XKMumAq6nWI@8xYx=Hqf8Yuq{4K*Xr7k{ z5JUzj&FN$leS8{QK8lilp&c0;MxChsQ?1e}2?iQY0s9^KY@R-+dnr;%*C2+_X3IT$ zbymRs)`)%9y= zTv6x!OA7(Hhz`B0m|JT)WL!HJHY=&y9SS4_uw@y3slqs08XV)Lf*(0E6lsG#%r zoDHu}tILJJ!(MTnC!$G6c)v@?4&=NeJs1wqVAj_jB#y!gUwt{HWKUipg@O+sp6c9z zBVcz1l7;y8<2n4$A*tze2JqIxCE`3_1QX5f!Q{;kUFwt-^bC@^tG%Q3!+PkIW3x2iS%*o z=wxcXmXAAgBlMm7U+Y5*g;5!4H(+ZS(P0uL|M4y8enF9UpC{K|ljQHYeB&5Z$Q%n4 zb<$f4P|$?BW{|8wAE%^$EizHb0M?7%t?G4upzm9b&IEHSVo-kNI$^TbeX6VGaO~nnudeH=exa6T;gZ{pWa{d>p? zl|*&54PB$d5iz9oK)CG$qUB>$ zM?Pg9GB*Q}Q#6FOCOtgaex?SX* z>-fknq6PTHd6JZ+y`fV0DznN+jv*k0a&=JmK#+4WL}4g$ti$+9Q6Kn|>st8!jDyk@ z3$sxE^iT1(#(M9(cH^i}LI5z(s5+A1LO!h~bZ&anWW{6UsYnztB+Rb;ej^ZpK4XO; zEA!u-*0UcjxE>q2Z*kFt%iDF}&q~5525iOWj%Z%09Pf0TrcNfH&=0s zTRSc4q@H0jDo`F2+hMjGLda)FbX~JZ0&wn%7J2B&b|t2tJuWvL=DQGw@^lxS9}-9< z6rtm=*!G(uk}i)oR+z7?C>Yr$!O3;ONc9n4GY5n`W#dTp1RlrYnW=>uJu-NP&U6oy zuPAyxy8PY6vZCSe&;x}W@uLUitjg$!i06FdsW`vQ?tgxqNU6b%#%Inu?am8$Yh#eb zSl0_6I zA;@efLV@2axMz1CZvMtuSn)gcFE$(uLH~C<6mpzW$zoLfXNA0uqWPm`F)}<<%WawB zlvlk*13t|wes{isOtpf+9MxyUpJxzI`o=58KR5aL(S|+SI?#4y#sQ45D17o%H=)cx zG|Y_wxBI1u&+pjb{(cjI4`~^>!11Nd7C| z#`!CqIlAaA4u;s!nE)0f*dV{9dJfRxm`Q^AywIIp_j)A@36|*K(fU=Q;i>-~tioWu zM;JVR-SjjGGoz?^iroeGb3SVuUvKeUz&0_UREd@Nksc?&-Z)HmTg4rsvftf448`3k zV9h~DN#62b7tEO6YKt#}R-vn7Gs90cgXhoLmSa3UJ(d$M5;I zha&Fz{M}$nTj&UzD^^FX`0Uiyw{c3{cK#~X1$CNf3l=co%!-TWg%gg9>Znw!+GUp* zLz=#dBi}%F-tdQ;e9^Pm&Y^*&Zd<;_DD`q9fx|eUHTEmWR`8GM^|~19;QOjSJ=-i}bJXco zIhZw4BJ1hlD(6D0unvl}7Xv0MbFuB^KYY&HT^-WA*9mFGE*21}x$yr~!Qy(Vkq~)!+)sHSJSlZg4fw*FU;MLw zNen10>+ycroq4P2Zd4Z63+^cZ!xC+ zmuo@|!I10l4D=SH*v5*fva0xw)u&r4uVz z6TyXyM+7cDGIczd3$9=ULPJqLBCNOmy?>7f$ee3hvvP+Yo%la;B5h;>t@_O`?Zj-N zxACtXJvp%>LQqlh8oRWazNYE_Q(gklx)FS8hvnq{6jd?aJ?nb}ESdX$Q+*d;p#%D1 zz!4yajg}C>E6*b!g33@F;6^e9ld7=YE12K@+%`%M*nkh0Vn3Xm=J1~s#mbME|_}F9g0ZZSEWtgE1p@b^6USd6$5pe1t`>)U2xs#oB-{&JQ`J~DtXK>X| zlZorsMZpv92>5vtcBi-20}r{iZJ){q%Jc=pi3;um4y%~o)tQDtJN$SNo*e_(V#uHI zVP1$R3Vc84bpd?v%27h$zY~||Ul2$ti-qw6+WM^`d+tCU1+bI$A|QDJScB0=uKtr= zxcv0>6JFxrTR|ExBkiLgZo@Nin121&qOhBu*YxsPuAg0Y)ghZJXlU>}FAriw3!cVT zLY-o?N>k22pazjb?XgmD;C8jn3}x-r?h5Nz43wp7F9E!g$_;+3!_Cl!D2< zWPe&F6$Yu6e~``-}zsZ=ZQs@}&)uzW-%@9k zR-OajK+yXP%aE0X%s)op?0T~^d! z8T|WO9q-D)_sZw6GhA>&M(h|tj=$@XJf#~=KMA)B9$6~|$&bK^!Es~+4uV1TO@3v$nrq62PA$yEv=$UkBa$?(aeusHypI&Aoi5K3*M#|5h3r_6{w3~U0eTq`0g8)uM-$sN1gavy{ zJ)+zzor0jc5D4ppZxR}zg)J^LO}218sS8d{ixJ=YX4ooB6KK|)*mZnA3-w)!3;U9a z5VJ$ru^^SwVIZr&}z zW*+&6f&g+fcTNGEEHFeQLxV4`+9o$tFnfpO4H0D-VC|!sqYp;BBmh)N!X8S*OMYBI zcddmu`ILLVbCeD56GMhO$BZ2zNdcPCrsnlE`$_7E2SatWrThWxoZaJ$wfB@SgHUL^ z$~@m(oS>6Tp%&uUrfTN6CZL^ee>^{pEl(>3cF=Oa%;(c;!QJYx>UGu*fye(A#Bz#Y zvySS3`uRTZK;R7(z`-!uIF9ui^jCRU7>KfUL? z7R8qoYx?xkd*b)So@)TWBg^sIlqJ|aua1dTf!=HzeMiWo&d&}|;WkG?gU(|B04 z;c!4{VXt^v6PgW?^PGV4^wChRqN;ID5Z3jG{pqXB%8=fZ>>`GbUoOi}N{;PEwB#W7 zem-0G-9E3StK2EtoA>d5fmXQn?T?8kY69b< zj6IWZ?>q$x0uknK5F|UidSC}c{^CGE2nwKYuHG7fHaMb@&y1qRqL)q3#dmAtCoMUZ zjH5?O*VlX7uImzzk8}J&wndB^_%Rwq^N!#K8of=1r9E8TvrC#}q_I!2Yqqrg5gIo% z9C65APGI@fD}I0S!v%{wpFO^gQ`?7|yA}44z8Nr5F^&L>DQ1e3TLA0f!3r$!DAaY> zdXH*LJ0$$iJ6jK%*ezEkQh}T0J&wKDHkoPicV}#|1MEfVs%1;(13b1X{=Kl3&ejS| zrys|{I6|eDlmJTQm@+*h6x<;HnvLQ+_d^^RUrS9N$UGQns(6h3=oaXO78Md$u4j(TM zmY@+RfJb4-%q+0ZlOy%~zd-C1WKMm)T~%Tk!uDd3j||h1LneVz0S+eTA$yz8zC1iS)6s``wB`E`;;Db2oPBiSn$MlX{CO!+Lj%8kxf{As57r6V8RP5u{J$;X{CU0TP>=i-S4oecWScb1H3{SnR6N)#@c z6PMGZm;%V*CZRxh_1a?fQ-}=%jRfZ)A4O!E>Ji&>kpnt9iy6Yti!RhnG@18~i=1Wt z9#Z7kCEn&A$%l4okTNC;ThEAoyLqJ*J|q3csUmzBf5HDk=5KTsQuJ9u21$5pbit`` zy)EF3(2bxe#gu7JYV&1$bcvkmC*hay`j0r^r{U%fNBL)yhTao!YRLgW06; zp!W4eO1+}ZQxc;M z67?JSx;1ymr*>I7qzMQVH@-oOZvOrfEASY3(OWEb3zp!MOB6^XgE(H^2N`&ujan$Vg9~o=4uX*O#9b5=Ra0yl)l!@G^gc~1)jM&La3W! zSc~v_0SODqXSjP{HUcAL23|-N4loK-K(?<>dnD`;k3tN-emvmHO~` zBZLCc(-4-6xKJgywH@1F?F{(wJI1O98-Cx0V zUwFMktl^K*UJUiBGcr1%Qnx9`L&pN9D|)VCf6bV!!}4K^sVAg`RKUPwiN7Y&uqKF~k%8m1YNyp5#m6h9! z4RQhP=I7G#{ph=bT7YPxV7Qv-2V#PKw+Al;N14J}Z1~IhCVSRpw7e+%7^fm1C05!qvYFZJiFb?+GUY%QLl3oWE+UN6u3k`K=gw@8!Vbi z4qy(yrV`m@ysnV{i#|9cY1}RTp5(e|i^Y={**51OXug3lDx}{gRKIt^)5CgEmX(lqOTS?_sue% z(*Z<=N`usl>R8=OacUEJ%r^r*--T9Kd?2Li-OIqFzoc;Cj^-8IxEX@($!r=T0P29F zAPT?O)+f|@fhbBv5AL7M8BwIYz?R39!uiH|{_eC~QooC9{BoDUcohTeF(oR^MEnD+eI zl+y4uh;_E;8SApx?V}|c2vQhVS9GfZepSnGQOkV1#o=~noqW#r#@$1HyCuEBoS`M% zo2g^B$Ui5v5-l>TqsCo0^){efP|{MP$pT{lO1wy2VTs0i*sGp42FD|=5~dVy|EOez zBtmU%7*GH@Unr!Z6q!SWEXe8%P$g_^4c5IP77TYgg_YeoR4t;d0Y4xX74@ZM@#m>K zzEus2bRRad^)>Cw05TuUFi_C$alUb1Y0?fermIWVCo(E_POH6;mradDR1;NMLw=v9 ztbm(TsUe#h)VZ*TO@0#3HftH)9cI@x|84V-V^@Ebj+=j2s1A!5M6+l_{}HqUK`W>t z9#hD`xAWvBo-i`;g7C^3&--?B{X(yc6Xm;RdAw@7$^f%p=Vijyf0W1BKb)`_!}c!T z27hkP{|-|6+JNy2B`D2iKm4-uglO$k2BIwz%zL=^RpYSGY> zUypPdR$)U`lELZ!k-d?Ekh3ES1`CkaQ+@C8U;b&4k3bCeJUa|ZrC^KV1D5vgz^&p4 zv(TGOL4NIeC%~%$T(2o7g%1~IZqcF`wLk?VPK1Q)h}Lo6=Tjy51&5lRfrC;f%AP2K z$I$RXFz2L1TH$0bE@ zyQ&+MmzyO&z}RPxFRM_Z%Xp;;(`Z-Z)1(u=HZS`k#d4v0?sc0k2lHZy>)^0O?A_cTnYcem-*FWGo3D$Mh0$^GqC0D-I2sU6%Eh*;UaP{?Avp1ofT)*!ah#bAwC>PeS%#S+u$r=8E2^gWm*Y-?>zH}~=T zj|xukbU(D8Y?jc_u+uyLzKh$%{7#bRYhKq+Zx~51|FPX$=2u;&h)fK!z3U=H5y%K2 zO}DF?8vN;a>6jFQllqZCCr7rraf1UX>g<}8MB#p0`oV4!l^~sCOmzlmV}*#D>|1*{ zo-CLduo^dxdT*E2%ltUquyccyYSO|@hxt4YNozdKejp9ni671iT&wlp+AU>qA#oZ7 z*P=TqzcqfzwzH~LjV#5O)>FasLguYqD{Y^v_Big*Q;F~)2$r6{288)unSEcJaY5Ej z=~Pis%EZdoTp;#QWLYaxed4KvB?@G~UN7)GYv}uU+Xh@C?`2y z6Xf(ku45Q4CEYRn0z*|RO;#@bp|jS3;v3|Q?r(L+Yq4TRJHj;KP4DsNW(K8E+S9S= z)s$9oPsvJe2zL+iNV{#Dno@JQ(%pZ-hFZ2SSB64PRzY+friFgyhC6dCCh=PSlTQIM z;FmbO#4&~;O+%XR`mI7bRK1w}MaRd(eJa518zoV~pNKLFbWdlpe!g*j?=*u`d8l@xa20&njYo9WH$D{P4PCVn6m4go}ai?q<-C1H5KMqUPdXoR>}IUlb3Zyu>H1)R?4!+isI&Ub!vD z26a1kN!6r1{L6l9zxcujpQL;Nz#4o^kFRM@RQ+kTNRNd!PsD=zdJ0wXA+vPWZI3e%A zixHNnI|-dzLB>x$8y7uey-(f);&Yrjt^G|_*l*hVr3&F6_h0zP_ZVi#t9XP2j&on! z78J1bim8=c^0*k^&)NjNbU{UI*MMKFY~g!^RJdVimyn6}W2Idx@Ax`l3$bt!*GzQX ztk42Y?@!u?=#|Q6=*akFlL=(A(r8AcI->)+>yR7a9ag|!4s>rlW&cD)s z{eyDNP~K8zG)10)w;|XSdNMZ>76ALz@F-nS@vLE6cXY#Z?`~%M6+m5&M>S!u4KZow zoIZSATe8EraCfZ%{(SeMbA`1~_4gaZ#}v(;MFkp4)F_Q!-;e?N(Fk-RS%b>&o67&L zY)f4!Qp**%ATW;B-pXe~(O?M(w0 zv|{l)i;JB$L)ZJL_d#LQaahpT6G@Ji z8fr)s8K&M-w=UHGq1y$0)>PLWF@7Vdajc%89ssWf7H0iJ$#w7x?{|ti|73Ur8FS72 z^t+2PMATj{&v-=o?%USB_bSuUKL4i-p+L)3k^CG>uI3Spj35#Ga5YGa3|(y`!5vHW z#Y8A!RQTxD`fK-)VJb#(qUc2=ol;Z(=ap}YZ!V@JD~Qn&*jt3_)cOv`CKT3#EBLIOKbsCs-GOrTaMpLLG6Un(M7!Ok=2U|k$=sIZvat| zGlOIk9HLCx5{Jtg9SGCy2J{+Ku(Wwdq(u7>Px`(_l;Fg%^N@87W#g4%Ba zXYQVv#`lAC?O*jlv|^qYk{+?>qHC1ceB;xQsQ`_zMQVHiFP~fytL^j}O0ngl8iCN5 zUd&Dv=hfK&iv$bxzm9*c#6uCskjhFe{{zK1w&Z*r*4vs%$lQ16)(cFEyS`Xe2Ghq^ zSzura`07ae_f9AI-ucIaz{kxA4I80M!tBjrGD6& z9chYV&msDQc+AY-j7_`VY<^x@KDTVWzf*8G71Q6FQhz-y-k`(sthB0fJmv!IMO&t1 zvb7UceERl#?<$DD_uQ3R&71-$E7ArlE3jWBlEmZj*EO>6ap4Z(0w?i^QBWaF3xGch ze&Og$6;qAcsm4rW5QB64*-LXboW_^bV+^j!eb21Jn06?Ds>pTIoQ!Oo>8-b?|Fg{5 zaDKYp{UlT;7W`kUA)cpqSNtp&*>E4W)_ht@*TB%nDO|%r-N%OhGLnm~OLU$Kw}Uac zNraK?)nS)_e@r>R^3xY@FqWmL*Kti@e*NoAUx0YUw`w>lxY#d=P} ziBx7D4E54Jc1?O>d7BfRn`Mf10 zr@2Qd9fTTfih}yjakq1?DeIueF9w^Fcek2rFDXALxi#>lJ0?dgSTg-KGti|w0(L~@ zdEBJTH@zPDm3(x+RYomR^NWVFw_f5a_*0ki&qwc7kAAr$6D}K_N8`<|drB@YzvhAg zdG)aIe!{X68mm^4bL8Jn6tw33S+`*6JvzihFWltMN`3p`%D0X@L8?a)S6(SG%%5nY zb#>SW+V9S3$WSi^gY-?ntmnJ=V1P0nndrTQ4#7w^b2Tkra8X;;sTLy(t`7CI>HN#5 zzGbhRg7DwGohm;Vxa5xUUnWMH7Li}$lAC!-J`J&Z)of*-$E*v^XN82ap;ovtcOq^B2|j~9N`7^TVR*@7$q_^;b{{GkqHd33CG#Blb4O z5hE1sqGw5!LD07^#4ZF%Ux-tGHdXtf7*EQkBV|+Zm!I#zgpti<6&k9Db5~=G@@YFU z+Q(fv@a^Zsp_Zp=nvMKD$i1va!5`;U^Fu*ErZ*Dj+}2ai@s09pM~Lj{)&+(&4x>E+ z3*f?rp@Z9(Z4*!_R9xzs(zK+&5U0w0oBVVA1ucYu#3@0z0&pm)8MvO>y{?6d!?(5$ zzu!QXT-w2M)8^rZ|B(i(&**vUUYlEy8y#116CRpT;lsp$kLIUMMEFFhs4csHyDFwr zC9VKiX*7)2j(d48OpXmKvX(0-hU+XVanMv3bq>wBZ}|Ecqh{0M7bVQ8GOgy&X8Rnf z=vvDDkfJ>!;ZS368i7RPAKZN^<4QQ`wRSzo1SE%)sfI836ep2dg0AAogZ`2`2ePr9 zE{@fE@t1lCX)!XsSr`9TX9t+fKgiSHV<6DtR1179TC3aFbwKMEF=mDf8A<1e>bNv~7WV*r@E!~sTcW<~WI@#yk7h2+z{99$=FeBbSCgo0zq z)V$)#LLiB}%-%iUz7-$x5JE2;|FI>|uQeR*^HRuEll~_l3sx-ths2fdn!HcDk4ce> z&$Dka;@}&-DpTt!h|!HZ{#ULM^pFw55cVM1>3>eu@hsJz{6X^^ z@^MFHTw62g?S2P>WRf{WDZ9GP;mt-#{C1DSxRA;ra8x$bjL06_<242Y97WnIUnxmP zak^U)D&?Vg74Aggr|7*i<2IHo=aB~)pTefU*c)HywdZ$^?DkuCn}@h$i@0z1y)W)MpZV)Ybi^vd2J) z)awLkn8c7810=E(-=ugM*QyEj61>l5tt^&`wjfiMop?Ra0Mc@J&}cRVTI(6w<$x>b z;rzNf87IhoP#^z;i^*wy4?Wtsc&?B+X`O{#lUb^0F90QMATk?N5*_j6f-%FVZq38R z)p!5SJ*rs0hyevHK>+JO0L#fgPv!cQd5(Sa^~R$KoBKSIyfyCt2rPH3M;)?Ht}o(UXTPNao?aW!9Qb|-BC z^b_-`04II40K5)>@p<+ffPqM|lDr-28}ZNO)$IBvpDEmvzd9@eshY8Jf0AinbZi2A z3-7(Frsv0t-c?2IF?v8zNxYqJn+-DICf33_RK#Ek_MTi&aRK6yn zOi&e!f|*ytu=`{k-Jupk?TLa=ZX8FDjRRo{FNJ--FiQ$Q%1%8BU~^@7_$~d3BKk@V z@WrIS8$-Jn)mkDa=$Pf0Y(LZFlz~jm%E71a5}5#pdUPn;e>1XrGs6VLJnXc~y*&P9 znJ_1^6^ApoHfJy`#m^;|S+@@CO4tJ&fK1r%WhKz%$FkDbLB6LJph{a{c(L?9oZu7&`=}kLPZpt-O%pQ`K>w1 zSZF8X2o*=Y8cck(r2-#1Q^$N}B>jUC##F8=Q4H=P^eJEEK8zJ)9~ zVH|k7LtcgM4^_ClOjll9HpY4F5XBcVNf5@b-A=^C`%fp?n!i$K7V@!pbhBJ`Wfa;{ zq7sa$e7;)iK^!D?a+j}MjBJsKI;FXL5vu~!BayuEB0%;^hD9L$>Z@HPMrf7{3g^-+ zA&kF79k#6w^wM=2jPX`n;;*3nceeKSBFdY1s<$jKsD4(8$HZch4%O2HF^^TbGcTrCnz&g2C%{A&Ga2)v| z#i|xGw49F1_?a(m0)=x*zMGx1oGaL6Q=tvk`5yhEIECi9IOk^Qe$HfU`{3~D zb1EfxPxI%)YeFkjJ`B8|&kItpsL*h;Sv0#b@ee}pce2B#)Qy=x!4bTXY@1@ASEh^R z4p6h-ODpU;-n5*v`ShtPlh815C)irc31&$^&vJ-HtP086Ek&~szJs#!*`219L<3j zn?;g@^Z^f5;i&~HJEmeN^b)V((g7E}GjmIyDc6~6$5t0ZkUwC*x7|()y=eerU$3~q%g3tHL*p0a#U>uhyua;N=%XzE75tN zR;DwFnO!xQf{ds;$LEVDgsX6s$p3>Fjg=b`?*?2NJIajxWr#A;G z?Q1=hQF&SWY0RmJ%&aZ<{x~MlzkIuql z7!Z5MR^S~lDN3JM4$86-D|MfvAY|VO(q)~{ohYqD{LNu|L?ef#XEFM)$dQjfawhb; zF<{9}w(n`6J@5Ye9jz1o5Bzm5&ad0)=4@M?;r9WkCxN9i>NNBn^{?RM3DvS>8A-p!U?D?V1kcLNRWzW48Z0a+aG+}bvF<70N z_nR|Q)UvwoyAChe=Iky|zL-}Mi|`iVh@XA_i$hT^!BH4oVJb@Fv(ts_KqKiiCt^p5 z+)blt!Vt+K9;byU5^6{bApb-!NPS|fZBv|(U>On&s_0XWZk_urys3f;nGt7aWF*TA z8ftm%^%=?dh=xYwN&k5*-nsSG01aiMM;eOO_3*W~oOHN({P?XW{h_Ld#G`eg3Fpr@OzwYa9Faly!m zrF^fy_Y(N{^83PP00>wI?HEAmtr)zYRfs4~aOvp>Hc$^P zGy{?wfnA^X04C7s2vq+aR|-@U0D^!nuP1iYWM)cPYZRRr+25m4e-9EZppF*%A&BQ= zqlsoKVxCzCHDb?TBT2rThu9^Xc-|DE5a6}ZC38L(p$fF+Wmm68CjX=TQ}VN8G+8^J z#-odAx^*~~68`S@KNdA%*Sz93*l43zn;;ZMi;orC)%kMR@d_YN5?M0C0x1;p%D))} zXEuGJvox9i+*APsz_w)at;l>R?KVp}KLF=p!S%{vre?FilP#lb%BZ~=g6gsuV*W$Y ze@Zd!AAInEZ!Q<|I=TJWQ-=@l-?w-7E7S~-v;fHrz|Mek-ElIH z*&zjz_^8^bk}OEPUp*}DzDKM_Tngz-`7GWP7^>8fIxR6+u%Z~54J*l2in7JMX&9QG z;yp4Cc{8{h`kmu_{9@9b1zp~oU z>e?tu{yrwqNOt}c8}sBF_%q{Z{g42^!S@ z00t-n4?G_|{XH^%ZU_7TcvLad9YMcK5Wq)gY@NvPYjDx74piei;h#!zRRQZXt7Rc2 z)x|FlE5$%xqx#oMf!UWghwznhQkOLav5)dTReN-qv2%G~Q~itgR7YAJlAJnitMGvuLE@!pKp036^tM3VuDOO7coy(;AixZ~a_b<-m>*>xd}MwilT z>&d7Ixc!HJ77GYnb={jYeF@<(qntn4B|oT+9ck-~AN&>T`x(H}FdIXmC}(@{>NxG# zm!tKKM*PJD3hP*j6S=j3wRRDCa@$zi}XnOq6j_@OoK63Zg z*2%}0jL7qP>|6tImH+^yw7}oE{`%LvB7_4r007#x6IGAm_0vt}V zgF+Kt7oJg*1054DZ79GYgc+E;Z1SuP=rYx8y!r=paytlr0RrS1`I7d%hD_yv9W9cf z$O7IxyDu*u00Di5kL_79VI+UF`8%RJ);HI4%4j!>V)P z;r`rSm-E|D4*zSw@ixBCWqlp5FR$_aP2O=0X}N8(vO;;1be~pF3uFyyeA&gJc~90i#;( zkE^=6f~Jw!rjON0GZ1j934lcg#R@2zslu~%T}RhmnS26%dVc@`Pt(foi)lQ*oTeL( z#}L6E{Wz5pzVfBF=KHvm(TWKSJ2VQ}vt|$+%E3)uc)!~*z!cdk3^52G2Dj*JU9`EA z!+-;{#W*jakb`i6ZCk^5LX|hCf<3)2dz7X+UU=Mn_x`WVX47Xi4rk-oF#uQ%arkHH zIQ-b7UvHYWb8Xv{&VbG8N{R*;HRNX;2~bca!|)jp@TSkt0Mt(HQ7$oc4h7_V>83QW zH(`KHCMF#utngB_B5MWAQqg|a@>4J2)xC4aH_%zWd54kHxVRL{|1OaVE(`Jx;1*;RV%c*($KD5iSe)P8qs)?q?)a*!1!l$^yrL^Zv>TpO7g=w z_NA{zDzn6`Cxqk^JOU~h+)j%10K-N`jwS&3p2(U5FjN$oe|+DOxvydTD1{fyo z<{3VAd42krhr%ra@bPr@xc^|&r>Vj2AtdRsC7XDjftB%`haP(Pr|awMhfm{%&)czM0C4p9=2`9QLk~Ut zwVQ6b@rL9F5dLyBz}gzkLrCCwi+mHD0T<*K%#b-GFddp5P{kWZWhzh$@08#R`u4)9FQGkNF-zf+P ze?ML?nZITO44Iq%;f=fKhHF-7&+ZZJ-8+iRf3ljS{t(w6r2ZpEr*v$6PA5W$-z=)1oFy&4L zCpwqChJv`9G?yLuMHl;hkyVE=(_>b4Kl%I-^PJid~q8;?YDz|Vi4Gy#`heY5tZ zby*XT2hf8yKp4JeMpJ=8!=P~-^w~8Rip+T_j7YL4&aeraAdfNAPV_G+plsd2uXdEG zD_Kh3eBm%G6#8DVymCe?!Tc zDLmUxj&DZhKOJEH|JhBu>BehUY2V%v?K@{otGh-~>JQ9zb8}9|j!x;w(HR{(zM##M ziuwa^Ab>Kwi&Wr}vOO^3U z^oWOh;QWFAL2=0ashGR+Tf`YniP*Oc>$;| z5wlIIAb=<-nYhyYEAnb*7P5N(6I2x>()UvKRGgRDjtZi!x0Htot0?J;b*Vom><9%43z-|43v@_6yop%e_ou&wPIh#_p`bG z?O0(MVdd)5cH#8LJ?d!;1Q=B6(8GrwZ#Ungt#(Mdas38Rs`q_*iPAoiYERIHEI>er zdCrev#$N*)<+^+m4T-f*oJ^ZNXS)@3KLb$f^v7l=sr(4}9@w11iJw#hP?#;iNsymG z_PtjxQmZG(x`;;A|Bjh|eoaijH6S1eF2s8yYXL$LAj%+sngzLTL7mHp)O)(@lB5ZE z;E^eH+fUFWf`Dsix^Xc21l)DkCt_ZKi>`cw+QNKtM|K=;gn0s(Tp0B{8Es|_zwr`K zsh@iLjAy))bj&>8AWYyIsW9uM8UO&DJ~yl@-jy3fuCW1Or{L}|MtIxaUaCp|#?K** z?{qrb-hcNmzjf-HKEKC~0l=5P`_r@5;Wxbc#q_o}ymI5QYc7PkuL zjU3TGxn&RC^pZ6?_na~9J$Dil`-JXoZO&=^*fcW#W5?%od{aaG*b$E~t6-zyg|1}& zg>;DOIX06pGh+h9f)X?T1=RdUTfdBN$*d6o6z`SsgHEQ15P+|HpK0Jbb3mt%*;+VZ z{UPKGd_E8kRcp)KIKxmdEjwqQ#o!RU4j4OYq8S!-*~4Ev`F-*M;N761dNtLBzUOLz zaW8RvX1>gIIVG?$2|x~i7-!VpmH(6G$CkO~hZesWm&5-61h_Uc{|Eru_&L79fcY+% zEEnYcJlLSfEf(aO^x7qL6kU4J3bmt#9(;70{PYQ0*>yRM#{mQ!h#=tZUw$&)`@$=3 zN?jX4bby#S0pXPo-W%82?L4=2T(N-6!6>i=wiQxgRBN&?p? zUa!?b3CWq4vJK1gtNM{b1R=Wb{s+E&{sk9qEq}1*|JZpVptE@V=*|b|iKmXxYp#Fo zm#@6?ig(7sK(Q)Z(gK9Ez|9(%0cK4^(J>XTl=M{u%emjp^qIL=J(bQkN?GYgbbdkq z7%%rrp1qvitjim!@hDl5l(XzIg>}xVk)7@=5#r3otIB>hhjuCA*JVW|fsU+Aoo)S5 z3(%ZknS3I`+WD3TReVA|NaTpYe?W z1t6JVGEq^30te!EnBvr9qA~^tk%oD3UM7ys&dxMUz*IuFiyWZ|qH)~IdZuLt_PO(u zIXgDu?3Z6T-0!DZ^4}_)g2Kxoa9 zzTleu>0qWG3j?vrzroVNIzc_*Oy)@E&wEWP%VB%T@y~ky8#RA?DYZ%Yf2SkwK_Vuy zs{J7~zkIHQEB6>b{7|-2Jq+&apX2}-IkL`u#UKh1W&WT<+ne2Ch%aJRSaRab=M~Hm zXaeM-j!ic<7rYSRMsLEVHF@>S@Gup024>iAN3wtMp_%8&(7A$N_6P)k0MP&>8s)?U zkeruYGm0wx@HwH1B;|Ke6Ai>ZGvyddSrICMCq4SpXDGRW10mX6U5}Xw+0N%(~ z7CYD5s9o0+;CTU;z<`Q%TwW-4+-1z4r?|=?_(uUWcuHvgp@$y&(ym==^g=&gZ~y@5 z5x@VJ|Nc|I_~>u__JP&O=qfe?G%+VYE)l%8O5J#qd^@GCnMdhg`~ZMkqCc{O#mII~ zwaa7p4%yuy2~?~qot=vq6d>a#^}m7F5(IF{RW%t{VWckG*Fk`@uih?VMDq?Varqkw z@5>;db?WW^^W&TJzXi!(u2V@oNdEuq&B5lsE86^b?-|E&*$PR0js{!*EUNrBPj<95 z?PxkrOqg@+i^QMH0P}lm@3;N{Sjfi`H_N=^FP)|rjq3mG0N8b8oc(w-ZRS30ivTE8 z8GXUz&9xQAKgjeezt=uje=LP|p;tEDbxHV3jWPBIwOs^}0kThuA4J$XT&qKS=x}pBqgD%;o?9 z0j>?qpZ`K>;8yG+!6C4l2MxfKy6`s(AYe+1W**G}NfXe~`R6y(jOO&%Q&XbZqcmB2 z5sgMKrs>8*)OAyO@V-yQy>jj)uOr@&!m!K5fQ*wT+2M#6-}g)c_|=ly{L#n3X{9b6 zH)zkSQIyInjq1+q%jkHZUjnXOGV8Q(2^kUwPjR4`jb9HRe)7QnyYIg1G@E!{j~A>4 z04HE;d*;9M{X4$$-go}mKaYr-GXqY>Sqrd2i`5DFliTEH^XO6AaY7BW%^%)#D8V52=U3%Zwf0A*x& zKfwH3XI1~dII%(h%i~W|G;DdTqtB9mVE#A0WLFIH3(kHab6>FcA3HXS%>VdiO6;>e zP0oIEh`Z;u8mEqiZKLY`CO<>t@cce;(vVFa9xwAOseCi@PmX_>(a$SGK*sI*k~>r-CLR zfPkwE2zcoJPtl7TN9SC0eR_sbjt-zMB{ASf^Wf}AOynS?Z*7g`y(M(hDLAfy#duL? zU(5BH)`ioy@jktyqAt@5;I@^JQ+yVfPfN+M>#qN0c`W(;o_p^7@`V>&v=pbmP>vTA z02mn4`1Rj>{kvcMz;C?cpSNsN3w{8xLSQljG&v_g*EZD6lMg^l3ndb55jw2Y`UJ4^8$JaDXdP$Y3I94I)`!LW+V((|}gA0-)qD z8x>Dx#_ynlpM?4~%8c(ku}S~)V?piTNn<>Yf%$D7q#FPLAOJ~3K~(=2x9z3tuU(DV z{U(!^wofi%^}b_S>fboo(aC9w@1M^}9PhZB%;+Q7XbR@7jECDe(QWqo{kugY2cOSv_Q4FT=g z&pjTIzqsR$JHGhzQ&07t;Dva+U;sdc;hL|$b^9HE>%HG@LpWfYKtOT^oWzj8*{)Su zoEVco8FB(NF~@etp}`&!?9^twl=_D{Vf3N>UN>ME@T8fz#Pi>)1nYY~0xH5uVKcY~ zOSakNCXptA{_^{F4?SF#q3w^r^)BS^CKm(zqr1XK&t1uf1lK zRzvyT#?j{HELQFddHiEK-@yE5N##GEtK*#~RqeMawfDh~`x zB*!krD=)bC51&6Ek(cek6es|w+?OD!j`uT*s*PB9?u*lvu@s|Ap)tXLQ!&J_SP0|;-N$Jgr|GpT2w$B*E}NiaX3X#e^> z>Gy~%2oT_D^Z$$FpYs94XaLp(unAzqAYhXG0-}VT?%D<)fXS2=(@k2;wrDXrN%QFz zEoKP>G$B-Q(a|~k7EuFw_-HZ*tgHreKmY*`Qn%QqgAacu?w!3CU7w$0oGS(b14jmp zYWW^eM^lXI#oU5qLy&8d?yP6ym&@4k!*6o6y|E;n1|nc zyQJ0nEvvp4C4kT3%~D1Cy*m4~oZmmEGQI2g2L1kHPi2Qc@VpOXB{2Wn_R?#vT8+g_ z!WkQzb1C0@VrvoA{UN1qRQWHwB-|mW6QFVZ&UpEoP``rlBkiJcn;XZxLW1X#zn!KS zHcT6+mvKY$eKj`TLp}dXAb=vRt9)MoK-&c~Yu+vcE9#)nN-^0bs3`6F#M&%u*7t=j zIT!l@ngfp;OYX1Il(t*R4v519Um_vrJ%jBFu;F=x_ZJiVSxryWhP}R+Qajm|K)~ok1Pt@(Nm>N+ zKrjciDSU9>zAkD4o<24uKYx@at5;FmzKo_D_tRp&O@|JAj$YI>wD-c-rgi6X?t)T1 zRAKhzdz?yqqrM%O2D(puN?JQqAE0LYueVrUSfWsTcPi#xX{*=iem{E`vztDD$MXsRhQ?Rkp%Y3r16=>wSG{*M8qth>0kRe#g#@lrx3NXt_9%MMCM|%= zUcgYGr;w(r#UU`Z9+#l!YxL}%hb)vz6KOtgnWg{%E;D(yyK`=N1}&Y_gh9UOpOvJv zKnD}r9@7^>Zl!*fz*+id$^VxpHt2tP>?zvJMeo@*7S0JteggA<<&`TbrS5`gdplI_ zThPYVB0Bno3Vz{lw#Z?AUd!vU4^^g{<_}~09he%Z)XGtvLLdVbM=(l^pBY03wqlkF z$(MwKlQ{v%!~1wuL246yA|zS>6J@|aK?lPyZ_Te(+_QX8<%Ax;qW-vGQ-%?eWq`i8 zR?S@n;wr}8d^BKG$Ea~S9(sO}JfNItn9we3)EB z*_=h8`8$&um=gjC2pEY^KztvVe;a_n3b|&S3j4%ccF7rVyqo6ZHEOnxQ!_e2^X;w3 z*aHX%+JF!#uxD?gfg!4<3+8~81Om1YRlcWU*(Eya4 z0b@vDlT86JyC}qHLzs~P0x-$W%q>s{SA0fsNUr6|e?F%IR%S0UqSyOLzJNR;PQ=Ze zxJELaI?|jc-rSnZa?Nc(zf9BvCfO;H`;4;Wy`R9^zzGBqDnvf zKAU%RayvQs1zUe){&Sz}_or05SjfmhWC3d&)Ddui`4`#|Gbch+fDvTC;d8PW&Rs6d zzf_g3j-IEo=W+qzc`$QMu4!AA^2^eiNY0ad6_$> zV2|SvpduiVbqZ`S8bCAw>;yQ90Kg##2!{Cpz+-seNops%sU5FT8^FToIL)^=vnF7c zLBKo~)e6x8!O6B;JQ6hl4QK)$J@{F=qH(n6{8tez9Qk&vW}O^D5r?HM1(|_mC7-=i zIVG-uD$L(zfJ6x9J2EtP>2mFFm|;eLCYXOuu=l#|hOU95>pK6#AN=62jvP7it9ItB z9nTv8=;0_Ul9%VWurTj^=+MItJ^b+BUw+AjH>TPEjU?L`MJ>Q2Mg+_^PEt3TCM|%= zr8k@hgo$(t)XTETVaXZ-$B_cmrxtv$iVG>HNG(hNWjmxC076=du>n0ROJEL3rBe`) z9!7U9r!q#=DoIo%!=8HkCx^cz{qH}qMgQv2!?YoWaaGX==KoJ_-9y)1Hlb-Q*b_iN zaPCX${>1!6<=-j8Gm_95Pb^Zfb26N)U_Q4>a^O)qvmgZ&WKNBuEL`2LQ z;1M>w%P<~n#ux4OVMHO%7;O(1qk{7dQw50(GEydlJCxTInsDZ8D~OZY@@1)`semPA z@8ovmI2)XuBVTJA$5z@a#QA)E^62M^n#_B&e!pi^n%CXIz5%tHi8M;qG~rwyOmP3z zq+m5gk^~6q0qFZSGWDj(;eSnL{NdG&h~oQ6{BscmOw#u;-NBsvc$=D000FzG8Lv_^ zTBrHR4O+}jrcl9{J77V(V|2lsj;;rqcPMKDuA}V}_eBu!*ul@zhe*&d^9MluD>7zpUJFN(p~DqxciD-g>!AL7Jp!k8?n4hf^!LY) zAAdM#sQ>?R?6{|=3ErOFQMJXRG~|LA;Pe00KmFYs+u%%-%>Xgm)+Ch)4iy63>X`iY zh!(TpIOC}4Qe1G8omsrMtx^FBFfk6k4n2I@BT#tv$?YyO z{-E9u%zisd{ruUa*u@!S8^1bFgR)1N|Ddev;Jslmnma+6KRXH<9x3`+_m!cdi5h zHD+(r0jO?v)plfvJb?yH`y-`j;erA_+4G5|)%x_}Z?cui=QWZ|SQ*57_#*%TRAdCy z_pPY^UDg6HAfRXh01yz#aw;0sjP_7F-c8MDjhfLaHSJNFPfyTd`y{zw5?IX0&F8e1 z@3Vef^7sD7X!~y=CqVeT5-J3)k_*m&o7?2uoK?$pQ4_G>f;B=wRQ_s; zMTn*V^Ib_)S?0*%f~wIhHRBS$4kU5rAdX7yfG>)6v#9D%dHh-GpL3dBu-_?|vW|z= z-mfUZW$D9gJZM86GLNnA^egW*(qLhV{GcQUO&G@E%=nc@Ny2)x$yd&)oyTAM%I7Kq zDzCPh0}XL18?d2M3@U3aYFi+XmuspF$;U6vZP8Ys&+o9du!BL&>(k^U@ZK^c?@V7x zvx|P@U55Qu?LzN4cr3ZU#;GmysZRe0d`tL3S84$yBOo(<^aB`0=RfDh3JBuopaEEk zfPma6XHMKhuH8*d_#5q_cC<>fts^vRk5dz)1wzuGDY?ar*7CiNpP12Neu&1CtH|xm zngDl_9)Bc*fb(9J#wwHzaIH=@E(-K%A`&&fnPgccPIEuVHB6WKNqKNB_12!yzy8wq zrytt0YxSC#3!rVJOmM0aIEh+-Ze>i}c1zv7p+yK8?9?ep(L36!m|22{8c?;; zHs;8zJs>Oq0`djApf!)Vg*Dm^S1pr%W*-7iVE=beT9_CF=$I+f*YRr#=C3OM6n1xS zl>AxkkJ5T#{=awg9=iIXF>P*jQT0F1%sw#vX*L6h%D*D{6TC-e@8B1+*(#pGWf&kb zYa!C!i|T)oJ^c{?khdBjCaX01s=Ud<2{!4{8Z7p?wZduWA5#U<&;R z_~)!8h;j4e%%rhDNhc1Z9>Uc49!&VIZ4(1AAYaPHfS?eB>}~ z#EfG)F5#L<>*yc7ad%?=Cp+5CC3_>|kGB4h&z~~$SLRz1byoXFdw&BN|2XY$m}roJn7&y?#5*Ao7TlU}iL z(XYf6-)U#`Ayd46a_&p*whAr~3{N^CRc7~t+TB)}uQ3n96q*3o=EBj0UMJGqFO(LVC?V?=&V$B*r& z)s>5AvT^}DH|Fg}qGR(O5IYnbT2;Q+1>|5|@xC%^V(6$Z&mIuy%@bbc^$~iAdg=WE z0ORxE_`uo>=Y9Lz-}&SHcklnQ(%oO}@4@@;T|Pc%=y<*~0Eoqa>>_7Vd|F)UzVwxE zeC8kh&PV^-u*u?vYjbA6QOXO@tWIKP!1*L-0YXa6mYS}kw&U!8s0GkJaR)0Fbisp* z6_q7smShZYRZ5Tb14@r-xm8BdO|EB-;t5JXDKa3ZK+P~WymS?Thr!RY*r?+fJHGGZ#*x(m)!k@B!{6}{q?T*wn^J+x*%;wrL;6k#th&HMo*iD;kx7`nEpmd9t*GWef}(e z0SK%T1wVjhl_miUG%1wOolM#T*KEah7xVv*y*Gin<+{oP_c?X%{iio+_AF15umEFA zp0Eve3;~0|je)Q-&>09#+$3aVkxoMr2si{nyjTfIr$etMD`7#5NeCf?DFKYZ!nSNn zvNb-v_w@7z4R42-#^_qR{g{ok`K$x_@U-S^k6s#|sH410fj_O$AUi?}3;-Gd0e(DAc>(;&O7;baA%XKnS`@A8vNIs5 zrk^vQamGMx2HW22IpB0r5VpJ8YHEUYek-8N3J(wEfjLPKqiAbZAPp}pFg0-UA=Yq| zi7L7MCB|Ph00%B@(vKf|k}j5n{QSH4(RZ>RBcNc>`NBCJ*!EAIfDlgdgN25esnKLy;3vhX6wUl4>3Gb5UNb_oGiC+wCUg`qL&Z-DtILlkmDUYfQ*C+S}vGT5ffx?C% z%b=LRa4@)?Sj4JYmsbLexHVF2sCHKfQ0{kNzLNOb1T`HM)qk36Z5VbiEe&=C2-FFJ zMuqWbAVBiBsTeWZu@NAo>>!s>dObzZK!1L$&dUch6B2|=w5N- z3tx8Yt8RW>Oq01tMKdZhK>Wm90I|~6VxeY$pkDZ1Z(3@DtLmS15Bm3Wd4Fa4!eG!j znwdMaqdq6d6`bc#1y@@NsPgU?re9S4{5i0>MgREd6PfvAP6Fp>Wt5r!3$GfblD*SX zvX>dZB=+gD7Q&>{rO<1at3&*_#II!hbLLnY8(&?A#aE!xSpbQQrTzu0|AlC4J^))8 zamP`UvAV2;u9(dJn3$RNIePz|eTs8MglhPwJ8td@e_{X_9z)e`r47a(I+z5yg6(x^ z){%85=h5^A>k!vMrT%Y>`k%zyaq zoAD%N@yn)wVgg{*{|MCno)ZDF>VI4k_S6~x4}V9=EZ~YcAmtlC)CwMSO)>M$=P_g8 zCGwN&$VGF&{5*AGPUp_vM{6t3qshuu<*l96Com>Tw8tS?HgpJV{^mNeBP*sCJ8=xJ zuIG|jJ3Vw>-3cFq_tz&P1BV%44-Tym=X&k_@E`u+zkT3=2Y%zJQvb)#!G|B}Kl^Fe zo-qwTL3_>)zML)py8gkUf6}V2d16L0z_)+PyWSgB{>=#OaK#KTnUGtZkeiGtj5#E* zBj0wJF_sj&Im9TVP%n`%&df%3Vv^?%yn&gLuB4w0)OQq;$qG0YAh0JciLRxEQ)WQ4 zMMJ1yb`m5|a$4U8PO007^zZ4w<|h64(Z}f`m?x;%*(VLrdtSRi&)-|r{>j_F*!Wuo z0vKW!z$u4cKfoG7Rh<1e_-(!-O%V@$#7u&H1ia1`&UFxoo&JFNcLdIV+`1u2!U_*p zC;$wPd*y|!vdZ#1U8y8{xgQ2FCxx(_ejy+kdiD^ms3l`l><`3hN8$@sIRjRWHU);D z3LVqmAO;7?sUbP%K}{@Lh|BbowmB%O!`cSYhnhD-RMz|w5#*L!B5BTZF)8_U>64=b zLaN@EH*g4KiJw^g??L@v&)qiB> zegqPJ&Gc)=!{&fV-jCXc)sgrZ5NUD^2GJ|!O)gxRQ9D0OqsdEXW%n)AoqvG3Zj+8Y z@&S4={b^de>ZWwxtc@Hn2l#=GB@3=hm30HWknvl}8Op+Qkl;!DFB}wasve8u*&lq% z@@wYbTLPEClFG{zRGd70`uIKf-2F#8|MJ##x8D4^b`j%Vqn#_80b;R?Hkt$$izNAnVj^(KDBP8-d_heDpu!S|Gp0HK zT9i5Io5-Z79I*rl2onlQIH4a@%GDbh&r>|kc15busFOAe!;hhl-qWbbf5(ldLz`Rl zV@C_~ClYlNtNkPMzhO_4lKjj#roS*#)&NL?olpUrfT};GdHk2(%aL_VB(mlK5BUL7 zN#NR}+iTcnX8fv^;5N3wmiaYIY=@buaxp{(>@eMTx}`8Exc~68hR$D}7=6xLJ(&kI zBK5|rv;yh6i|fJZUx(Mpyww$Nc^iBmwmFDa%fWnc0CH0VK%;Y|DG?{QzWF(_#$g=@ z(lif;pj~FFCEhxC#(JC(1cC z35-*lGQ({dWfw-ArSryx6dlmbFOVN!o1z2S`C00^DV;lgAFZ#xfW|BPps)0~LbY*l zalBx_jc-8BGpg_X$P3s3bCUqhYJT>ae+}rg{RRYL`!0tDpneLr=MVni!#{W5efRxF zz|hdA;B)Z6{~RU&lS@QVx2s4bGJjH0$=U?W?2l*v>u>(<2fzJ2-}GLN2H=n!2YCUS zl?in#6QW6U25hK}{s7L?f;zz3nnsipS4iD(Qf4W568xx8<=dg7PJy#oSd{bOqyuyV*CVM0m1qG`*d`{hzUv@gKLOIvG6D7UB9jyQ1UGg3P? zrnhLyeXF=~s}<2*)F80r*n>^3tYJ(l#gbb2y{p?*tz&I`U6_b}#y%&S4ng^;expO8XpJ2fR#&VG(1_8wEOI%3D~@g8eL{yOq2p2p-2z#(EV+|kNPW-u2n z&S)_^OwIU4THSpMg>w(ktlgx;2Y!KWe8r!m^{Zc5emNSD`WYlw(Hf?2QO#71ZT-~- z0QBz9Nrp5PwT?_F+Qw(?6(= z$5pchqVh!uh=X>=$M5;*>C>l=?pj}c(J0#eIWyp>k%$048Izl2Ux02pCu$bi51@0j zNH^*v%atqXb{(swUC!07R6?1qFhFjlNSgt^vvb^_4|$<8WfB8-!fA~J)p3SA$-8Yc z7#eT?x=8uD_in!b- zZHZg-J`{B$3LYrw;XOme@RjkWdj=c#Zvj9}Y2YOa;eiBi`ItJ^~cPOc}vyoljl$EI8>Qa~!6@ z235T}e?pro;T;6g;XVQoVrviBR@q8|8Bqpb%1KAnzjul8H<9@#C*)!hh-Lr;0Rb~n zl}43tKtcd8*zlb;ye8gfmB?LNK!B6B6Q__aG-)N|d>`j8OldJaM5FPI*&NW_PqXP3 z9o+x#>1D6{PFlbEW*slCR+v$cppgIoAOJ~3K~xI*Xof~ia%O-YPABwF;Z{|40tSP9 z6IAgLAWbhVBNXHcoS|3HZ`HNEpI9I|D2FMfl516!>q-BFYJalKzgL17{xY<2<~uwOfC6*Kz`qd{Xjb({ zRpcnC{2LmLJRRQLrhoM4F*=W-ex%<1-yE6$?j{%UDa?P~Y8c%h^RFEDm|XT_XszV# z;GM9)v!^zR>4Lqvle!;9o=PcYN%E6I5zF7?s7R2h4g3?Ny$(ip8Mm%b%TC)+_|gtP zK}p51%Nmqi!PXO6J{!8n+YVho(pxYe>&M}gbX^MO1G^Z0mXNA20&0)0(zia&W9-z(HTeykxr8L-b0Sr#U&0&(CK;q@@1MpNS*|auNkl)c>Bn z{zn60fJ0Qa>ML`uNlAo~IUqH;OXh%BS0FEhuB_FLypOp(qEEmDYR1=*YxYn(J44-K zN~ceLns%+fh$gF7WpG}Z1I!>|D7Uly<_7l7STCEzJpM2aIu(ZO`P{Zz^|aG=8P&hs z#tpXl_kaHne)j$c?*DDpWImOjXDSiU=L7(*WGl{kptRFTiUA?~*XeHvhL~ZcT4{HeN?;D|#QaAMjhcpzY;DmGA3jFsK=OBm(XNiO+W-1J zUaR+^>c806!;s|P8&j0+2LJ%UrEsO%a7k>oO(NvpgaoFi1t)6#RsaeY9U@8j+XCaq zHdCdEF&&Sha_{`mK_xDi;h`0c8B$fUn7o5-{|Yw4kgs5?H1Y%8G1Qm<#1MYKyD&F< z=Yc^0-xvUm*jv^wfY*qtvj2_P?%!ZmN$V?sbO*x$g>h7qltV@X?~{UsJZHVc`Dfph z@>fCwn^LK?NdO?{D*^j|!#)6`Z2M1s0BrlmkiTUBU}(SxKtL+_AN>LHCzSA{sFjF* zP>oX%;71t*ET(5@(QebJ6Q7}7>o1{|)qRzUWyxP;#1(K;04Fo43i%wGPScW(bvv^||BfUI>KmV7M@ zaccJ&vhX=4c}@!{V7&-r!(qC zO;XvVMeIXz4s=Ep%#X_IEe{2ENTwu|7d9pVEHo3USK&FtzekBF7#nrg@;jsA;%?w% zD2%YYW2e8Y_K%K#M>ev6i^8>W`nzCKh%;>`L~*w$98JY=nYH{KimkO)I^|;&=^;_%Mt4 zot6pk=qQOAFzgTly}D_b>(jLz`WctePOxS9Sb`>8!Yq{~26C721)$2#-?#790TBHR za=}L51Yi}=XU^&T&tQUQQ5E!M`mQLTA&L+a6y-+iyc5+lWD=4@K#_r_92imM@6``r zksXku^YLOlrzX|zpXVC>qnMg^K_Qmv3 z>j!j@NQCPC1V9P(7mQFNS67pr*RNBb7#d1EWbU*Rnukd_eA4VLuT(&E`0(LR-}R|a z+yU*()S z56TZKf{BaAfxVwS{-f&u(alZzhlh^P*{JD&PL98elK;2fzCl-Su)|+hF@G)SvorH| z)uP*(Lm|H7Ut0URY7_#dU4<0Cp##-^aR6+kG@bQdlaJfQ?~QH*X%J9K>5>vQN~A+V zP#E2%APpN0(jeX4U4jw@jWmLw#0LaMHw@VJ-SflqC)~UD+OF$5=e!S~50MbPvZKp| z35Ph+!X0|&7XGXuIA*tGn!-D$^x(sR8(gAPhTn#0ZHOq|Os?M(`d3Jm(rbwoJ>q@p zzp+VF9cDhi|KT%p1v~h>vo!?NBn*+7JYe}(=RfkC?uB0?@+puth21wnoa{e8)$M?5 zkV8^PD*b^snFqKIj$8UHtfOLSR;af`rH@4EfaCMtgu=%tpUA3g{bT-E(OS8EYUUo+ zR0m~fl6zU4rjXr}4*Ti*)?KSg2!G3){JwSAuv zh{YxS8NY}bDIKwz>OzVDgSqv&7g7Wk;PpNJ?;Ja_jv7`Q2e#ilQtzm22(7YOo5IOC zo5!N6iJM<{+dNNhp9tI-OVm)aEs#Z`y!Jcsz3wNL96mhTL`6cZHs-$SZE}`eXDu~J zqI~8xoDyxb4Kd)b{JLbvtUN04ZB3Hf?eS_;$Gu128$9Hvm=LLg8xgHa0{I&^^X)}5 z(G=;&F3^9}nx>@t_n&nk#97+#vYHn}Za_}%!<^LIo>IpO#b$C-2bQ9Ev491?C!Lmi znCwTU$uj2I=5XGRWJzIQUN9*+zJXFv3Frk1Xd&dV=W(NtGpwppABSs&NR<1unU4ef zn@d?B&kS)OO5MWS>D2q*>>EPMqqc9?erbw`z7KaAnzRj0c_p+Dfma`OHPh5J1D`J8 zgST>ts!d075CceZ@F8k*awfCyvT^Fr1!j8Vdf)B6f0Q?OK4_bS+TkUe$?O)$RIhSO z&w1Ty%|*QE&AQJ(@6-0SiqGZ@-K*H1)!PAa2OSv7tFV0e`YkOXC>2B z#k?II$Rl=Xt;!O6ya0iQk-z)}m~YFMQ|*B{A2)f`v0mvI?zfZ~rxbLey(RDM(U0$s zAVFM<7Fvv~+l8hst& zJ{og+r~qQ^deqh@HP~?IAoWGqpl>7RzEMs4l3Hz!XU+O=E6x&jWvuOc_4%RWi%_Bm zcYmqi*HjqQvM$|)?X~Zd`n=HTO%uFgt-Rmz0lrnA^HT|}PMbD|>3XcKFp779EJt^R ze#@_WIiG`6HrYa<8u*3}K?dIaO0)!#t|~$(YgFm{P0YvNWW>Ohu0Z`m9jS=tx1~dO znO6npV6s3(XoM`fd{ZF-XDd1Rq^<+kb@iCVxm}3!W86=swog(5e=*;zVm6Ju{~q2m z|1`&gga>9Y?FD@;4zYEpPfj-w{NA*u%i7K1PezC2pJ#ie2ja^k&<_T; zF|#0mn2wt7626XK4lvwqLoOL?`%aW=@504>%#_;0)9;EbbTe=iv=aR%FJ41wYIRK( za-LFw7{&Yc7CdWus?bigKcIws$Fej{Rk!5#S%f_PHl6Xg{E#*n5eou=?I|==-ae&^ zJT=+MetCcpk)YYqO>Wc3!wWX81@PZBgpiTG(+*7~U9=_q^O$9gnvpRJ=&45_7}Jw! z9;w!}zi0=PKJ#%D5v$Bi55I3~m(=Dc0^v$-J!Wi%j!Ik_0=Vnz4t`$!D`B%&;23T} zucUDiGJdWlz5K-1Fu?CaQ{t0q`G*c|QFu`Zzc7LC?@X8aa@PCTKqkBRfaF(eV0&1w z9>56X-6&0S;9GnqrhF#4H#s-P;Fq!|auJ2GwZ3>T@x>$NEC(E?CbpjYnf8cm#W-Arw_^ER`Ic%r z?F9W|!Ga4KxWIhla?~xWj@cF(M}8Yf?6CdB8%cOCxf{ zt#LSo?RA_^Ox(A-<s)Bb(UrLDjz>mL#+2*k>20$zZ<_p@OZlS zFXaH>4}MkD&6D|zPt0}XlCS~Ex#_D1i5!a(I$NMRBDJ0_p<8?}0wpZXna8I!ZIU4y zPpiZAfIaHv$eCVKyz;^<%CgsicAlnVYn=PkOd@VK?UMy=EO~JwbnBeW;cE z=@^IOZ(TDYlheZSR%L4t$Xwm*{`XR~-crrnmpR(P^wdqc_Oq=cte$r}l{-td9wq7R z!6HS<98iWkJryJQ&hm?NnW5~}MPKELo{ynp67MCvBlo83ZmvifIy*XrG5c7w2j!$2vc-~NCqRaUe-Ptz5{zaTtX^ALhHgdc0U6&su z|0jbK?poLQ37Ia8o#}|cdqT`-k4SwWU5ouqo(zIEHEh^3ah@^6t`h4T|K)BT#aE%s zzuJdr77k_F*&k|h_X(V+4YC_yc{@6hL|5!3yz!fbLr$yRm3^2)7vxe8MZUaLW$QLW zSNE#GRGm>ST&m~@HaPbNElR!;`lRvdWf%2J>{E;KD(N=CS`24vVHXiXMDQA~2L9rS zQq-qCdCxl^Ywv44+xTB|--$i@4|`~nt6L}*|9)CIjc zYeILpSuj4c(g9428qSS1ITpq~`=6O80-ep6HODvZ`_86jp#~B}5$*+Sc*``h=4~LM zHVGjPOEU>j?{Dq1gI0-Lx0#big=KpUUD?LJt_-N5Hbmy>Ujh6mC?FO}n)MqsM+7m! z2VNkXWVl@Iq8$u#KFQ(wnHg{_=>izDYU|$YwSR>KpqouwM4nUq+CyzQTZ!*$L920* z^G^8QKjJFwD3wDK_(5j~lBM^MZB>-HQIC{FtGP2_>CXq{A{NQb=gq0c%Ec#h+@d98 z*+^O5(U1%=O*g@J&qXtpOWr-oN`CkC;Xk3o8X4Pw!7vJZ<`}d3)|AQai_N_CbMebc2k*mg4}YU8U9Vsf1*2aa9>E5m5q`X{Qsa|(Rga=W z@SwHr7k@K|-yfXNfp_Vzq>0Fc@KxNl`@kRcfsk;duWMC1ghoY>I?JvMzE)oA?{Z`N zf{$sx)Iy3Ocmdi#+WWEy)8)NfUPEPzxoCD~Uy{0B`7zb2@i}fHWFoPUwor|tE!ES? zKZcFAnS$}P6<^D@RG}XxBGYUcgar22|K9MXJhJxI@=9K$;&UFSu@UxH33{QgQtUO? zo@ln3lJqU=YVN5%b?g?xU+1NT7QhwHp0;0wde}GD0#fl5k@)J&9JinX3xEHvG+4qc zd!{Vkerxp|O}pwlTi54;^$l&_2P=sWedk^Fae;pTO|HeKnR{=Hy(HTX{LuX) zx9om9+YO&FU8X1x$H39=z&&#pEP-?sInLkb?Us#9G=Znw8TI>cY0h=YDTG}8pHC(B zyUD?_mkmC^BMeoaSU;u(LGRiq-fPcA-m>y9*L;V4*ZRO~&1qkqTI7|=i?9WQ^;rVs z7qu2Mt{M7O1~ozk);-?j>FBuYB99<`h=O<~%HO`lZI3iC@Qv4vl`fYO-k0M7>e$@Z z<{B4cB=9M#21wN0OOo7T?{woE4e$N3QX_Wqio`JE(^9KqGetaU{Fd|QQ;owve4R@o zx|_8bSMu|El8~g1X@){$u$!pR8@64q#RvXQ1R10SiY;MMuTHIl)n4qg_=(1i?Xer} zm(S!u!LYLe%9vnJJ-23_!;Jadvpa2u+a?bLaZUyQjV|#Py8^x8t^+k7=t7ebhE4I1?|Sv&i^Hw(IIIBR{;I|;G3DF!ysMa;l}#^~XqPEbkM3&2 z!}`DC_ouk`YmsfRFmdXje@fSc^lmO{pHFmOT$pL5&2$V{zvukRLdzu(rXKf_isxs4 zbjTI@eE#TqxotbjWV37OK8Q~YZhzN5(DlXZz_s+{bX4B%YHzpBHfg+F)h~8|a?F?d zZCveA|Flh#e8^fNiH=~|rmaLBaB$;U@S5RK z;zdj;P6NpkO3aImNyypE<}$Wxm-lame`>S~=idM*jOn7t>mr${9YbEjE1#*4B3;aw~;nny3aP4ucvmv;-H z#bQJ7HC>5+|8E(`pLp!k^ZS%}kdckr^|I)QO1PTazZ& z4KO?r%3XB#d~gA``AM!Jx)=D1Y>B386_vk=stzZj3i-5Nlcc+`-IYc9iJ5tfGk=x| z7)zRzVdZH;k)1Kv3y&8*6UP{sKUF1WlXJpWLb$?QBhgRF@amH_<*X$62_`q{dgPwZ*xwVxM47VtCS`bQrdIRifpRvGDYXQ$+bwyk^?&IXkHqObWxyo4!# z?A{F(2eUn9mxLDoN&9L*bXx-2`KLQo&->@yGWZ#F3-lMh74KHPR#f2e82}z6HilKn zUKTI<)pYk>F&c+1n9;PXvRzD4O<4p|()N>IJ^32-<+cr!!SXB-6nAnT2ApJ++8~A>BOL z3pIAs4%Tm$#r^hXTH1kdycb|i+lyo3SUBOiYx9TT7nX-omcuQ=p%1?bv0x>ReNLYi zpS~k#;EE@U5$(%byh|H}$lc}V>mb>m-Ot7ZWu0Nmo>-krvO_rw|Fx}NI6P+YQS#i$^7zr89gzEn|Mj4@4If#qGU4_ zsJ;G0gT$6OL`m>oE?vel!*7nQs^kNNy#x`uJ(YMo&>A;JzYqFuqv3A|Vvlp%gWITR@ZTbxNz;Fq{Sn3Ix)zgt=K%syldKJ-Bve75z^$W<66TYFEd4c)N<L5i!LRhNRLE~^GvSk$+>N%6BJWQh74CJJc?Jo6|P z{!0Pu+Ksz8mDGPgNIlmk>*oU8cGbOtWMj}U3D8o&a=}T#Lpa1nBO znUo@8dde=zdTKjV+7;ba{Dr-}ANSaGCO_qefp`v0{boL0^6u9mSXOic|${ zFh9z#`OLc4X}C~siubln>B8#ysxg3o#Cea8pbQF&?o&F;JWEE}5=&gFd^QH>%Sx3W z9B4ZmH#~$askR=FwaNEDiKv3Y+=HfTomx6r9^#2GAf78`b#3m(5}X?m7DJG4dg#f| zI?|@@Vp0Di%@_VK%7TZgahQYYmi$h z(?w)&`kZD-MJOmW1|FuDonBFIvu9&%RUEd(Z&HY^W~YB^4dcVu=P|3dxFuz`Cj~W0 zd&ba?)1P&icsLc`(Y1;QJ0SkhO;W9iMh)}gZ%b~ies{yWCw-Cff=~m}mj5*inDPZL z`Khj85=Y#UvT1@~VSgjC`2M!wyXq;i?+n^i00e3p9Rh-FSMP^|h)lR#0D(QJ#40(* z%s>xuXybuI4T)c27C)d`QL`%Z8TJx@lA>9v(d_(Ke-F6JI3L}^R9P%FXf_?SK+yaA zHbKSAgf^;IIsg6C#ZsvEH<@LpjHAf^rdT50I?x5{5k7$06&fOl!E4UQ$z|(YesiCV2VJAg^XW^JwF2nn)u3T%cKcFKk730Nz2t;mCDg<1C7}oyY94#Zjv4jEqSzUA zjUAscZ9i0GrC9SCnQ$c>9^AQ>YU|2#NF+Rd%=z4!$}RLEw_yTId6`lttmLuh(v*SG z)Ww_Nw(YVis^z=5O?ZexDSPm-m8@)`iy8wVHSS%WHMlq)HAGG1=T9TWe{c1**N=qI zm%pM^kC_(P;6DD3esk|5f6UYHwZ*B=YqlI5qbl-pf~y)ESBe>rcmFF37F_vWx2wiZ zn6c>?i&unh5M|DqTt(njTU38gRgf>L-=74!90uAl-M;5&cYyDUL`-@Q}klwBG#YT8M#gWXR?|^c16ez-JYT^vF~K+tdZ`ErC44D8JibMy>hM zZ>1gJokbP7l}RiEp5GklvuGo;w&6-DXQ!P)obhZwff59w38DL%@X5@O(P`RyW@w>Ozc-#u)bkY)79D^qlyw}e;WqsGV(4)eANh@b= zkQagOe(LVu_%4mohPbOtRf&=;mCU>PL9}W-Rj&<1^?prGd7yH=dR(xxxWhr;m+gt9 zH};Xwq&h37@ex~W_WOiHk7CX&$vwGgpR*3$EyR``Nefuuinl4K1rc7+>@x4JCo#yY zJDC!Z(RPr1Tb5mAzx&tWr#ysD%Eg-VSet!ap*e;;F9`IhhYfSU5=5TD_<4tQ3f?&j zxDZRM2v!EYs7y7R!iORfWXMasbCo#H>^*c|`aC@~K;|VI{8SA4-$5Z4{O8f6_VBJ@ zYMs-V;Vu2NDd|B!`Ma)2Gg@RtymR7Sr-t@ZU0ZwGts-wUwDs5ukFwsotYZ2ZJ7`nhHdL^UryB{8epR9k0GJ$REv#NBgW86 zsHi{LzPt364IGIpxC+bl2pFi3MX7P+VkX3ZECz940pD?cYtVJ1^<5WF6BvAx2VG%r zP#v7?55=}r!VS?$xx?2sZwp1u-;5)JZ?AZ_CgT%(5^VCYzP-Wh2Y-*fPiDd<3SO77 zVwd~x7?PEws{d+Uw&~+oRX#T+6i@etNY+z}#T(5d4-MSc5PfuRo@0Jb<2&M3jAMn<@ULx$ z-EJOt;|$U83uv)C9k51g{Ew;tTXiG+6pIg*-k+4&BPRCp%>FoZ7T$_hpHtW1rZ5tb zq3}z$noc1AgMTDX2LfEjry5N02g*zT$e|S9&chw?KR%AjFW|nJqVxLtP2=WHeaK}5 zQVFWqyeQ14P_~3lEp3;7h<1D8|0i9bhTPEl?R>2it9*zv^Xw)M^%@QFCzagXZ6~ZU zdu6Ug$mJlm$mOqr5^i|+NkpJi=wK8G0_edyPHsI$J)udr(> zbT;s?Jo-Q#b50;-Y(`0A5c_q@Q`gry9Gm9F^HE*tNhVU!nf2G~(s zl}vg;^bbrla(d^}3uo8M>ZYVh5BS-GrPg()GlSe`Xkqu~TkMWK$5oTis~_3p9WXDFU)Bs+t=ZikC9Hy^nH-+^ zC53uI2;v5ijXzLH%wbvZHuNlXzAyAWlWRB3=$2uhy`PBSR}=GF#ECLh%&)J~XwDa& zfS)%aYS8Sb=tFd-|VzVF4&J?hQ-{bvu+ld0LE zXF%Bv@VA6m?f2y>ouJcl%}Wl4-FTy4jeiezu48u?85R2Sx2|i>=@0VB-W6;g7t$gFyNTA z<*CmO&X&^l(m(xv{8?$(@SpDB^knFH(k<#s1Stc3DV;rfsSm7~k@4v6o{~N>5&t!(&bCCC!`) z6AcSz&Xn33E3hNAcviOdjS;TFB zk%*E6+djmz)z|eFqXx3gqajw@@QfQ5Y7Q+pC%_?oYkKqJWB+5OWFSlc?Ere53z)qq zc}`HLLhXsRP#e;DPAyVC9iiCIW8Upu@F3uLBW3yI#b7pSs`3ZBW^ZA`;hwpH4PU{vL)^95z*e0u|6Bxr^d(>yV`^=S;@PT{$ z$$!}cd~`<}o0O7b4-nipEeddIV*KnXgNPQx z&x6LL0vn)TjCN$fM8}zdNI^Sqc!|zEBFsmD^#fslY;4n?AIg-75_#_$lK!*AKc#Ak zZ0IH5FBiJ|e?M>M3)?;=q6LTLdBXUc2Cvt`YAex zzPgoh9r!&!Wdv>~R&mgP8$8!I*b1~I?>Cg;t@JES$@K;${Nh#czx2rb5Td_Z_%>iw zr`+17fSCd4e`0v#cG+X5A+Bs@(SKYAnr}<_uL=`KY{A4C1&f`WrFH;s2~*+6&ezoY zuJ!x9j??F_I3m1U@1DfNU&|*?sgdrdesq8bSPDs=`J$gje&~tL*<)GviWN*3uCiz` z@X5Yn{D|TA-1(}tIel4}rNFe@=h1Y^{s)f<$21Z17GZDx+1FZulUS=%Rty?(~ELzO|Opq%Ka zFRk}HW1*G@p~;mivxz`1t`RWnF|LDdj>`z#Q`Goy$v0U(P!^ zdoElSNklODx|O?RO~V}x_q|xe&KCSG9%f4mN`0U;91RUfu0b&_5A+zH+iXFcS~{^B zsduk$kZP3E>qxD+byuFnS8h9QoeeX)!`$}5?D{C8lsmj=C6#Zc>X?<~)N0}`zv*?y zUlZO?8>1Z9>4`n)yY0HEl|jS9P|9~9p0%zwIbSJjwS<F-9oH zGu))J^Lb`X_B{DPw=r#Q2LGBw4fe;UH;<$9C4q<>?pT`lGlF%KtoUvsj`ZYwmQ|p( zgXJZEZiIdOhmU_r7;*e>eJ!H#!Xy(dNSi8}ss`(0h4CRE=i)^++$Y@qFsS=o$?K2($3>37VgUuyk2>_O2j^VnT5o*}zo;0Z9l!HZ z>MzHJF4sRL(hIJ;A~VTnwOtNIQt1%Ps-ed++E==|S#DB?lDXWjr8*lP$Z6%MTwIqB z_LICU{(#z}w6B;0v7Xj+8l)-I5o+~Y8N zUy_0Wd4AYjwcm!sVhFY&q)oc`XDi;JO#D5Dax0FYti}0sI&IwrAHjOf)TNViui=2S`UnaIE}#vbI+c zboyhR9d!#iUO@$|T=JmA+vF>?fcX}$mK}cbOe`NG^>d*WEJzF^LtiC-OrLznmP14+ zae>k;W4O1j+u11`Jpa1y^dN3P>m7K!a`~~crAq(Xb(MMSa5bq|=CQX%P*$}Ut2|`f zMxUByaB{((XJ69@qRT&x^bjjCB|dL_An&?yH+%H#z|3uj-@`&3UsUX_Y|CK_Ru;lz z@u!{U&_o1B2JIZvsnD2wisbmJ#GKw$Pz5fu_vhat==V z@nu!c_FEdR4Sm6*{`EnoyYq>l#f-;7-0k#kk{QwP z>v^^S;uQR^hZ@(_BFpFjJ-&Q-o zfh4RU;ioF}%Ma(2jBpU%iO0LUjUd1k`~u+M(uVQ@MSE=t)2zo~wWU0k&vTc(oCjGR zPfrE)YCB98mY}KrYB%;?Tu7Lj@|XX8_Ku9;y-2Yh3u13rXVwlV>ZN}uu?bRvoK3=S zj)MOyWkFSo=*0SmvBP5M44N=zGKPL2uuZ(RmpHdw9EpI;v@cMB6Ke1rrh# zd{v&NWDVGy4u{=J!qAC-KR<0S`=LU1(#n<(s=QBs#)Vc>SDxF#$Q z&6hqko7yz_pSo0ShEL$f*9?NDHu6{|{GIL=Cy45-J@ckY=??%H)7psEcIcuh3cs=k zK=Jtf2?io2igxEDQ*~)eYUq%o3x6vN&y$L45TC~5nGTUaq3yVFm^cZ|{-d+Zq{TZj zV#n6qLPdnJfuI8LoQxVurUyVP4@|WC<2x$u;n$_P@Z3i?Pvps|Q^|W$^=yr;yx2&e zFPT1BT7`zU_3?X?+lWh8xg;0aL=+|3TCqVw?$#i8f$;6Xtus?OiKD{m1JgzjW9sKq zkoJas-P7#hP-`tDxS8&+sAj5HZwY(qj@k}~BLLh-*cU&0gfAO>GnWSckIe(y{pz3d z15m%WTyV*wwMBv)uE`+XpH;>7WymnE8%w)${P9&W^qms`jejmP2$v9gi`lq0P}U2% z+R>LKd;XqO!n4Lo$hi9Y z>&Q3RtwoAR2F@xxtH7GKpW@Gj8OS|Lc2N@-9(FND9OA871z-F1;A>vH+mufzcU@}a zIPZapvJ2>e=_Wk7?gu7Y&O3Rcjh`M6Z$!U3_#l6@_T`e{oHZN+dRgDbw3VN6%q{Lf zJIh|Z$=(;3H|E*^rT{1;a#!y;2dh8crw;;>CrfrA`1?>x`fzE7;aS+NGACP})HobU z#*?amC(&C(3kPCJclu?TUTz8KgSov$G>?tRlIL$+w+pYhuy;-b_-%EdwQYP60ue?W z!Ui|#fI++^JeG<-ZS#X#Q=$DxFJ9zVqQjB}-2B@8i^!N8e!lBZouO+~0QUGu*C0LeWn%vxDE2epE--)O(i7Ic2p2LpiZs3IE2Bo@KHE z7L&F1BCt*UR|z}+O{*n6=t6fi`u)6+dUF+K$m-ak{ns^P)V;y4Bt1npzT2t-^55xK z0>F?NG`Wge!hi5zNE##7ao_2g`wXxBb(}L67aGEN+G1u?F&RDR;1<*>=5+pCtkvIy z<_2H6O<{1W%6*M_X_`V1wHJQraZnZJBUnES-FPFlVBfF&I0k zRpe|z^1e}~&Ta|~Ens_UpZbndw$_|!pB)V7sV@R4R!v$N!(X#fg+40I`{%5EfqtoP z+p#=Zqo2C7)|o>GWrx%T zKdK&LAmi@j5&5HY3*$B`d9IgTc!21*#2Y>kT|&$ZN@oZ!Ztv{GR*}5Y6SsJT zlY%NI3(BGo`{LXKFHC0q?CL%7MTpMZgy^rY(Be-*i+ssTi@clv!dHWR@6zDs%J53E zZ^6QN+l9RcGVA!#&^f&u-f|*JB;Fu~7H+Z(=L=fdyj6Q#=tji%3PA!L$E(vh_Vl_s z#zeDUS9shEdidPW5y?&QaFBS*`TL*RKicfBjcUM=!gHcU`MNAF{ine#9 z>dG4DO06wUZ3BZzHGNVokRAb-897VYAMFz_B8#zkNm%97}kn8a7h%& zyTfPj5>PR)*md0I=qgq5l+@s3kx*?xUte&1=6hYL85SP~GZTv8u6}fNE)zJrTV%{%U z`J8=OT0L-?Uke~itH_P}FOTFSYM<6%Iw?O*IMz6mL}*JnUJdzSQ}D~^>io1#$b+dX zn3~dhO8v#`N=-YqkOuE*T~$xN+BO%lv6XpQh}w9?m*ukTbApDSHHO@t*d#rOK6#tN zbeN46DB!&MUP%lLf6JU!$}H1b1*b`0TskB`pMa7Z-oB%_{up{zc%64;gc%q>C?yJ{ z56d<4m$^(7$ou}HZSVYxSz1tAHlbazy-K19_=r*cH)((#zA8tTtS}71vfyCql#|AI z1A=dFZSQJN#MMto`~0w+vfW+z^lJFozez@C3ofGE`x5#(Tg@tpg} zfh6^*mE(*>gOuB{Izkh1*+fXu0`}P<9;Wdjq6}km#J|}B(dzKk+!?THUy6t8j)aV^ zQesXk&D;J%tU(C+x{lX2gP|rc2te;m-JX6OhzE0if zd5>|9{g@Hw(MIgR*Km)`n$s{XEVS5|uMWt{(6%4!F z74Eq}2?wpm{pYIv!{OOz4Yq980>bj z2@}q2^Z-JH;^E zD;QEEM+m3f@grf3ev-eNB^vJk2o;f~G6R{Ql<;S&?ui>ed)xp`o57Qj*Ar(=-T7gm z_VB``d$ndQsnZ9(vGbxoe!b^7f3X#o-3JDZ-~kInSwotx0e!fcl>iAM$pfz zBbPiSNubw27>Jf)>Ov7pv;<77M3b*xQ+hMYOc{|YFaV=8@FkdtwB9^?xt;qVLK46~ z7+xAb+5?D9CGinCP1U^r#NLC7 zIEJW!`@v8_bSn?-4m&T|XgPSEsK1#BWP~Lr*RU(Dqd5NE&!+Hpn-_9p7<8e{snfxUG)lF5{KyA=cSD86 z$__#XuQi-#9-qPg3bMq~s7icsOb5lO(1vBN$&;iActO?2Fh<*t=l|Pm-lf$fz~gjO zw`xlpy(&s2tI0uyaYiXhj(Cj;SAA82D_8V|5BJ0mo&A%WuU|!0n;hrbK?e~n-2D^x z?8jzB>3B#GMJL8LzQ-IFK1bn_vqfWH)T)H)d;Y|p=R13T090u(hN;-(bB}R$&8668 zOx;)O5y<305de(84!|R5QL!u}vRvzTZ@jdbs{vhmXN)Wav+drI7I(j(pG}?1G(>?S zbhu79cKs6Qcaok1~h9Z)+C*>yf zgtBire~FpuiJNgR#HY%v{ix>M=~pf+UQnYJ$wo{P>?DVB%uNhWNLx^fz^w!RL(Yw) zCG}o?#{7|+ERcCmxt&Tr&4BwRfDwcjcTmrJA9L+?iLJ3I3s=9|7cWV62rvAy)Al%? zAkwJ9+o)zB;bHsI>4}rutw>%4Of2N4rW0q7ciUg-$yEeov5(J8s&TFX{nSgfG|>d( z(i*tZ#ynk4UE}?&zUTaVwW3won2jU&2g-tHFg-855x9*?W0%vT&~X8jZzS~JfO7lI zpGZ)J$2>v1^T5D5A1$goc8nKYlnl_He^@#f1S+Jvt7>gDll<{R4y-+6DGrvNJC35)BW ze~JhKiHUvjC%i#ahA1hste4m#a6A;Xq&7F zH7|iq3>v$C$}Cr42E}NFl6&9kVg?9|L_;p9hB3hJeSNN@jO@T<+`4pV0)+|+FXgOTK_dScwU|`TQ9s)ps6dLEz<&nNK7n#_xEr>wK$iLlviz_r!2td26 zYW?&pcLaU8)FvR*zW)y>Dq2gfhF`T2I?w75y*|xIf^kXF`{SUod5vyT7dZ@!A?? zs7F*=R`xhju9Y;;YVc`CpU!Tn7rv=q&j)8}%Q9<})cM?=@~-h2fis^#@LEflvS!8& z-R~h^A@r(Cm_{;aQ25;X55<{EAmjx$A^PaSHgGXWkuS?cO`YrVBdV`;G2Dy*C3Krk z2rk18M%?NTTodhM8bS&+x}Qf;B-ZYKx1Pgz3cza1L(@A;dhp${orQmWC8UU%Md=)S zu=f+UkFY+rkq|H%gYZW{9G;G(e)U9;EFBdd;@u7He?Lzb`N z+926eTw>UEKBU7Sdp5?_CVz0xMZyABc`_J4Zd-vp-D58aSJUO%DxC6B;nP-Lfb}SO zT%Yzhy%pH1kGe^Z42#Il5;3we*Yc1yP93JvP%&OH!fzLdsp}nEscya zb4pPa-#o7!<>y-X_}gYxg9Rbj7SBohM2F~iSY>gmJQ6;23F|BO|EhQknQ#{G z73o-f%*r;j2!R+_bSs@qQ>6fqC26z-5PSD_Z++*TXeUTdZuLQaJe?Id*eL1}%-{IGg-c6&%fPZA} zK}fPvTAXylpLWia*_VP$nspGYM)B_HFRd2oTi<=A0b<6nQaI8ha$R}IQQ>IDHmTkt zC(7dd3&l-$XJ0b?tc;t-B$+e^Nj|52KmIuEcHxdri3~q;^Og3q;)>8m7m4)gtdD%; zM0#u?&${IV7_Eq1D?xU=d;8S3HG9dnO{_e=8<*^@Hu?@s*X!+fa|KLXsM1DVPDSB2yq(k)R-H`y3+_ec>>;!*cXyr+Z-N@On7f=jeC)4L43|7ET~nSh{%B znq+{ZKw}S+{1<{3$2K7bkE})iF5a?GI~ZBY zCKl9f4Vp%+`h|U*A|aEX z96%3dg!&yDtId_#OM1t)nP-`f^bTCufbXPPN@W4|bqcb~V%p@oBza@Om9#`e`(`aH z)?pl7Y;|+G`&3gc=djeX7<_guA-D}Q_13Cc67IR>*%3uEkX$w{a{V;$JTmLI|0g_Z z>R|AM>-*|C|2ce>S`TvVXP4Ld0p}^vNQ%ZlO|h}Tr77!xYOOMRR|E?C%L8-MhsGS; zj=^{T{GQzgH^hzVR(PWs?z26s%?F}49~+YcCq90oB)<(Mdk^L4WEI5$WU5ZKH$=q?JaDyX*v%tP&uAtsGY87-#p7n3PK zg>`uf=Jru$hI*!xciVPtnkivN+_!6&NjURN(0Tt8igCvLuVc?%6OKHDxpDafs*3mu zlfGOaBHn^Rw_vLOAs%rIZF+ruU^Ul+778V}*!NJJ_sE979>wOIu?BOb!W|@NXwpF_ zZTwH^9cQmlQ174JnmLGrDiX)R&7d@zdu+k`#BBbXRskC1l|&!+N+;n4y%!Ljk&@$J8>o|xXH0?6kI24;KcHU>)$6ww^ORp& z)WzUfVI`QWbi$%4nlhcFja?`s-I|OnM{#5sD5g+94N_Sc^j|aDH~9RKa1U~e0p`0= zTL3Xz)-Ij@E1@$UA|;7C8Mr3Heiu#e1{j$9JuAj)5FPepJ{8t>3jC~XF}NaiKEu*j z;^DWDS;4q)5SJT^nye7*vFGh*PTmXrSitqy3Mp50Unrt8V`hZL1?5LT`ab}jKw`hL z&0hVFc_hz3%om;48E=B`z#yw8P!)kZ-F=|VKvDQ}b z<7?U!`WHmvSNne_ACdeQwhZtf0DugDnqver1Cso0K{F8BALskE8;;IK5U}V{q9Es* z1U`-&KSDC!As=r}1~`m$^2o!|5t3X2(SUbslxm$qp-joJZqpfSvUNUE*~E(w9R z>Ukqc!a2J?4X1= z*n?Ma-Dj~Gv3~f8_IZ0)Q%z6{s*xssI68AQJ8p424RC z9i9G4`z65-d;K#2DEpiX0R0xE*v~S2*sJYd7=NeIzr_D{!8rcaz)#Ep1Beyhb9k_= zsG}yIdT!g5Rr~fRD6IZgt#u|Q*X{>Mz9U)q;L~!tUS`DjT_pTaB>Di-K1lv0;g1L| ztN{R~pZdD(#Q87;4NvS)6Clw>s=?q?%?!5UoVaGAp>q)g%v2K)O%q3s9id~79-=qB z@vSLhz!eYKEbQd`El)o2#Nqe<>J>6t)Bu2VpPB= z{q<=-KKS(GM~@%A>-YZHhs~{h&wKgvM(bCtk)I^SAG24TJn%5>=(R?oy1l|QQg4YL(Cc3R zreuC~WkEc4{MbYP@4xvMKlD$2+SmPVFzVC*swoX1Yy7=UNnr>a9laHTF>i_tr zFTU|Qdiy(XO9eJ&Tbne!v`N#gDb1(M{2^br5lJwtFBr*H2{G8Wl=oW1B#gz0Em-WJ z#FD3V%EQHI7=0Kx2BZkVpGfc(0qki5RJ~(7ye}hI!1c!7XlXNmAtto-eh2`gn@2^u9!>nriUai_T$ICx`lDg#jCFgLfCA(S*L`m8vwqUithQOiZ zpO`5#RR#g^H;n`HjWcob%-kd&dm*s%1<^d^W+#fSP_s4^CK_y*TxA*<(r%!ssrFfD zJm&YO9`m<(3;Izj^~UXy0#(BNbNl(7+77(_cToNFiwG2~pI-qr9#0Ff`zlNOJ~o^Y zHE!N$Z!}kj0d~C#pL$>Aj|wOlq*zVQu*9n!003N~g?y?`no^=?_iF7NrU4X8j6dcc zkZa1rS@VFYfZLLN6srcNOsEUKj}wzskq@aOPoFt9r!(8JZp#Wa&4{*V)Bo$->Bs;1 zY_`2$b0G<>41@FvH9}D6%xD6>z!3m(i(u!O*hZi4Glo@KMnZG?KM-#%wy9dTp5l_9 zAyQv}wMV65r!PclV2$?>HKh1v_qyD=!g^ep$RRluE!r@1)JEbOx)2ugMYp}VJsXdF zQ)&vFdF1{B_rL14FI%jvuDGiCm zK1X!*NcNM@~h=T zGY3Wgg&F`2e>0(doHY;B{K6!vqCZvmtvb1Re#1ED3S;y{U1Z3C31PXeD~z`8KYSkn zG0Oae@jC@A*6|OW7mLb2L;R)8-vBa*8}Hb|zc7;d!g~Fq)1LxVoK5|~N_`b{{(0|Y zUewNlx>@Z~e2J9Q#^vA3Q)7EdAEhuG5$oYLMsHbDRI!< z$R`s3jnWxuh>KJ#_@aJ|6peBl?!W+qlyyJ`7}#6NPn<43Cu&)}ubzW}tP=YPc-UbLTR;&+4Gu3UlWOVqSrCXp zBd+H}Pp0V<9}VZ=s?WvL(Y`xkX`HUU7wA2t(^WeNdh1c!rdkGYa1 z6HO5ew$1f+R%X=XS*wOm3#w`3jElg9^O_Eto)OYC26hnkBw!ykOIH8I8V`Mjje5u+ zfSv4Wpbv&wbsqL!LWmIr@L!|#tHYQjzCZM9jkK!vN1p%{AWA)n;0kET6no?wdhN^h z(f!A#bnk)VKi$^=T3dgQSX|i}{-S~cpAP_F5mXScZfx=A>sTZqWzSAsuXsMGY{v3q zn)|#gka4Sq!7zPZY7SRv*?g? zLOAlx*v+1N#aDjgbaCO>N;kVe3r_{9=LOpoR2>TnjapA#7Xg5m$tmqB%-<#EuRx_u zsyNN^6@ZD^Dtvvo6(F&{E4q%_#&1bmz)sU6W&CVL)*`WkSdYUjzq2z#2DsJ)P*G*` z@A%pw3Em;%2hqRQ0uTTa>234E4&FKFbgsaPHl8lKv8tcM&c!4QeLSq624?Z|AWi$) z+aF@(9lS~p00g@>k_1ZGZk99vAv5LBl=%}GsLvV}sQ_7lIM!e|Qgyci05WQRarEmI z_#r9p+G{s6C&RcjaZHDv{%xSS!=ygE1o}o=&lE6`-Se+YcfDT zRX~siw368LFE&lU=MDf+FdVi6ke;m-150|AU%)U%@bW+IQ z5qFeJE15X69a-vK$eOnZ16&lqT}WlLDXIcOXvl})LvW#qMASu1z{yAU-+S%LZn|x< zeTo*_XOil3(Rdn-JauDF?ZQ)N%O^2^uc1Aq`NI4&iH+IY^TKO0Vd)%!$)GH5mX?I^ z0V0Qi@*q*m8k1hq_-{v6y(m%<{1#8EI?|rk9>%nJwjhe&2DoS77StLA(uImz1}4*} z21O9CBl8wQPjVNYu|29XaEOmr(6`zO`vL8Y@%XP|`jh(H=VUoUp?=LX@ zOiIUHRzb&SbSD2lOR*vMX~#}%q^3IbW2o{K3`+jqs{MO)3I@7To>ob)Cfu*6{@Dz$ z=v4A=J67x3%!fTRgpb&&2oHC5nzI3O)Y>BB~)iA zQjkF~S~Vqjtai_L!~FWzpQG=;)1Sn;4%CEL_PN63pf;dCmfXc%7`FRs1=3D{ol1fV zM5vfUa}c>t5dgj!(a~ck|1)<&SNB7ZX$#Jt+HXh~@IwRS;frDW905Sc)P%{5v6B^6 z8l2K(v)W|G2w4&{V9vPuH>MGQ84a8_cXCYI(IA0=Z`DmLgN=ra=h2nW1RCAC8_ z=4HEnW}zqd-*L}%x4!MR$=;K+*gi|`^a8cB5q0wsb&H0&#VDBsLg-}LF#uqDemc+ z8QS@42^%H#`r73Z_;S&FDc>i&DIc#A1TC44%Ls)LjL;LmDqtau(`k5LX8h{$pH$`z z*(`sKN_DHM#b%5%^Qeb0{;uIG06yb*#xYDxw73K?Gv)WPj(=#P098L%^&6;H;FhTU z#rz}08PwPq?pJyIFF5sYsGJxFB;5XnU=K0h09X*FWI=$L4^E#Zqz1JKFgcXX1=R`# z1P)e1hhP_}Ax1fL0)Et4vPUNn@5(-`5S~Z;`gNGGl$r+T#?lcr5a4!5=20jK+y$-E zAm)-vC?UcGKTT%-2>^^~|IsJ@y}XNvgLbs-e5xiw#qr(HHD4s#=Kuf(@KSB9r^+iy zX7^=O1w?ih4Go=R#$Qid6!1w1+Tb&+FbSM71U9UP><{R;K7WWnG^zr;mzCy9bK-?3 z_kZ%i#ny#$qusCAyE;8Z-TWej#TJEbM$|2mFF^j3SsPd}xyS@t7)4i{0I8_p;$q1r zfE24+9F=O1ZMz@DUx1wiSzDl*1C^9;*)eKXK%m`XdNC-~L>5Y{7Olqvhit%Kz<>o% zZPt!~7B!+kr&cC(D6GeR7z}{)Be=i;@eji{sZpd5&OTvO#%ZPI#(~sd+0D@;z-m}b zk&8gUHqV*1aoz`VYzoNnzoFq3rV?OwI4!DVygNiNc&SW?dHx}#Z_zT?lD_KvSWOo* zPF>k=E9TFt|9NHq7pFf7`(rIaJ=V2~e}_5Y037K|lzx|^K%QKEzM8BohdA~Hsa&ER ziZK=Qr=WAxtas9kdO7mJX%r8F18{T;rtMU{J);(!zhJ_uGyqs`Tz@0v%`kec${6%m zVBwKU@8HBx5D>Ef#)Lo3XhJ8>Ui$Fq^B3>yOY#BS5R|H!>+0&I&?lG0i~o~upO+J$ z*nYzxZ)Z|pu9cx3+yWU8*rWCJm=&`^aAvuvK#}QxuCbnu`s&$%MR0Z|5HhKDJ@qI_ zCqr<-Dx~wBqQl_!=5%)IzTf=g8(#One*I|QEwsA0NYqX#gax@I^>;<$R{$WS82UyT zzc1?`kS|(*F6G4T3c5yTA7J>2S*x?40SZhU<<&wlD_F3A(s#%$7e?8MNgyBVNSv6V zZ|(10kKv;|RJ94UVFu?}2tg!8GcnMQz%eizmgLD*zu|rdVs9qekSRcg#=*I)(j2z} zvRWY!sFVGmr@WD{ZO#CGzJgop3sdb{?M$3fT_oJ>d9I5g`J8Z>XivuBRG*1?{%uYI zbOdCu(g5>EJ08JfnSG*~x~rwfQns3zKgRoGnqQWR`MrAs1LmIoF&J1H0C&)4VaHDA zI-b|>s{SWX`Fr*YDRYF6JDB)EA7#eUfPGBbRpr?42?wUXt9|SX(UNi>FnEl%&|spB zLNP~mPR&fvMJ7#i0s}3^{Of}Q72gwK`c(dMX1^wd{l)OVdk-CYKf5&r=p+<=i0u2@ zm#nTI8sjgb?ehWv$2%ljB0V)VM^Fj^|=(=t`ozEY?`?v1A?#us|H~WD9|C0i)lD=PmMRQ|k=%)bi*HvfUK2A`Br zgG3R0gZR|Q9UM#|{tgwU)wrpSo&>6W$LY2;cey%pqPB?d!pH)F25A$Jxiizps0R!9 zsn;)`ji~EDE5zE1=mVXl|J+x;%kwE{2Nw-x{;N_yXlhyr0tb7of-kmpWz~PHC( z(CG`?A3JpX+1!F>>6r#-8gj`M!>~nhQ zR6@8Z1%px;;K;?qLCtvV{bcN$aT925t)-0@zUgK++MuS1=_|HUI^d-KCr!1d+5nyN z#PQXXC1k0`52X+FFRF!E;(~K%zvE8z>{VMi`S3`Br03wfUV)9Rxe$Jb-vNWMm#E~5 z7}5xeJ*H8$gEw$Vuvf4|VZ~2mNXo43Q(X0c9ccqd_^9@;Gv#@S>nACTJN6Fp;yWWn zYkquQFjd&!l`?;WqxFPl;=+04jP{{vp!~3yC`wzoy-?Aw0Z)H4Q`FBl5-Aqz=~TVn z4l@5>)&AfF7YuW|yj;Q*O6IxA%7+r_@l*#Pe$Z}CMNVAFuV?_YL&f7i zs{W(RKdSymleO@Bci#VJ&RzQd+IzE}OOoVD%-kdH@@=_i?R!;sHM^VarZ|E?NDu~) z27+D$NPwUx{R2Ty0;C810!eRrkpN);4Mk~Y$Qdr0nVuFY4W~)=zE^d3b=SURRqo5T z-zCC@aCb91<`MVH%${N~E9-jV%X@D`+_#OMuwEIx*hmChk&sN=pgx@~019q^ZaENas7Fic z-DH**h(v)FNrG6ic6Q=#;H*0#PuS0tnzLcGZI>RP4U3{K&E)_9AOJ~3K~#Cu939T) zmw)nS-#`80-~G+Wxz9i2wmwIrFpqA4)H{Iy3|c8UsL;3MmPD;@sS7#imUT)%w9tG@ zRqG&;hFb64=Wg4!-@$!Y%@2>MpAXEwkz@{l{a0Q1Fkj_mmL8+^ z +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⪼``RRG8r#nOV!C&&`tM7Jj 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 qdr=n~)ID88{GZ<+^yGSf#r`L{;1xWTI{x}SK Date: Tue, 8 Feb 2022 09:31:17 +0100 Subject: [PATCH 19/47] chore(optimistic): enable on Trader plugin --- packages/mask/src/plugins/Trader/base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mask/src/plugins/Trader/base.ts b/packages/mask/src/plugins/Trader/base.ts index 2c575a7ae707..c7b14dc54c48 100644 --- a/packages/mask/src/plugins/Trader/base.ts +++ b/packages/mask/src/plugins/Trader/base.ts @@ -23,6 +23,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Avalanche, ChainId.Fantom, + ChainId.Optimistic, ], }, }, From 635917a84ada0e2ffd8806ffa848fd67c7e6f2d8 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 8 Feb 2022 14:32:17 +0100 Subject: [PATCH 20/47] chore(optimism): fixed multicall address --- packages/web3-constants/evm/ethereum.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 5f0b87451803..4f8018fb2cf1 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -35,9 +35,9 @@ "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", - "Optimistic": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", - "Optimistic_Kovan": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", - "Optimistic_Goerli": "0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696", + "Optimistic": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", + "Optimistic_Kovan": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", + "Optimistic_Goerli": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", "Avalanche": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche_Fuji": "", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", From 5f64a23432487c65bd91254a24574881a19d15d0 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 9 Feb 2022 16:08:28 +0100 Subject: [PATCH 21/47] chore(optimistic): update uniswapV3 address --- packages/web3-constants/evm/ethereum.json | 2 +- packages/web3-constants/evm/trader.json | 10 +++++----- packages/web3-providers/src/zerion/format.ts | 2 +- packages/web3-shared/evm/assets/chains.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 4f8018fb2cf1..f06ab80a1f78 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -36,7 +36,7 @@ "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Optimistic": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", - "Optimistic_Kovan": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", + "Optimistic_Kovan": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", "Optimistic_Goerli": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", "Avalanche": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche_Fuji": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 1db487cdf4ad..b69d23d9eb39 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -127,7 +127,7 @@ "Arbitrum": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Arbitrum_Rinkeby": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "xDai": "", - "Optimistic": "0x1F98431c8aD98523631AE4a59f267346ea31F984", + "Optimistic": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f", "Optimistic_Kovan": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Optimistic_Goerli": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Avalanche": "", @@ -150,9 +150,9 @@ "Arbitrum": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Arbitrum_Rinkeby": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "xDai": "", - "Optimistic": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", - "Optimistic_Kovan": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", - "Optimistic_Goerli": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "Optimistic": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimistic_Kovan": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimistic_Goerli": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -196,7 +196,7 @@ "Arbitrum": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Arbitrum_Rinkeby": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "xDai": "", - "Optimistic": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Optimistic": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", "Optimistic_Kovan": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Optimistic_Goerli": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Avalanche": "", diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index f05b280dbbf2..90fc1bfa51d9 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -57,7 +57,7 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'OETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 7063e682f660..96a9034b5823 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -333,7 +333,7 @@ "features": [], "nativeCurrency": { "name": "Optimism Ether", - "symbol": "OETH", + "symbol": "ETH", "decimals": 18, "logoURI": "https://static.debank.com/image/token/logo_url/eth/935ae4e4d1d12d59a99717a24f2540b5.png" }, From 614a0590973272a6d02349e760a08304a16859d6 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 14 May 2022 15:26:42 +0100 Subject: [PATCH 22/47] feat(otimism): add ELK finance --- cspell.json | 3 +- .../src/plugins/Trader/apis/trader/index.ts | 20 ++- .../plugins/Trader/constants/elkfinance.ts | 37 +++++ .../src/plugins/Trader/constants/index.ts | 1 + packages/mask/src/plugins/Trader/pipes.ts | 1 + .../Trader/trader/useAllTradeComputed.ts | 8 + .../Trader/trader/useGetTradeContext.ts | 15 ++ .../plugins/Trader/trader/useTradeCallback.ts | 2 + .../mask/src/plugins/Trader/types/trader.ts | 1 + packages/public-api/src/web.ts | 1 + packages/web3-constants/evm/rpc.json | 2 +- packages/web3-constants/evm/token.json | 38 +++++ packages/web3-constants/evm/trader.json | 156 +++++++++++++++++- .../evm/constants/getContractOwnerDomain.ts | 1 + packages/web3-shared/evm/constants/tokens.ts | 1 + 15 files changed, 275 insertions(+), 12 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/elkfinance.ts diff --git a/cspell.json b/cspell.json index 6f2a66c2ff82..8a1938ae9997 100644 --- a/cspell.json +++ b/cspell.json @@ -64,6 +64,7 @@ "dklen", "dompurify", "ecsign", + "elkfinance", "endregion", "enhanceable", "ethersphere", @@ -127,9 +128,9 @@ "nums", "oeth", "opensea", - "optimistic", "openswap", "openx", + "optimistic", "overridable", "overscan", "pageable", diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 209cce5556b9..d1beb7bf340f 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -18,6 +18,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.BANCOR, TradeProvider.OPENOCEAN, TradeProvider.MDEX, + TradeProvider.ELKFINANCE, ] case NetworkType.Polygon: return [ @@ -28,6 +29,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.ZRX, TradeProvider.OPENOCEAN, TradeProvider.TRISOLARIS, + TradeProvider.ELKFINANCE, ] case NetworkType.Binance: return [ @@ -37,21 +39,26 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.ZRX, TradeProvider.OPENOCEAN, TradeProvider.MDEX, + TradeProvider.ELKFINANCE, ] case NetworkType.Arbitrum: - return [TradeProvider.UNISWAP_V3, TradeProvider.OPENOCEAN, TradeProvider.DODO] + return [TradeProvider.UNISWAP_V3, TradeProvider.OPENOCEAN, TradeProvider.ELKFINANCE, TradeProvider.DODO] case NetworkType.xDai: - return [TradeProvider.SUSHISWAP, TradeProvider.OPENOCEAN] + return [TradeProvider.SUSHISWAP, TradeProvider.ELKFINANCE, TradeProvider.OPENOCEAN] case NetworkType.Avalanche: - return [TradeProvider.SUSHISWAP, TradeProvider.OPENOCEAN, TradeProvider.TRADERJOE, TradeProvider.PANGOLIN] - case NetworkType.xDai: - return [TradeProvider.SUSHISWAP, TradeProvider.OPENOCEAN] + return [ + TradeProvider.SUSHISWAP, + TradeProvider.ELKFINANCE, + TradeProvider.OPENOCEAN, + TradeProvider.TRADERJOE, + TradeProvider.PANGOLIN, + ] case NetworkType.Celo: return [TradeProvider.SUSHISWAP] case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Optimistic: - return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED] + return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED, TradeProvider.ELKFINANCE] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: @@ -60,6 +67,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.VENOMSWAP, TradeProvider.OPENSWAP, TradeProvider.DEFIKINGDOMS, + TradeProvider.ELKFINANCE, ] case NetworkType.Boba: case NetworkType.Fuse: diff --git a/packages/mask/src/plugins/Trader/constants/elkfinance.ts b/packages/mask/src/plugins/Trader/constants/elkfinance.ts new file mode 100644 index 000000000000..d92f922cc65b --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/elkfinance.ts @@ -0,0 +1,37 @@ +import { + ChainId, + DAI, + RUNE, + USDC, + USDT, + fUSDT, + WBTC, + WNATIVE, + WNATIVE_ONLY, + NFTX, + STETH, + BUSD, + BTCB, + ELK, +} from '@masknet/web3-shared-evm' + +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const ELKFINANCE_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const ELKFINANCE_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC, RUNE, NFTX, STETH, ELK].map((x) => x[ChainId.Mainnet]), + [ChainId.Matic]: [WNATIVE, USDC, WBTC, DAI, USDT, ELK].map((x) => x[ChainId.Matic]), + [ChainId.BSC]: [WNATIVE, DAI, BUSD, USDC, USDT, BTCB, ELK].map((x) => x[ChainId.BSC]), + [ChainId.xDai]: [WNATIVE, USDC, USDT, WBTC, ELK].map((x) => x[ChainId.xDai]), + [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC, ELK].map((x) => x[ChainId.Fantom]), + [ChainId.Avalanche]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Avalanche]), + [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Harmony]), + [ChainId.Optimistic]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Optimistic]), + [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Arbitrum]), +} diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index eb05d0c7d638..707db1af0d18 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -18,4 +18,5 @@ export * from './venomswap' export * from './openswap' export * from './mdex' export * from './defikingdoms' +export * from './elkfinance' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 1d87da7356c0..7293a770cd91 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -45,6 +45,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index 88a54ba5acd4..b408f9b66e74 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -234,6 +234,13 @@ export function useAllTradeComputed( traderEstimateGas: mdexEstimateGas, } = useUniswapV2Like(tradeProviders, TradeProvider.MDEX, inputAmount_, inputToken, outputToken) + // Elk Finance + const { + trader_: elkfinance_, + trader: elkfinance, + traderEstimateGas: elkfinanceEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.ELKFINANCE, inputAmount_, inputToken, outputToken) + const allTradeResult = [ { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, @@ -254,6 +261,7 @@ export function useAllTradeComputed( { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, + { provider: TradeProvider.ELKFINANCE, ...elkfinance_, value: elkfinance, gas: elkfinanceEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 33f37fe185be..c6e6452b7b72 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -31,6 +31,8 @@ import { JUGGLERRED_CUSTOM_BASES, DEFIKINGDOMS_BASE_AGAINST_TOKENS, DEFIKINGDOMS_CUSTOM_BASES, + ELKFINANCE_BASE_AGAINST_TOKENS, + ELKFINANCE_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -235,6 +237,19 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: DEFIKINGDOMS_CUSTOM_BASES, } + case TradeProvider.ELKFINANCE: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.ELKFINANCE_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.ELKFINANCE_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_ROUTER_ADDRESS, + SPENDER_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_FACTORY_ADDRESS, + AGAINST_TOKENS: ELKFINANCE_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: ELKFINANCE_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index 0f6e8904b62a..23dcc4d42e97 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -110,6 +110,8 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.DEFIKINGDOMS: return uniswapV2Like + case TradeProvider.ELKFINANCE: + return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index 0c2da95efa02..7fd3f825d0c6 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -80,6 +80,7 @@ export enum ZrxTradePool { VenomSwap = 'VenomSwap', OpenSwap = 'OpenSwap', DefiKingdoms = 'DefiKingdoms', + ELkFinance = 'ElkFinance', } export interface TradeComputed { diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 0f4a088164e2..255f5ad8eb9a 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -198,6 +198,7 @@ export enum TradeProvider { OPENSWAP = 17, DEFIKINGDOMS = 18, JUGGLERRED = 19, + ELKFINANCE = 20, } /** Supported language settings */ diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index 4ba5d0292233..98afeb1cafcb 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -53,10 +53,10 @@ ], "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], + "xDai": ["https://rpc.gnosischain.com"], "Optimistic": ["https://mainnet.optimism.io"], "Optimistic_Kovan": ["https://kovan.optimism.io"], "Optimistic_Goerli": ["https://goerli.optimism.io"], - "xDai": ["https://rpc.gnosischain.com"], "Avalanche": ["https://api.avax.network/ext/bc/C/rpc"], "Avalanche_Fuji": ["https://api.avax-test.network/ext/bc/C/rpc"], "Celo": ["https://forno.celo.org"], diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 55b3a9d10850..51ed7d5a4fbf 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -51,6 +51,32 @@ "Harmony": "", "Harmony_Test": "" }, + "ELK_ADDRESS": { + "Mainnet": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "BSCT": "", + "Matic": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "Optimistic": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", + "Harmony_Test": "" + }, "USDC_ADDRESS": { "Mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "Ropsten": "0x0D9C8723B343A8368BebE0B5E89273fF8D712e3C", @@ -1234,6 +1260,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1257,6 +1286,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1280,6 +1312,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1303,6 +1338,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 45f402e0e36d..7d90e0e5dbbc 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1425,7 +1425,9 @@ "Fantom": "", "Aurora": "", "Aurora_Testnet": "", - "Conflux": "" + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" }, "JUGGLERRED_INIT_CODE_HASH": { "Mainnet": "", @@ -1449,7 +1451,9 @@ "Fantom": "", "Aurora": "", "Aurora_Testnet": "", - "Conflux": "" + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" }, "JUGGLERRED_ROUTER_ADDRESS": { "Mainnet": "", @@ -1473,7 +1477,9 @@ "Fantom": "", "Aurora": "", "Aurora_Testnet": "", - "Conflux": "" + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" }, "JUGGLERRED_FACTORY_ADDRESS": { "Mainnet": "", @@ -1497,7 +1503,9 @@ "Fantom": "", "Aurora": "", "Aurora_Testnet": "", - "Conflux": "" + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" }, "JUGGLERRED_THEGRAPH": { "Mainnet": "", @@ -1538,6 +1546,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1561,6 +1572,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1584,6 +1598,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1607,6 +1624,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1630,6 +1650,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1653,6 +1676,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1676,6 +1702,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1699,6 +1728,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1722,6 +1754,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1745,6 +1780,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1768,6 +1806,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1791,6 +1832,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1800,5 +1844,109 @@ "Conflux": "", "Harmony": "0xf1c21a825f13eff153022ddea53156462dd79972b6f88adf06f79ca8b042c3c1", "Harmony_Test": "" + }, + "ELKFINANCE_ROUTER_ADDRESS": { + "Mainnet": "0xb5e9F6C58f548CeE53257304e287b23757eFFCA1", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "0xA63B831264183D755756ca9AE5190fF5183d65D6", + "BSCT": "", + "Matic": "0xf38a7A7Ac2D745E2204c13F824c00139DF831FFf", + "Mumbai": "", + "Arbitrum": "0x0A2e5A3Dc2f74E5Bfaf0Bf90685A5A899f379Cb0", + "Arbitrum_Rinkeby": "", + "xDai": "0xe5759714998e8B50A33c7333C04C2d02e5dcE77f", + "Optimistic": "0xeadE97aFC8f79A8E5Ba85d57C4a4E629b1160C6A", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "0x9E4AAbd2B3E60Ee1322E94307d0776F2c8e6CFbb", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0x4D2cf285a519261F30b4d9c2c344Baf260d65Fa2", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0xbeA02dc919B08b5aE2158a8fBC60D4DA5640737B", + "Harmony_Test": "" + }, + "ELKFINANCE_FACTORY_ADDRESS": { + "Mainnet": "0x6511eBA915fC1b94b2364289CCa2b27AE5898d80", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "0x31aFfd875e9f68cd6Cd12Cee8943566c9A4bBA13", + "BSCT": "", + "Matic": "0xE3BD06c7ac7E1CeB17BdD2E5BA83E40D1515AF2a", + "Mumbai": "", + "Arbitrum": "0xA59B2044EAFD15ee4deF138D410d764c9023E1F0", + "Arbitrum_Rinkeby": "", + "xDai": "0xCB018587dA9590A18f49fFE2b85314c33aF3Ad3B", + "Optimistic": "0xedfad3a0F42A8920B011bb0332aDe632e552d846", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "0x091d35d7F63487909C863001ddCA481c6De47091", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0x7Ba73c99e6f01a37f3e33854c8F544BbbadD3420", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0xCdde1AbfF5Ae3Cbfbdb55c1e866Ac56380e18720", + "Harmony_Test": "" + }, + "ELKFINANCE_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ELKFINANCE_INIT_CODE_HASH": { + "Mainnet": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "BSCT": "", + "Matic": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Mumbai": "", + "Arbitrum": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Arbitrum_Rinkeby": "", + "xDai": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Optimistic": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts index ae6757dc5d64..7b789ce67822 100644 --- a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts +++ b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts @@ -47,6 +47,7 @@ const domainAddressMap: Record = { 'WANNASWAP_ROUTER_ADDRESS', 'WANNASWAP_FACTORY_ADDRESS', ]), + 'elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), 'www.trisolaris.io': collect(Trader, ['TRISOLARIS_ROUTER_ADDRESS', 'TRISOLARIS_FACTORY_ADDRESS']), 'mdex.com': collect(Trader, ['MDEX_ROUTER_ADDRESS', 'MDEX_FACTORY_ADDRESS']), 'aave.com': collect(Aave, ['AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS']), diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index 4c3273d7fbda..c7086b48db9f 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -48,6 +48,7 @@ export const PNG = createERC20Tokens('PNG_ADDRESS', 'Pangolin', 'PNG', 18) export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'Viper', 'VIPER', 18) export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX', 18) export const JEWEL = createERC20Tokens('JEWEL_ADDRESS', 'Jewels', 'JEWEL', 18) +export const ELK = createERC20Tokens('ELK_ADDRESS', 'Elk finance', 'ELK', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', From 26d5672446ba26034b1bcf4132cb3ccbeba75b39 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 14 May 2022 16:05:22 +0100 Subject: [PATCH 23/47] chore(otimism): fixed token list --- packages/web3-constants/evm/rpc.json | 5 ++++- packages/web3-constants/evm/token-list.json | 5 ++++- packages/web3-constants/evm/token.json | 10 +++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index 98afeb1cafcb..b8ede515bbfd 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -54,7 +54,10 @@ "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], "xDai": ["https://rpc.gnosischain.com"], - "Optimistic": ["https://mainnet.optimism.io"], + "Optimistic": [ + "https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN", + "https://mainnet.optimism.io" + ], "Optimistic_Kovan": ["https://kovan.optimism.io"], "Optimistic_Goerli": ["https://goerli.optimism.io"], "Avalanche": ["https://api.avax.network/ext/bc/C/rpc"], diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 40de50bfe847..895f7d32e914 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -12,7 +12,10 @@ "Arbitrum": ["https://tokens.r2d2.to/latest/42161/tokens.json"], "Arbitrum_Rinkeby": ["https://tokens.r2d2.to/latest/421611/tokens.json"], "xDai": ["https://tokens.r2d2.to/latest/100/tokens.json"], - "Optimistic": ["https://tokens.r2d2.to/latest/10/tokens.json"], + "Optimistic": [ + "https://static.optimism.io/optimism.tokenlist.json", + "https://tokens.r2d2.to/latest/10/tokens.json" + ], "Optimistic_Kovan": [], "Optimistic_Goerli": [], "Avalanche": ["https://tokens.r2d2.to/latest/43114/tokens.json"], diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 51ed7d5a4fbf..2f43446e21c9 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -90,7 +90,7 @@ "Arbitrum": "0xe865dF68133fcEd7c2285ff3896B406CAfAa2dB8", "Arbitrum_Rinkeby": "", "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", - "Optimistic": "0x7f5c764cbc14f9669b88837ca1490cca17c31607", + "Optimistic": "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Avalanche": "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664", @@ -116,7 +116,7 @@ "Arbitrum": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "Arbitrum_Rinkeby": "", "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", - "Optimistic": "0x94b008aa00579c1307b0ef2c499ad98a8ce58e58", + "Optimistic": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Avalanche": "0xc7198437980c041c805A1EDcbA50c1Ce5db95118", @@ -454,7 +454,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "Optimistic": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Avalanche": "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70", @@ -792,7 +792,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252", - "Optimistic": "0x68f180fcce6836688e9084f035309e29bf0a2095", + "Optimistic": "0x68f180fcCe6836688e9084f035309E29Bf0A2095", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Avalanche": "0x50b7545627a5162F82A992c33b87aDc75187B218", @@ -1806,7 +1806,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", + "Optimistic": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6", "Optimistic_Kovan": "", "Optimistic_Goerli": "", "Avalanche": "", From d9bebfb9a32324e8a6c390da40b4f3fb3faf7822 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 12:29:58 +0100 Subject: [PATCH 24/47] chore(optimism): change rpc --- packages/mask/src/plugins/RedPacket/base.ts | 1 - packages/web3-constants/evm/rpc.json | 5 +---- packages/web3-constants/evm/token-list.json | 1 + packages/web3-constants/evm/trader.json | 18 +++++++++--------- packages/web3-shared/evm/assets/chains.json | 3 +-- .../evm/constants/getContractOwnerDomain.ts | 3 ++- 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/packages/mask/src/plugins/RedPacket/base.ts b/packages/mask/src/plugins/RedPacket/base.ts index 0a93485e6ba7..1f0973f3e616 100644 --- a/packages/mask/src/plugins/RedPacket/base.ts +++ b/packages/mask/src/plugins/RedPacket/base.ts @@ -32,7 +32,6 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Harmony, ChainId.Conflux, - ChainId.Optimistic, ], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index b8ede515bbfd..baa9287d9c4e 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -54,10 +54,7 @@ "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], "xDai": ["https://rpc.gnosischain.com"], - "Optimistic": [ - "https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN", - "https://mainnet.optimism.io" - ], + "Optimistic": ["https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN"], "Optimistic_Kovan": ["https://kovan.optimism.io"], "Optimistic_Goerli": ["https://goerli.optimism.io"], "Avalanche": ["https://api.avax.network/ext/bc/C/rpc"], diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 895f7d32e914..4ba47bc81421 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -14,6 +14,7 @@ "xDai": ["https://tokens.r2d2.to/latest/100/tokens.json"], "Optimistic": [ "https://static.optimism.io/optimism.tokenlist.json", + "https://raw.githubusercontent.com/elkfinance/tokens/main/all.tokenlist.json", "https://tokens.r2d2.to/latest/10/tokens.json" ], "Optimistic_Kovan": [], diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 7d90e0e5dbbc..608b7a92afbe 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1924,29 +1924,29 @@ "Harmony_Test": "" }, "ELKFINANCE_INIT_CODE_HASH": { - "Mainnet": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Mainnet": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Ropsten": "", "Rinkeby": "", "Kovan": "", "Gorli": "", - "BSC": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "BSC": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "BSCT": "", - "Matic": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Matic": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Mumbai": "", - "Arbitrum": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Arbitrum": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Arbitrum_Rinkeby": "", - "xDai": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", - "Optimistic": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "xDai": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", + "Optimistic": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Optimistic_Kovan": "", "Optimistic_Goerli": "", - "Avalanche": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Avalanche": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Avalanche_Fuji": "", "Celo": "", - "Fantom": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Fantom": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9", + "Harmony": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 511ca6ee3944..047995ab6621 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -305,7 +305,6 @@ { "name": "Optimistic Ethereum", "chain": "Optimistic", - "fullName": "Optimism", "network": "mainnet", "features": [], "nativeCurrency": { @@ -313,7 +312,7 @@ "symbol": "OETH", "decimals": 18 }, - "infoURL": "https://optimism.io", + "infoURL": "https://optimistic.etherscan.io/", "shortName": "oeth", "chainId": 10, "explorers": [ diff --git a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts index 7b789ce67822..1d3fcef60fff 100644 --- a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts +++ b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts @@ -47,7 +47,8 @@ const domainAddressMap: Record = { 'WANNASWAP_ROUTER_ADDRESS', 'WANNASWAP_FACTORY_ADDRESS', ]), - 'elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), + 'legacy.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), + 'app.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), 'www.trisolaris.io': collect(Trader, ['TRISOLARIS_ROUTER_ADDRESS', 'TRISOLARIS_FACTORY_ADDRESS']), 'mdex.com': collect(Trader, ['MDEX_ROUTER_ADDRESS', 'MDEX_FACTORY_ADDRESS']), 'aave.com': collect(Aave, ['AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS']), From e355bf5ce3837b6facf4d19993c179968935bfc5 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 17:55:03 +0100 Subject: [PATCH 25/47] feat(optimism): add zipswap dex --- .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/constants/index.ts | 1 + .../src/plugins/Trader/constants/zipswap.ts | 15 +++ packages/mask/src/plugins/Trader/pipes.ts | 1 + .../Trader/trader/useAllTradeComputed.ts | 8 ++ .../Trader/trader/useGetTradeContext.ts | 15 +++ .../plugins/Trader/trader/useTradeCallback.ts | 2 + .../mask/src/plugins/Trader/types/trader.ts | 1 + packages/public-api/src/web.ts | 1 + packages/web3-constants/evm/token.json | 26 +++++ packages/web3-constants/evm/trader.json | 104 ++++++++++++++++++ .../evm/constants/getContractOwnerDomain.ts | 1 + packages/web3-shared/evm/constants/tokens.ts | 1 + 13 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 packages/mask/src/plugins/Trader/constants/zipswap.ts diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index d1beb7bf340f..ff0da7c2faed 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -58,7 +58,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Optimistic: - return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED, TradeProvider.ELKFINANCE] + return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED, TradeProvider.ELKFINANCE, TradeProvider.ZIPSWAP] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 707db1af0d18..58da114dc11d 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -19,4 +19,5 @@ export * from './openswap' export * from './mdex' export * from './defikingdoms' export * from './elkfinance' +export * from './zipswap' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/zipswap.ts b/packages/mask/src/plugins/Trader/constants/zipswap.ts new file mode 100644 index 000000000000..68d7602319a5 --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/zipswap.ts @@ -0,0 +1,15 @@ +import { ChainId, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY, ZIP } from '@masknet/web3-shared-evm' + +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const ZIPSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const ZIPSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Optimistic]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Optimistic]), + [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Arbitrum]), +} diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 7293a770cd91..7f11ed0f8159 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -46,6 +46,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index b408f9b66e74..4a467e2b187a 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -241,6 +241,13 @@ export function useAllTradeComputed( traderEstimateGas: elkfinanceEstimateGas, } = useUniswapV2Like(tradeProviders, TradeProvider.ELKFINANCE, inputAmount_, inputToken, outputToken) + // ZipSwap + const { + trader_: zipswap_, + trader: zipswap, + traderEstimateGas: zipswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.ZIPSWAP, inputAmount_, inputToken, outputToken) + const allTradeResult = [ { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, @@ -262,6 +269,7 @@ export function useAllTradeComputed( { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, { provider: TradeProvider.ELKFINANCE, ...elkfinance_, value: elkfinance, gas: elkfinanceEstimateGas }, + { provider: TradeProvider.ZIPSWAP, ...zipswap_, value: zipswap, gas: zipswapEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index c6e6452b7b72..1a48945fe14b 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -33,6 +33,8 @@ import { DEFIKINGDOMS_CUSTOM_BASES, ELKFINANCE_BASE_AGAINST_TOKENS, ELKFINANCE_CUSTOM_BASES, + ZIPSWAP_BASE_AGAINST_TOKENS, + ZIPSWAP_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -250,6 +252,19 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: ELKFINANCE_CUSTOM_BASES, } + case TradeProvider.ZIPSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.ZIPSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.ZIPSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_ROUTER_ADDRESS, + SPENDER_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: ZIPSWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: ZIPSWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index 23dcc4d42e97..ea905dfe7150 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -112,6 +112,8 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.ELKFINANCE: return uniswapV2Like + case TradeProvider.ZIPSWAP: + return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index 7fd3f825d0c6..8374e73730ef 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -81,6 +81,7 @@ export enum ZrxTradePool { OpenSwap = 'OpenSwap', DefiKingdoms = 'DefiKingdoms', ELkFinance = 'ElkFinance', + ZipSwap = 'ZipSwap', } export interface TradeComputed { diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 255f5ad8eb9a..dfec2d6dee54 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -199,6 +199,7 @@ export enum TradeProvider { DEFIKINGDOMS = 18, JUGGLERRED = 19, ELKFINANCE = 20, + ZIPSWAP = 21, } /** Supported language settings */ diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 2f43446e21c9..85a55978e27b 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -2780,5 +2780,31 @@ "Conflux": "0x0000000000000000000000000000000000000000", "Harmony": "", "Harmony_Test": "" + }, + "ZIP_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "0xFA436399d0458Dbe8aB890c3441256E3E09022a8", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 608b7a92afbe..4f0e6c9837f1 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1948,5 +1948,109 @@ "Conflux": "", "Harmony": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Harmony_Test": "" + }, + "ZIPSWAP_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "0x4D70D768f5E1e6a7062973aFB0c7FBDa9bBb42b3", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "0xE6Df0BB08e5A97b40B21950a0A51b94c4DbA0Ff6", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ZIPSWAP_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "0x9e343Bea27a12B23523ad88333a1B0f68cc1F05E", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "0x8BCeDD62DD46F1A76F8A1633d4f5B76e0CDa521E", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ZIPSWAP_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "ZIPSWAP_INIT_CODE_HASH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimistic": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", + "Optimistic_Kovan": "", + "Optimistic_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts index 1d3fcef60fff..13791dbb4639 100644 --- a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts +++ b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts @@ -49,6 +49,7 @@ const domainAddressMap: Record = { ]), 'legacy.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), 'app.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), + 'zipswap.fi': collect(Trader, ['ZIPSWAP_ROUTER_ADDRESS', 'ZIPSWAP_FACTORY_ADDRESS']), 'www.trisolaris.io': collect(Trader, ['TRISOLARIS_ROUTER_ADDRESS', 'TRISOLARIS_FACTORY_ADDRESS']), 'mdex.com': collect(Trader, ['MDEX_ROUTER_ADDRESS', 'MDEX_FACTORY_ADDRESS']), 'aave.com': collect(Aave, ['AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS']), diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index c7086b48db9f..8ad49f046407 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -49,6 +49,7 @@ export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'Viper', 'VIPER', 18) export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX', 18) export const JEWEL = createERC20Tokens('JEWEL_ADDRESS', 'Jewels', 'JEWEL', 18) export const ELK = createERC20Tokens('ELK_ADDRESS', 'Elk finance', 'ELK', 18) +export const ZIP = createERC20Tokens('ZIP_ADDRESS', 'ZipSwap', 'ZIP', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', From f0c8b67f77fad8dbe30c9514559290ecda5fa3b2 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 19:35:03 +0100 Subject: [PATCH 26/47] chore(optmism): change name "Optimistic" to Optmism and add support Op Token --- packages/mask/shared/flags.ts | 2 +- .../mask/src/plugins/EVM/assets/optimism.png | Bin 0 -> 42536 bytes packages/mask/src/plugins/EVM/constants.ts | 10 +- packages/mask/src/plugins/FindTruman/base.ts | 2 +- packages/mask/src/plugins/ITO/base.ts | 2 +- packages/mask/src/plugins/NextID/base.ts | 2 +- packages/mask/src/plugins/Pets/base.tsx | 1 + packages/mask/src/plugins/RedPacket/base.ts | 2 +- packages/mask/src/plugins/Savings/base.ts | 2 +- .../src/plugins/Trader/apis/trader/index.ts | 2 +- packages/mask/src/plugins/Trader/base.ts | 2 +- .../mask/src/plugins/Trader/constants/0x.ts | 4 +- .../mask/src/plugins/Trader/constants/dodo.ts | 4 +- .../plugins/Trader/constants/elkfinance.ts | 2 +- .../plugins/Trader/constants/jugglerred.ts | 4 +- .../src/plugins/Trader/constants/openocean.ts | 4 +- .../src/plugins/Trader/constants/uniswap.ts | 4 +- .../src/plugins/Trader/constants/zipswap.ts | 2 +- .../src/plugins/Trader/trader/0x/useTrade.ts | 2 +- .../mask/src/plugins/UnlockProtocol/base.ts | 2 +- .../src/plugins/UnlockProtocol/constants.ts | 2 +- .../src/plugins/Wallet/services/account.ts | 2 +- .../src/plugins/Wallet/services/assets.ts | 2 +- packages/public-api/src/web.ts | 2 +- packages/web3-constants/compile-constants.ts | 6 +- packages/web3-constants/evm/aave.json | 18 +- packages/web3-constants/evm/airdrop.json | 6 +- packages/web3-constants/evm/artblocks.json | 6 +- packages/web3-constants/evm/coingecko.json | 12 +- .../web3-constants/evm/coinmarketcap.json | 6 +- packages/web3-constants/evm/cryptoartai.json | 18 +- packages/web3-constants/evm/debank.json | 6 +- packages/web3-constants/evm/dhedge.json | 12 +- packages/web3-constants/evm/ethereum.json | 24 +- packages/web3-constants/evm/explorer.json | 12 +- packages/web3-constants/evm/gitcoin.json | 24 +- .../web3-constants/evm/good-ghosting.json | 12 +- packages/web3-constants/evm/ito.json | 42 +- packages/web3-constants/evm/lbp.json | 6 +- packages/web3-constants/evm/lido.json | 12 +- packages/web3-constants/evm/mask-box.json | 12 +- .../web3-constants/evm/nft-red-packet.json | 12 +- packages/web3-constants/evm/openocean.json | 6 +- packages/web3-constants/evm/opensea-api.json | 18 +- packages/web3-constants/evm/pooltogether.json | 12 +- packages/web3-constants/evm/red-packet.json | 36 +- packages/web3-constants/evm/rpc.json | 12 +- .../evm/space-station-galaxy.json | 12 +- .../evm/token-asset-base-url.json | 6 +- packages/web3-constants/evm/token-list.json | 7 +- packages/web3-constants/evm/token.json | 674 +++++++++--------- packages/web3-constants/evm/trader.json | 474 ++++++------ packages/web3-constants/evm/trending.json | 18 +- packages/web3-constants/evm/zerion.json | 12 +- packages/web3-providers/src/zerion/format.ts | 3 +- packages/web3-providers/src/zerion/index.ts | 2 +- packages/web3-shared/evm/assets/chains.json | 18 +- packages/web3-shared/evm/constants/tokens.ts | 5 +- packages/web3-shared/evm/pipes/index.ts | 16 +- packages/web3-shared/evm/types/index.ts | 10 +- .../web3-shared/evm/utils/chainDetailed.ts | 6 +- 61 files changed, 842 insertions(+), 814 deletions(-) create mode 100644 packages/mask/src/plugins/EVM/assets/optimism.png diff --git a/packages/mask/shared/flags.ts b/packages/mask/shared/flags.ts index 01948c9e7935..02eb487dfd71 100644 --- a/packages/mask/shared/flags.ts +++ b/packages/mask/shared/flags.ts @@ -33,7 +33,7 @@ export const Flags = { polygon_enabled: true, arbitrum_enabled: true, xdai_enabled: true, - optimistic_enabled: true, + Optimism_enabled: true, avalanche_enabled: true, fantom_enabled: true, celo_enabled: true, diff --git a/packages/mask/src/plugins/EVM/assets/optimism.png b/packages/mask/src/plugins/EVM/assets/optimism.png new file mode 100644 index 0000000000000000000000000000000000000000..d88f2fcd2c20b98c5b695cad3c7509ac1a43dd49 GIT binary patch literal 42536 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 X0MW`4|Y2yS8P`gIHS$_6`>td9_+ac|?% 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 literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/EVM/constants.ts b/packages/mask/src/plugins/EVM/constants.ts index dfa00d12dd2e..2cad394b27ca 100644 --- a/packages/mask/src/plugins/EVM/constants.ts +++ b/packages/mask/src/plugins/EVM/constants.ts @@ -146,12 +146,12 @@ export const PLUGIN_NETWORKS: Web3Plugin.NetworkDescriptor[] = [ isMainnet: true, }, { - ID: `${PLUGIN_ID}_optimistic`, + ID: `${PLUGIN_ID}_optimism`, networkSupporterPluginID: PLUGIN_ID, - chainId: ChainId.Optimistic, - type: NetworkType.Optimistic, - name: 'Optimistic', - icon: new URL('./assets/optimistic.png', import.meta.url), + chainId: ChainId.Optimism, + type: NetworkType.Optimism, + name: 'Optimism', + icon: new URL('./assets/optimism.png', import.meta.url), iconColor: 'rgb(254, 5, 33)', isMainnet: true, }, diff --git a/packages/mask/src/plugins/FindTruman/base.ts b/packages/mask/src/plugins/FindTruman/base.ts index 01c40848a1cb..17e270a04b26 100644 --- a/packages/mask/src/plugins/FindTruman/base.ts +++ b/packages/mask/src/plugins/FindTruman/base.ts @@ -26,7 +26,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Avalanche, ChainId.Aurora, ChainId.Conflux, - ChainId.Optimistic, + ChainId.Optimism, ChainId.Harmony, ], }, diff --git a/packages/mask/src/plugins/ITO/base.ts b/packages/mask/src/plugins/ITO/base.ts index 7172a9a58d48..d6321ca05ab2 100644 --- a/packages/mask/src/plugins/ITO/base.ts +++ b/packages/mask/src/plugins/ITO/base.ts @@ -28,7 +28,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Avalanche, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ChainId.Harmony, ], }, diff --git a/packages/mask/src/plugins/NextID/base.ts b/packages/mask/src/plugins/NextID/base.ts index 431137169a0c..79a63cc972d5 100644 --- a/packages/mask/src/plugins/NextID/base.ts +++ b/packages/mask/src/plugins/NextID/base.ts @@ -31,7 +31,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Fantom, ChainId.Harmony, ChainId.Conflux, - ChainId.Optimistic, + ChainId.Optimism, ], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, diff --git a/packages/mask/src/plugins/Pets/base.tsx b/packages/mask/src/plugins/Pets/base.tsx index 732ca96c2691..970004c2d648 100644 --- a/packages/mask/src/plugins/Pets/base.tsx +++ b/packages/mask/src/plugins/Pets/base.tsx @@ -25,6 +25,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Avalanche, ChainId.Aurora, ChainId.Conflux, + ChainId.Optimism, ], }, }, diff --git a/packages/mask/src/plugins/RedPacket/base.ts b/packages/mask/src/plugins/RedPacket/base.ts index 1f0973f3e616..4f6d53b83162 100644 --- a/packages/mask/src/plugins/RedPacket/base.ts +++ b/packages/mask/src/plugins/RedPacket/base.ts @@ -27,7 +27,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Arbitrum, ChainId.xDai, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ChainId.Avalanche, ChainId.Aurora, ChainId.Harmony, diff --git a/packages/mask/src/plugins/Savings/base.ts b/packages/mask/src/plugins/Savings/base.ts index 62ba87ea5e4d..526e796a093c 100644 --- a/packages/mask/src/plugins/Savings/base.ts +++ b/packages/mask/src/plugins/Savings/base.ts @@ -28,7 +28,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Avalanche, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ChainId.Harmony, ], }, diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index ff0da7c2faed..c5e046a4ca0e 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -57,7 +57,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { return [TradeProvider.SUSHISWAP] case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] - case NetworkType.Optimistic: + case NetworkType.Optimism: return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED, TradeProvider.ELKFINANCE, TradeProvider.ZIPSWAP] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] diff --git a/packages/mask/src/plugins/Trader/base.ts b/packages/mask/src/plugins/Trader/base.ts index b101fb5d7638..b005bd984935 100644 --- a/packages/mask/src/plugins/Trader/base.ts +++ b/packages/mask/src/plugins/Trader/base.ts @@ -23,7 +23,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Avalanche, ChainId.Fantom, - ChainId.Optimistic, + ChainId.Optimism, ChainId.Harmony, ], }, diff --git a/packages/mask/src/plugins/Trader/constants/0x.ts b/packages/mask/src/plugins/Trader/constants/0x.ts index 4ff138570ac4..6c1c218e1456 100644 --- a/packages/mask/src/plugins/Trader/constants/0x.ts +++ b/packages/mask/src/plugins/Trader/constants/0x.ts @@ -6,7 +6,7 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Polygon]: 'https://polygon.api.0x.org/', [NetworkType.Arbitrum]: 'https://arbitrum.api.0x.org/', [NetworkType.xDai]: 'https://xdai.api.0x.org/', - [NetworkType.Optimistic]: 'https://optimistic.api.0x.org/', + [NetworkType.Optimism]: 'https://Optimism.api.0x.org/', [NetworkType.Avalanche]: 'https://avalanche.api.0x.org/', [NetworkType.Celo]: 'https://celo.api.0x.org/', [NetworkType.Fantom]: 'https://fantom.api.0x.org/', @@ -14,7 +14,7 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', - [NetworkType.Optimistic]: '', + [NetworkType.Optimism]: '', [NetworkType.Harmony]: '', [NetworkType.Conflux]: '', } diff --git a/packages/mask/src/plugins/Trader/constants/dodo.ts b/packages/mask/src/plugins/Trader/constants/dodo.ts index 03a80878b0fd..a01e52cb9cee 100644 --- a/packages/mask/src/plugins/Trader/constants/dodo.ts +++ b/packages/mask/src/plugins/Trader/constants/dodo.ts @@ -8,7 +8,7 @@ export const networkNames: Record = { [NetworkType.Polygon]: 'matic', [NetworkType.Arbitrum]: 'arbitrum', [NetworkType.xDai]: 'xdai', - [NetworkType.Optimistic]: 'optimistic', + [NetworkType.Optimism]: 'Optimism', [NetworkType.Avalanche]: 'avalanche', [NetworkType.Celo]: 'celo', [NetworkType.Fantom]: 'fantom', @@ -16,7 +16,7 @@ export const networkNames: Record = { [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', - [NetworkType.Optimistic]: '', + [NetworkType.Optimism]: '', [NetworkType.Harmony]: 'harmony', [NetworkType.Conflux]: '', } diff --git a/packages/mask/src/plugins/Trader/constants/elkfinance.ts b/packages/mask/src/plugins/Trader/constants/elkfinance.ts index d92f922cc65b..9ee7af670586 100644 --- a/packages/mask/src/plugins/Trader/constants/elkfinance.ts +++ b/packages/mask/src/plugins/Trader/constants/elkfinance.ts @@ -32,6 +32,6 @@ export const ELKFINANCE_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC, ELK].map((x) => x[ChainId.Fantom]), [ChainId.Avalanche]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Avalanche]), [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Harmony]), - [ChainId.Optimistic]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Optimistic]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Optimism]), [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Arbitrum]), } diff --git a/packages/mask/src/plugins/Trader/constants/jugglerred.ts b/packages/mask/src/plugins/Trader/constants/jugglerred.ts index 92a4fb64120e..271bab0c101e 100644 --- a/packages/mask/src/plugins/Trader/constants/jugglerred.ts +++ b/packages/mask/src/plugins/Trader/constants/jugglerred.ts @@ -9,6 +9,6 @@ export const JUGGLERRED_CUSTOM_BASES: ERC20TokenCustomizedBase = {} export const JUGGLERRED_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, - [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), - [ChainId.Optimistic_Kovan]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic_Kovan]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism]), + [ChainId.Optimism_Kovan]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism_Kovan]), } diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index 3e4f6dc78562..020fdd6ba702 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -15,8 +15,8 @@ export const networkNames: Record = { [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', - [NetworkType.Optimistic]: 'optimistic', - [NetworkType.Optimistic]: '', + [NetworkType.Optimism]: 'Optimism', + [NetworkType.Optimism]: '', [NetworkType.Harmony]: '', [NetworkType.Conflux]: '', } diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index 8f7fa6cd2e60..239ec3cfff6d 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -1,4 +1,4 @@ -import { ChainId, AMPL, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' +import { ChainId, AMPL, DAI, USDC, USDT, WBTC, OP, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' import { Percent } from '@uniswap/sdk-core' import JSBI from 'jsbi' import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' @@ -20,7 +20,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), - [ChainId.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC, OP].map((x) => x[ChainId.Optimism]), } export const MAX_HOP = 3 diff --git a/packages/mask/src/plugins/Trader/constants/zipswap.ts b/packages/mask/src/plugins/Trader/constants/zipswap.ts index 68d7602319a5..4856aa4a6f82 100644 --- a/packages/mask/src/plugins/Trader/constants/zipswap.ts +++ b/packages/mask/src/plugins/Trader/constants/zipswap.ts @@ -10,6 +10,6 @@ export const ZIPSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} export const ZIPSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, - [ChainId.Optimistic]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Optimistic]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Optimism]), [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Arbitrum]), } diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts index 84c7e8c513d2..bccf89bc587b 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts @@ -33,7 +33,7 @@ export function getNativeTokenLabel(networkType: NetworkType) { case NetworkType.Fuse: case NetworkType.Metis: case NetworkType.Avalanche: - case NetworkType.Optimistic: + case NetworkType.Optimism: case NetworkType.Harmony: case NetworkType.Conflux: return NATIVE_TOKEN_ADDRESS diff --git a/packages/mask/src/plugins/UnlockProtocol/base.ts b/packages/mask/src/plugins/UnlockProtocol/base.ts index dd3bf9515193..47e16efb09fc 100644 --- a/packages/mask/src/plugins/UnlockProtocol/base.ts +++ b/packages/mask/src/plugins/UnlockProtocol/base.ts @@ -14,7 +14,7 @@ export const base: Plugin.Shared.Definition = { target: 'insider', web3: { [NetworkPluginID.PLUGIN_EVM]: { - supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimistic], + supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimism], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, [NetworkPluginID.PLUGIN_SOLANA]: { supportedChainIds: [] }, diff --git a/packages/mask/src/plugins/UnlockProtocol/constants.ts b/packages/mask/src/plugins/UnlockProtocol/constants.ts index 373bcc6e05a2..cc14b5699069 100644 --- a/packages/mask/src/plugins/UnlockProtocol/constants.ts +++ b/packages/mask/src/plugins/UnlockProtocol/constants.ts @@ -12,7 +12,7 @@ export const graphEndpointKeyVal = { [ChainId.xDai]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/xdai', [ChainId.Matic]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/polygon', [ChainId.Avalanche]: '', - [ChainId.Optimistic]: '', + [ChainId.Optimism]: '', } export const keyServerEndpoint = 'https://unlock.r2d2.to/' diff --git a/packages/mask/src/plugins/Wallet/services/account.ts b/packages/mask/src/plugins/Wallet/services/account.ts index 88b081c5903a..416050aba793 100644 --- a/packages/mask/src/plugins/Wallet/services/account.ts +++ b/packages/mask/src/plugins/Wallet/services/account.ts @@ -124,7 +124,7 @@ export async function getSupportedNetworks() { Flags.polygon_enabled ? NetworkType.Polygon : undefined, Flags.arbitrum_enabled ? NetworkType.Arbitrum : undefined, Flags.xdai_enabled ? NetworkType.xDai : undefined, - Flags.optimistic_enabled ? NetworkType.Optimistic : undefined, + Flags.Optimism_enabled ? NetworkType.Optimism : undefined, Flags.celo_enabled ? NetworkType.Celo : undefined, Flags.fantom_enabled ? NetworkType.Fantom : undefined, Flags.avalanche_enabled ? NetworkType.Avalanche : undefined, diff --git a/packages/mask/src/plugins/Wallet/services/assets.ts b/packages/mask/src/plugins/Wallet/services/assets.ts index f0aaa23429b7..a018541cc4ab 100644 --- a/packages/mask/src/plugins/Wallet/services/assets.ts +++ b/packages/mask/src/plugins/Wallet/services/assets.ts @@ -107,7 +107,7 @@ export async function getAssetsList( // xdai-assets is not support const scopes = network ? [resolveZerionAssetsScopeName(network)] - : ['assets', 'bsc-assets', 'polygon-assets', 'arbitrum-assets', 'avalanche-assets', 'optimistic-assets'] + : ['assets', 'bsc-assets', 'polygon-assets', 'arbitrum-assets', 'avalanche-assets', 'Optimism-assets'] for (const scope of scopes) { const { meta, payload } = await ZerionAPI.getAssetsList(address, scope) if (meta.status !== 'ok') throw new Error('Fail to load assets.') diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index dfec2d6dee54..4d8166d42588 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -237,7 +237,7 @@ export enum NetworkType { Boba = 'Boba', Fuse = 'Fuse', Metis = 'Metis', - Optimistic = 'Optimistic', + Optimism = 'Optimism', Harmony = 'Harmony', Conflux = 'Conflux', } diff --git a/packages/web3-constants/compile-constants.ts b/packages/web3-constants/compile-constants.ts index 02aa9b62652e..c34702a1cb4c 100644 --- a/packages/web3-constants/compile-constants.ts +++ b/packages/web3-constants/compile-constants.ts @@ -53,9 +53,9 @@ compileConstants(path.join(__dirname, 'evm'), [ 'Arbitrum', 'Arbitrum_Rinkeby', 'xDai', - 'Optimistic', - 'Optimistic_Kovan', - 'Optimistic_Goerli', + 'Optimism', + 'Optimism_Kovan', + 'Optimism_Goerli', 'Avalanche', 'Avalanche_Fuji', 'Celo', diff --git a/packages/web3-constants/evm/aave.json b/packages/web3-constants/evm/aave.json index 2e5fd3558d07..0bf55e3c6776 100644 --- a/packages/web3-constants/evm/aave.json +++ b/packages/web3-constants/evm/aave.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/airdrop.json b/packages/web3-constants/evm/airdrop.json index 721f64d023bb..ffa11a8b10b9 100644 --- a/packages/web3-constants/evm/airdrop.json +++ b/packages/web3-constants/evm/airdrop.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/artblocks.json b/packages/web3-constants/evm/artblocks.json index 0b4f00f8d71e..eb93664c92f4 100644 --- a/packages/web3-constants/evm/artblocks.json +++ b/packages/web3-constants/evm/artblocks.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index 37077ff91677..60978bbcfeec 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -12,9 +12,9 @@ "Arbitrum": "arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Optimistic": "optimistic-ethereum", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "optimistic-ethereum", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "avalanche", "Avalanche_Fuji": "", "Celo": "celo", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Optimistic": "ethereum", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "ethereum", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "avalanche-2", "Avalanche_Fuji": "", "Celo": "celo", diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index d96031ddbee6..128110d4e2ca 100644 --- a/packages/web3-constants/evm/coinmarketcap.json +++ b/packages/web3-constants/evm/coinmarketcap.json @@ -12,9 +12,9 @@ "Arbitrum": "11841", "Arbitrum_Rinkeby": "", "xDai": "5601", - "Optimistic": "10", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "10", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "43114", "Avalanche_Fuji": "", "Celo": "5567", diff --git a/packages/web3-constants/evm/cryptoartai.json b/packages/web3-constants/evm/cryptoartai.json index eaa3dc074dad..75d55cd32818 100644 --- a/packages/web3-constants/evm/cryptoartai.json +++ b/packages/web3-constants/evm/cryptoartai.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index 832a1de323ad..7580c816c580 100644 --- a/packages/web3-constants/evm/debank.json +++ b/packages/web3-constants/evm/debank.json @@ -12,9 +12,9 @@ "Arbitrum": "arb", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Optimistic": "op", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "op", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "avax", "Avalanche_Fuji": "", "Celo": "celo", diff --git a/packages/web3-constants/evm/dhedge.json b/packages/web3-constants/evm/dhedge.json index 4baeaa3c8b2f..3b32d4bfcd3d 100644 --- a/packages/web3-constants/evm/dhedge.json +++ b/packages/web3-constants/evm/dhedge.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "https://app.dhedge.org", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "https://app.dhedge.org", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "https://api-v2.dhedge.org/graphql", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "https://api-v2.dhedge.org/graphql", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 1b8be217d110..134e44fc9307 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -12,9 +12,9 @@ "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", - "Optimistic": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", - "Optimistic_Kovan": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", - "Optimistic_Goerli": "", + "Optimism": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", + "Optimism_Kovan": "0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC", + "Optimism_Goerli": "", "Avalanche": "0xC119574D5Fb333F5AC018658D4d8b5035E16bf39", "Avalanche_Fuji": "", "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", @@ -38,9 +38,9 @@ "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", - "Optimistic": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", - "Optimistic_Kovan": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", - "Optimistic_Goerli": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", + "Optimism": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", + "Optimism_Kovan": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", + "Optimism_Goerli": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", "Avalanche": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche_Fuji": "", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -90,9 +90,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 584e3a043bf7..257fc3acf475 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -12,9 +12,9 @@ "Arbitrum": ["BE8VU1P9FUKRT15FBHKQMU84829VITWWF2"], "Arbitrum_Rinkeby": [], "xDai": [], - "Optimistic": [], - "Optimistic_Kovan": [], - "Optimistic_Goerli": [], + "Optimism": [], + "Optimism_Kovan": [], + "Optimism_Goerli": [], "Avalanche": [], "Avalanche_Fuji": [], "Celo": [], @@ -38,9 +38,9 @@ "Arbitrum": "https://api.arbiscan.io/api", "Arbitrum_Rinkeby": "", "xDai": "https://blockscout.com/xdai/mainnet/api", - "Optimistic": "https://api-optimistic.etherscan.io/api", - "Optimistic_Kovan": "https://kovan-optimistic.etherscan.io", - "Optimistic_Goerli": "https://goerli-optimistic.etherscan.io", + "Optimism": "https://api-Optimism.etherscan.io/api", + "Optimism_Kovan": "https://kovan-Optimism.etherscan.io", + "Optimism_Goerli": "https://goerli-Optimism.etherscan.io", "Avalanche": "https://api.snowtrace.io/api", "Avalanche_Fuji": "https://api-testnet.snowtrace.io/api", "Celo": "https://explorer.celo.org/api", diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index 67db4bfa3fe0..225bf27c7fe9 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -90,9 +90,9 @@ "Arbitrum": 5, "Arbitrum_Rinkeby": 5, "xDai": 5, - "Optimistic": 5, - "Optimistic_Kovan": 0, - "Optimistic_Goerli": 0, + "Optimism": 5, + "Optimism_Kovan": 0, + "Optimism_Goerli": 0, "Avalanche": 5, "Avalanche_Fuji": 0, "Celo": 0, diff --git a/packages/web3-constants/evm/good-ghosting.json b/packages/web3-constants/evm/good-ghosting.json index d2c0f04857a8..3ae13683d3e6 100644 --- a/packages/web3-constants/evm/good-ghosting.json +++ b/packages/web3-constants/evm/good-ghosting.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 16f54792caa1..0208dbb59b0e 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", - "Optimistic": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", - "Optimistic_Kovan": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", - "Optimistic_Goerli": "", + "Optimism": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", + "Optimism_Kovan": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", + "Optimism_Goerli": "", "Avalanche": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", "Avalanche_Fuji": "0xf5056B96ab242C566002852d0b98ce0BcDf1af51", "Celo": "0xaA5bfd7355637eA7405CB194a55303e821c4c569", @@ -90,9 +90,9 @@ "Arbitrum": 102022, "Arbitrum_Rinkeby": 708696, "xDai": 17865755, - "Optimistic": 8994, - "Optimistic_Kovan": 0, - "Optimistic_Goerli": 0, + "Optimism": 8994, + "Optimism_Kovan": 0, + "Optimism_Goerli": 0, "Avalanche": 8289892, "Avalanche_Fuji": 4751103, "Celo": 10278776, @@ -116,9 +116,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", "Avalanche_Fuji": "", "Celo": "", @@ -142,9 +142,9 @@ "Arbitrum": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", "Arbitrum_Rinkeby": "0xEbd753E66649C824241E63894301BA8Db5DBF5Bb", "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", - "Optimistic": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", "Avalanche_Fuji": "", "Celo": "0x2cB220F925E603A04BEE05F210252120deBA29d7", @@ -168,9 +168,9 @@ "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-xdai", - "Optimistic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-optimistic", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-Optimism", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-avalanche", "Avalanche_Fuji": "", "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-celo", diff --git a/packages/web3-constants/evm/lbp.json b/packages/web3-constants/evm/lbp.json index a9c116577ff1..af317dfe6376 100644 --- a/packages/web3-constants/evm/lbp.json +++ b/packages/web3-constants/evm/lbp.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/lido.json b/packages/web3-constants/evm/lido.json index 8bbcd723007c..17fc27cb4c3a 100644 --- a/packages/web3-constants/evm/lido.json +++ b/packages/web3-constants/evm/lido.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "0x934b510d4c9103e6a87aef13b816fb080286d649", "Arbitrum_Rinkeby": "0x934b510d4c9103e6a87aef13b816fb080286d649", "xDai": "0x934b510d4c9103e6a87aef13b816fb080286d649", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x934b510d4c9103e6a87aef13b816fb080286d649", "Avalanche_Fuji": "0x934b510d4c9103e6a87aef13b816fb080286d649", "Celo": "0x934b510d4c9103e6a87aef13b816fb080286d649", diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index ecd6d19105d4..00151738ec1a 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x9D205B3A1B2724d545Ca7e3717ea629b9844401a", - "Optimistic_Kovan": "0xdb93ccd481012bb5d1e2c8d0af7c5f2940c00fdc", - "Optimistic_Goerli": "", + "Optimism": "0x9D205B3A1B2724d545Ca7e3717ea629b9844401a", + "Optimism_Kovan": "0xdb93ccd481012bb5d1e2c8d0af7c5f2940c00fdc", + "Optimism_Goerli": "", "Avalanche": "0x05ee315E407C21a594f807D61d6CC11306D1F149", "Avalanche_Fuji": "0xae5c53294003f72b27cef476680979453193673d", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": 0, "Arbitrum_Rinkeby": 0, "xDai": 0, - "Optimistic": 2283229, - "Optimistic_Kovan": 0, - "Optimistic_Goerli": 0, + "Optimism": 2283229, + "Optimism_Kovan": 0, + "Optimism_Goerli": 0, "Avalanche": 8351767, "Avalanche_Fuji": 4752026, "Celo": 0, diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index d9a8b4cc84a4..8fea7f5a9378 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0xC86e48D8FE6E8b999840927859290F4e41bDa779", - "Optimistic_Kovan": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", - "Optimistic_Goerli": "", + "Optimism": "0xC86e48D8FE6E8b999840927859290F4e41bDa779", + "Optimism_Kovan": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", + "Optimism_Goerli": "", "Avalanche": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", "Avalanche_Fuji": "0x5de932BD252DD79231C9eDB5F2e30D488B785109", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-op", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-op", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-avalanche", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/openocean.json b/packages/web3-constants/evm/openocean.json index d2a55e9b6baf..76bc36a20122 100644 --- a/packages/web3-constants/evm/openocean.json +++ b/packages/web3-constants/evm/openocean.json @@ -12,9 +12,9 @@ "Arbitrum": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Arbitrum_Rinkeby": "", "xDai": "0x934B510D4C9103E6a87AEf13b816fb080286D649", - "Optimistic": "0x934B510D4C9103E6a87AEf13b816fb080286D649", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x934B510D4C9103E6a87AEf13b816fb080286D649", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Avalanche_Fuji": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Celo": "0x934B510D4C9103E6a87AEf13b816fb080286D649", diff --git a/packages/web3-constants/evm/opensea-api.json b/packages/web3-constants/evm/opensea-api.json index a993c8cbec42..c4145343db8e 100644 --- a/packages/web3-constants/evm/opensea-api.json +++ b/packages/web3-constants/evm/opensea-api.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/pooltogether.json b/packages/web3-constants/evm/pooltogether.json index 8f13fda028b9..3c7def4c4af1 100644 --- a/packages/web3-constants/evm/pooltogether.json +++ b/packages/web3-constants/evm/pooltogether.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index 373cd1dfa2c1..36d0e8de748c 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", "Arbitrum_Rinkeby": "0x6B70EC653c4331bdD0D0DCC7C941eb594e69a91d", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -90,9 +90,9 @@ "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", - "Optimistic": "0x981be454a930479d92C91a0092D204b64845A5D6", - "Optimistic_Kovan": "0x68EDbfA3E564C987FaaAB54f4FD1E7567D4151Dd", - "Optimistic_Goerli": "", + "Optimism": "0x981be454a930479d92C91a0092D204b64845A5D6", + "Optimism_Kovan": "0x68EDbfA3E564C987FaaAB54f4FD1E7567D4151Dd", + "Optimism_Goerli": "", "Avalanche": "0xF9F7C1496c21bC0180f4B64daBE0754ebFc8A8c0", "Avalanche_Fuji": "0x3f64DFB6009d138DfD7b62916f3322A438d8b00D", "Celo": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", @@ -116,9 +116,9 @@ "Arbitrum": 909051, "Arbitrum_Rinkeby": 0, "xDai": 18101937, - "Optimistic": 1266143, - "Optimistic_Kovan": 442843, - "Optimistic_Goerli": 0, + "Optimism": 1266143, + "Optimism_Kovan": 442843, + "Optimism_Goerli": 0, "Avalanche": 8306507, "Avalanche_Fuji": 4751550, "Celo": 10413552, @@ -142,9 +142,9 @@ "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai", - "Optimistic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-op", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-op", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-avalanche", "Avalanche_Fuji": "", "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-celo", diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index baa9287d9c4e..cda9e9183a8b 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -54,9 +54,9 @@ "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], "xDai": ["https://rpc.gnosischain.com"], - "Optimistic": ["https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN"], - "Optimistic_Kovan": ["https://kovan.optimism.io"], - "Optimistic_Goerli": ["https://goerli.optimism.io"], + "Optimism": ["https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN"], + "Optimism_Kovan": ["https://kovan.optimism.io"], + "Optimism_Goerli": ["https://goerli.optimism.io"], "Avalanche": ["https://api.avax.network/ext/bc/C/rpc"], "Avalanche_Fuji": ["https://api.avax-test.network/ext/bc/C/rpc"], "Celo": ["https://forno.celo.org"], @@ -86,9 +86,9 @@ "Arbitrum": [0, 0, 0, 0, 0], "Arbitrum_Rinkeby": [0, 0, 0, 0, 0], "xDai": [0, 0, 0, 0, 0], - "Optimistic": [0, 1, 2, 3, 4], - "Optimistic_Kovan": [0, 0, 0, 0], - "Optimistic_Goerli": [0, 0, 0, 0], + "Optimism": [0, 1, 2, 3, 4], + "Optimism_Kovan": [0, 0, 0, 0], + "Optimism_Goerli": [0, 0, 0, 0], "Avalanche": [0, 0, 0, 0, 0], "Avalanche_Fuji": [0, 0, 0, 0, 0], "Celo": [0, 0, 0, 0, 0], diff --git a/packages/web3-constants/evm/space-station-galaxy.json b/packages/web3-constants/evm/space-station-galaxy.json index 94f6dbfa5142..f5b9de415f7e 100644 --- a/packages/web3-constants/evm/space-station-galaxy.json +++ b/packages/web3-constants/evm/space-station-galaxy.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/token-asset-base-url.json b/packages/web3-constants/evm/token-asset-base-url.json index 622180c1d33b..fbdbab3d62c5 100644 --- a/packages/web3-constants/evm/token-asset-base-url.json +++ b/packages/web3-constants/evm/token-asset-base-url.json @@ -39,12 +39,12 @@ "Arbitrum": [], "Arbitrum_Rinkeby": [], "xDai": [], - "Optimistic": [ + "Optimism": [ "https://raw.githubusercontent.com/dimensiondev/assets/master/blockchains/optimism", "https://rawcdn.githack.com/dimensiondev/assets/master/blockchains/optimism" ], - "Optimistic_Kovan": [], - "Optimistic_Goerli": [], + "Optimism_Kovan": [], + "Optimism_Goerli": [], "Avalanche": [ "https://raw.githubusercontent.com/dimensiondev/assets/master/blockchains/avalanchec", "https://rawcdn.githack.com/dimensiondev/assets/master/blockchains/avalanchec" diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 4ba47bc81421..08d682f43cb7 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -12,13 +12,12 @@ "Arbitrum": ["https://tokens.r2d2.to/latest/42161/tokens.json"], "Arbitrum_Rinkeby": ["https://tokens.r2d2.to/latest/421611/tokens.json"], "xDai": ["https://tokens.r2d2.to/latest/100/tokens.json"], - "Optimistic": [ + "Optimism": [ "https://static.optimism.io/optimism.tokenlist.json", - "https://raw.githubusercontent.com/elkfinance/tokens/main/all.tokenlist.json", "https://tokens.r2d2.to/latest/10/tokens.json" ], - "Optimistic_Kovan": [], - "Optimistic_Goerli": [], + "Optimism_Kovan": [], + "Optimism_Goerli": [], "Avalanche": ["https://tokens.r2d2.to/latest/43114/tokens.json"], "Avalanche_Fuji": [], "Celo": ["https://tokens.r2d2.to/latest/42220/tokens.json"], diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 85a55978e27b..a6b4d1d6b3b0 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -12,9 +12,9 @@ "Arbitrum": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "Arbitrum_Rinkeby": "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", "xDai": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "Optimistic": "0x4200000000000000000000000000000000000006", - "Optimistic_Kovan": "0x4200000000000000000000000000000000000006", - "Optimistic_Goerli": "0x4200000000000000000000000000000000000006", + "Optimism": "0x4200000000000000000000000000000000000006", + "Optimism_Kovan": "0x4200000000000000000000000000000000000006", + "Optimism_Goerli": "0x4200000000000000000000000000000000000006", "Avalanche": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", "Avalanche_Fuji": "", "Celo": "0x471EcE3750Da237f93B8E339c536989b8978a438", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0xeEeEEb57642040bE42185f49C52F7E9B38f8eeeE", - "Optimistic": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xeeeeeb57642040be42185f49c52f7e9b38f8eeee", "Avalanche_Fuji": "", "Celo": "", @@ -90,9 +90,9 @@ "Arbitrum": "0xe865dF68133fcEd7c2285ff3896B406CAfAa2dB8", "Arbitrum_Rinkeby": "", "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", - "Optimistic": "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664", "Avalanche_Fuji": "", "Celo": "0x2A3684e9Dc20B857375EA04235F2F7edBe818FA7", @@ -116,9 +116,9 @@ "Arbitrum": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "Arbitrum_Rinkeby": "", "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", - "Optimistic": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xc7198437980c041c805A1EDcbA50c1Ce5db95118", "Avalanche_Fuji": "", "Celo": "0xb020d981420744f6b0fedd22bb67cd37ce18a1d5", @@ -142,9 +142,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -168,9 +168,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0x1e37E5b504F7773460d6eB0e24D2e7C223B66EC7", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -194,9 +194,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x19860ccb0a68fd4213ab9d8266f7bbf05a8dde98", "Avalanche_Fuji": "", "Celo": "", @@ -220,9 +220,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xc3048e19e76cb9a3aa9d77d8c03c29fc906e2437", "Avalanche_Fuji": "", "Celo": "", @@ -246,9 +246,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -272,9 +272,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -298,9 +298,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x3390108E913824B8eaD638444cc52B9aBdF63798", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x3390108E913824B8eaD638444cc52B9aBdF63798", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -324,9 +324,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -350,9 +350,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -376,9 +376,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -402,9 +402,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -428,9 +428,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -454,9 +454,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70", "Avalanche_Fuji": "", "Celo": "", @@ -480,9 +480,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -506,9 +506,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -532,9 +532,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -558,9 +558,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -584,9 +584,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -610,9 +610,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -636,9 +636,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -662,9 +662,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -688,9 +688,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -714,9 +714,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -740,9 +740,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -766,9 +766,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -792,9 +792,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252", - "Optimistic": "0x68f180fcCe6836688e9084f035309E29Bf0A2095", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x68f180fcCe6836688e9084f035309E29Bf0A2095", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x50b7545627a5162F82A992c33b87aDc75187B218", "Avalanche_Fuji": "", "Celo": "0xBe50a3013A1c94768A1ABb78c3cB79AB28fc1aCE", @@ -818,9 +818,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -844,9 +844,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -870,9 +870,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -896,9 +896,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -922,9 +922,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -948,9 +948,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -974,9 +974,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1000,9 +1000,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1026,9 +1026,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1052,9 +1052,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1078,9 +1078,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1104,9 +1104,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1130,9 +1130,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", @@ -1156,9 +1156,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", @@ -1182,9 +1182,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1208,9 +1208,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xce347E069B68C53A9ED5e7DA5952529cAF8ACCd4", "Avalanche_Fuji": "", "Celo": "", @@ -1234,9 +1234,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x60781C2586D68229fde47564546784ab3fACA982", "Avalanche_Fuji": "", "Celo": "", @@ -1260,9 +1260,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1286,9 +1286,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1312,9 +1312,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1338,9 +1338,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1364,9 +1364,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", "Avalanche_Fuji": "", "Celo": "", @@ -1390,9 +1390,9 @@ "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", "xDai": "0x0000000000000000000000000000000000000000", - "Optimistic": "0x0000000000000000000000000000000000000000", - "Optimistic_Kovan": "0x0000000000000000000000000000000000000000", - "Optimistic_Goerli": "0x0000000000000000000000000000000000000000", + "Optimism": "0x0000000000000000000000000000000000000000", + "Optimism_Kovan": "0x0000000000000000000000000000000000000000", + "Optimism_Goerli": "0x0000000000000000000000000000000000000000", "Avalanche": "0x0000000000000000000000000000000000000000", "Avalanche_Fuji": "0x0000000000000000000000000000000000000000", "Celo": "0x471ece3750da237f93b8e339c536989b8978a438", @@ -1416,9 +1416,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1442,9 +1442,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1468,9 +1468,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1494,9 +1494,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1520,9 +1520,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1546,9 +1546,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1572,9 +1572,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1598,9 +1598,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1624,9 +1624,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1650,9 +1650,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1676,9 +1676,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1702,9 +1702,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1728,9 +1728,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1754,9 +1754,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1780,9 +1780,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1806,9 +1806,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1832,9 +1832,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1858,9 +1858,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1884,9 +1884,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1910,9 +1910,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1936,9 +1936,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1962,9 +1962,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1988,9 +1988,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2014,9 +2014,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2040,9 +2040,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2066,9 +2066,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2092,9 +2092,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2118,9 +2118,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2144,9 +2144,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2170,9 +2170,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2196,9 +2196,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2222,9 +2222,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2248,9 +2248,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2274,9 +2274,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2300,9 +2300,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2326,9 +2326,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2352,9 +2352,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2378,9 +2378,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2404,9 +2404,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2430,9 +2430,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2456,9 +2456,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2482,9 +2482,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2508,9 +2508,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2534,9 +2534,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2560,9 +2560,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2586,9 +2586,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2612,9 +2612,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2638,9 +2638,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2664,9 +2664,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2690,9 +2690,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2716,9 +2716,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2742,9 +2742,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2768,9 +2768,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2794,9 +2794,35 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0xFA436399d0458Dbe8aB890c3441256E3E09022a8", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xFA436399d0458Dbe8aB890c3441256E3E09022a8", + "Optimism_Kovan": "", + "Optimism_Goerli": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "OP_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Optimism": "0x4200000000000000000000000000000000000042", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 4f0e6c9837f1..586ae15f29b1 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "Avalanche_Fuji": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f", "Avalanche_Fuji": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -90,9 +90,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", "Avalanche_Fuji": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", "Celo": "", @@ -116,9 +116,9 @@ "Arbitrum": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Arbitrum_Rinkeby": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -142,9 +142,9 @@ "Arbitrum": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Arbitrum_Rinkeby": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "xDai": "", - "Optimistic": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f", - "Optimistic_Kovan": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "Optimistic_Goerli": "0x1F98431c8aD98523631AE4a59f267346ea31F984", + "Optimism": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f", + "Optimism_Kovan": "0x1F98431c8aD98523631AE4a59f267346ea31F984", + "Optimism_Goerli": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -168,9 +168,9 @@ "Arbitrum": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Arbitrum_Rinkeby": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "xDai": "", - "Optimistic": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", - "Optimistic_Kovan": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", - "Optimistic_Goerli": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimism": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimism_Kovan": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimism_Goerli": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -194,9 +194,9 @@ "Arbitrum": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Arbitrum_Rinkeby": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "xDai": "", - "Optimistic": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - "Optimistic_Kovan": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - "Optimistic_Goerli": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + "Optimism": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + "Optimism_Kovan": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + "Optimism_Goerli": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -220,9 +220,9 @@ "Arbitrum": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Arbitrum_Rinkeby": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "xDai": "", - "Optimistic": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", - "Optimistic_Kovan": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", - "Optimistic_Goerli": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Optimism": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", + "Optimism_Kovan": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", + "Optimism_Goerli": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -246,9 +246,9 @@ "Arbitrum": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Arbitrum_Rinkeby": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Avalanche_Fuji": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Celo": "0x1421bDe4B10e8dd459b3BCb598810B1337D56842", @@ -272,9 +272,9 @@ "Arbitrum": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum_Rinkeby": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Avalanche_Fuji": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Celo": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", @@ -298,9 +298,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -324,9 +324,9 @@ "Arbitrum": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum_Rinkeby": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Avalanche_Fuji": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Celo": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", @@ -350,9 +350,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -376,9 +376,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -402,9 +402,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -428,9 +428,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -454,9 +454,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -480,9 +480,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -506,9 +506,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -532,9 +532,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -558,9 +558,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -584,9 +584,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -610,9 +610,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -636,9 +636,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -662,9 +662,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -688,9 +688,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -714,9 +714,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -740,9 +740,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -766,9 +766,9 @@ "Arbitrum": "0xA867241cDC8d3b0C07C85cC06F25a0cD3b5474d8", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -792,9 +792,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -818,9 +818,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -844,9 +844,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x60aE616a2155Ee3d9A68541Ba4544862310933d4", "Avalanche_Fuji": "0x5db0735cf88F85E78ed742215090c465979B5006", "Celo": "", @@ -870,9 +870,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x9Ad6C38BE94206cA50bb0d90783181662f0Cfa10", "Avalanche_Fuji": "0x7eeccb3028870540EEc3D88C2259506f2d34fEE0", "Celo": "", @@ -896,9 +896,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -922,9 +922,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x0bbca9af0511ad1a1da383135cf3a8d2ac620e549ef9f6ae3a4c33c2fed0af91", "Avalanche_Fuji": "0x0bbca9af0511ad1a1da383135cf3a8d2ac620e549ef9f6ae3a4c33c2fed0af91", "Celo": "", @@ -948,9 +948,9 @@ "Arbitrum": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Arbitrum_Rinkeby": "", "xDai": "0x0000000000000000000000000000000000000000", - "Optimistic": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -974,9 +974,9 @@ "Arbitrum": "0x6352a56caadc4f1e25cd6c75970fa768a3304e64", "Arbitrum_Rinkeby": "", "xDai": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", - "Optimistic": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "Avalanche_Fuji": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "Celo": "", @@ -1000,9 +1000,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106", "Avalanche_Fuji": "0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106", "Celo": "", @@ -1026,9 +1026,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0xefa94DE7a4656D787667C749f7E1223D71E9FD88", "Avalanche_Fuji": "0xE4A575550C2b460d2307b82dCd7aFe84AD1484dd", "Celo": "", @@ -1052,9 +1052,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "https://api.thegraph.com/subgraphs/name/dasconnor/pangolin-dex'", "Avalanche_Fuji": "", "Celo": "", @@ -1078,9 +1078,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x40231f6b438bce0797c9ada29b718a87ea0a5cea3fe9a771abdd76bd41a3e545", "Avalanche_Fuji": "0x40231f6b438bce0797c9ada29b718a87ea0a5cea3fe9a771abdd76bd41a3e545", "Celo": "", @@ -1104,9 +1104,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1130,9 +1130,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1156,9 +1156,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1182,9 +1182,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1208,9 +1208,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1234,9 +1234,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1260,9 +1260,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1286,9 +1286,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1312,9 +1312,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1338,9 +1338,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1364,9 +1364,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1390,9 +1390,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1416,9 +1416,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1442,9 +1442,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x00df6f7248463b27d2ee7dd0b735fb2b62d9877f528541c958399a1711b5bc4b", - "Optimistic_Kovan": "0x00df6f7248463b27d2ee7dd0b735fb2b62d9877f528541c958399a1711b5bc4b", - "Optimistic_Goerli": "", + "Optimism": "0x00df6f7248463b27d2ee7dd0b735fb2b62d9877f528541c958399a1711b5bc4b", + "Optimism_Kovan": "0x00df6f7248463b27d2ee7dd0b735fb2b62d9877f528541c958399a1711b5bc4b", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1468,9 +1468,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x3A682E671D1C74F82A45C074E531D33Bd1CEb09c", - "Optimistic_Kovan": "0x3A682E671D1C74F82A45C074E531D33Bd1CEb09c", - "Optimistic_Goerli": "", + "Optimism": "0x3A682E671D1C74F82A45C074E531D33Bd1CEb09c", + "Optimism_Kovan": "0x3A682E671D1C74F82A45C074E531D33Bd1CEb09c", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1494,9 +1494,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x0BEf94f16cE5b7c83B0BDbD9924cF80239BA9837", - "Optimistic_Kovan": "0x0BEf94f16cE5b7c83B0BDbD9924cF80239BA9837", - "Optimistic_Goerli": "", + "Optimism": "0x0BEf94f16cE5b7c83B0BDbD9924cF80239BA9837", + "Optimism_Kovan": "0x0BEf94f16cE5b7c83B0BDbD9924cF80239BA9837", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1520,9 +1520,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1546,9 +1546,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1572,9 +1572,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1598,9 +1598,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1624,9 +1624,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1650,9 +1650,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1676,9 +1676,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1702,9 +1702,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1728,9 +1728,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1754,9 +1754,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1780,9 +1780,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1806,9 +1806,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1832,9 +1832,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1858,9 +1858,9 @@ "Arbitrum": "0x0A2e5A3Dc2f74E5Bfaf0Bf90685A5A899f379Cb0", "Arbitrum_Rinkeby": "", "xDai": "0xe5759714998e8B50A33c7333C04C2d02e5dcE77f", - "Optimistic": "0xeadE97aFC8f79A8E5Ba85d57C4a4E629b1160C6A", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xeadE97aFC8f79A8E5Ba85d57C4a4E629b1160C6A", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x9E4AAbd2B3E60Ee1322E94307d0776F2c8e6CFbb", "Avalanche_Fuji": "", "Celo": "", @@ -1884,9 +1884,9 @@ "Arbitrum": "0xA59B2044EAFD15ee4deF138D410d764c9023E1F0", "Arbitrum_Rinkeby": "", "xDai": "0xCB018587dA9590A18f49fFE2b85314c33aF3Ad3B", - "Optimistic": "0xedfad3a0F42A8920B011bb0332aDe632e552d846", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xedfad3a0F42A8920B011bb0332aDe632e552d846", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x091d35d7F63487909C863001ddCA481c6De47091", "Avalanche_Fuji": "", "Celo": "", @@ -1910,9 +1910,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1936,9 +1936,9 @@ "Arbitrum": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Arbitrum_Rinkeby": "", "xDai": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Optimistic": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", "Avalanche_Fuji": "", "Celo": "", @@ -1962,9 +1962,9 @@ "Arbitrum": "0x4D70D768f5E1e6a7062973aFB0c7FBDa9bBb42b3", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0xE6Df0BB08e5A97b40B21950a0A51b94c4DbA0Ff6", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0xE6Df0BB08e5A97b40B21950a0A51b94c4DbA0Ff6", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -1988,9 +1988,9 @@ "Arbitrum": "0x9e343Bea27a12B23523ad88333a1B0f68cc1F05E", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x8BCeDD62DD46F1A76F8A1633d4f5B76e0CDa521E", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x8BCeDD62DD46F1A76F8A1633d4f5B76e0CDa521E", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2014,9 +2014,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -2040,9 +2040,9 @@ "Arbitrum": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/trending.json b/packages/web3-constants/evm/trending.json index d5311d499034..56b1854253ff 100644 --- a/packages/web3-constants/evm/trending.json +++ b/packages/web3-constants/evm/trending.json @@ -12,9 +12,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -38,9 +38,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", @@ -64,9 +64,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Optimistic": "", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "", "Avalanche_Fuji": "", "Celo": "", diff --git a/packages/web3-constants/evm/zerion.json b/packages/web3-constants/evm/zerion.json index dff5dc63a6bb..c337166a5abc 100644 --- a/packages/web3-constants/evm/zerion.json +++ b/packages/web3-constants/evm/zerion.json @@ -12,9 +12,9 @@ "Arbitrum": "arbitrum-assets", "Arbitrum_Rinkeby": "", "xDai": "xdai-assets", - "Optimistic": "optimistic-assets", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "Optimism-assets", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "avalanche-assets", "Avalanche_Fuji": "", "Celo": "celo-assets", @@ -38,9 +38,9 @@ "Arbitrum": "arbitrum-transactions", "Arbitrum_Rinkeby": "", "xDai": "xdai-transactions", - "Optimistic": "optimistic-transactions", - "Optimistic_Kovan": "", - "Optimistic_Goerli": "", + "Optimism": "Optimism-transactions", + "Optimism_Kovan": "", + "Optimism_Goerli": "", "Avalanche": "avalanche-transactions", "Avalanche_Fuji": "", "Celo": "celo-transactions", diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index 0b3cf92e4e25..266c2b085d1f 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -56,7 +56,8 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'ONE'].includes(symbol) + const isNativeToken = (symbol: string) => + ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'ONE', 'OETH'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId diff --git a/packages/web3-providers/src/zerion/index.ts b/packages/web3-providers/src/zerion/index.ts index 259047869f68..6c79edcfe404 100644 --- a/packages/web3-providers/src/zerion/index.ts +++ b/packages/web3-providers/src/zerion/index.ts @@ -103,7 +103,7 @@ type Asset = Web3Plugin.Asset export async function getAssetListByZerion(address: string) { let result: Asset[] = [] - const scopes = ['assets', 'bsc-assets', 'polygon-assets', 'arbitrum-assets', 'optimistic-assets'] + const scopes = ['assets', 'bsc-assets', 'polygon-assets', 'arbitrum-assets', 'Optimism-assets'] for (const scope of scopes) { const { meta, payload } = await getAssetsList(address, scope) if (meta.status !== 'ok') throw new Error('Fail to load assets.') diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 047995ab6621..c121300025d2 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -303,8 +303,8 @@ "chainId": 9 }, { - "name": "Optimistic Ethereum", - "chain": "Optimistic", + "name": "Optimism Ethereum", + "chain": "Optimism", "network": "mainnet", "features": [], "nativeCurrency": { @@ -312,18 +312,18 @@ "symbol": "OETH", "decimals": 18 }, - "infoURL": "https://optimistic.etherscan.io/", - "shortName": "oeth", + "infoURL": "https://Optimistic.etherscan.io/", + "shortName": "op", "chainId": 10, "explorers": [ { "name": "optimisc", - "url": "https://optimistic.etherscan.io/" + "url": "https://Optimistic.etherscan.io/" } ] }, { - "name": "Optimistic Ethereum Testnet Kovan", + "name": "Optimism Ethereum Testnet Kovan", "chain": "KOR", "network": "testnet", "rpc": ["https://kovan.optimism.io/"], @@ -340,7 +340,7 @@ "chainId": 69 }, { - "name": "Optimistic Ethereum Testnet Goerli", + "name": "Optimism Ethereum Testnet Goerli", "chain": "OP", "network": "testnet", "rpc": ["https://goerli.optimism.io/"], @@ -898,7 +898,7 @@ "chainId": 68 }, { - "name": "Optimistic Ethereum Testnet Kovan", + "name": "Optimism Ethereum Testnet Kovan", "chain": "OPT", "network": "kovan", "features": [], @@ -1406,7 +1406,7 @@ "chainId": 385 }, { - "name": "Optimistic Ethereum Testnet Goerli", + "name": "Optimism Ethereum Testnet Goerli", "chain": "OPT", "network": "goerli", "features": [], diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index 8ad49f046407..fbefe3d511a2 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -50,6 +50,7 @@ export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX export const JEWEL = createERC20Tokens('JEWEL_ADDRESS', 'Jewels', 'JEWEL', 18) export const ELK = createERC20Tokens('ELK_ADDRESS', 'Elk finance', 'ELK', 18) export const ZIP = createERC20Tokens('ZIP_ADDRESS', 'ZipSwap', 'ZIP', 18) +export const OP = createERC20Tokens('OP_ADDRESS', 'Optimism', 'OP', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', @@ -77,7 +78,7 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Fantom]: [WNATIVE[ChainId.Fantom]], [ChainId.Aurora]: [WNATIVE[ChainId.Aurora]], [ChainId.Aurora_Testnet]: [WNATIVE[ChainId.Aurora_Testnet]], - [ChainId.Optimistic]: [WNATIVE[ChainId.Optimistic]], - [ChainId.Optimistic_Goerli]: [WNATIVE[ChainId.Optimistic_Goerli]], + [ChainId.Optimism]: [WNATIVE[ChainId.Optimism]], + [ChainId.Optimism_Goerli]: [WNATIVE[ChainId.Optimism_Goerli]], [ChainId.Harmony]: [WNATIVE[ChainId.Harmony]], } diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index 622ac0ba791b..ede112110093 100644 --- a/packages/web3-shared/evm/pipes/index.ts +++ b/packages/web3-shared/evm/pipes/index.ts @@ -92,7 +92,7 @@ export const resolveNetworkAddressPrefix = createLookupTableResolver [NetworkType.Polygon]: 'Polygon', [NetworkType.Arbitrum]: 'Arbitrum', [NetworkType.xDai]: 'xDai', - [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Optimism]: 'Optimism', [NetworkType.Avalanche]: 'Avalanche', [NetworkType.Celo]: 'Celo', [NetworkType.Fantom]: 'Fantom', @@ -124,7 +124,7 @@ export const resolveNetworkName = createLookupTableResolver [NetworkType.Boba]: 'Boba', [NetworkType.Fuse]: 'Fuse', [NetworkType.Metis]: 'Metis', - [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Optimism]: 'Optimism', }, 'Unknown', ) @@ -153,9 +153,9 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Arbitrum]: 'rgb(36, 150, 238)', [ChainId.Arbitrum_Rinkeby]: 'rgb(36, 150, 238)', [ChainId.xDai]: 'rgb(73, 169, 166)', - [ChainId.Optimistic]: 'rgb(255, 3, 33)', - [ChainId.Optimistic_Kovan]: 'rgb(255, 3, 33)', - [ChainId.Optimistic_Goerli]: 'rgb(255, 3, 33)', + [ChainId.Optimism]: 'rgb(255, 3, 33)', + [ChainId.Optimism_Kovan]: 'rgb(255, 3, 33)', + [ChainId.Optimism_Goerli]: 'rgb(255, 3, 33)', [ChainId.Avalanche]: 'rgb(232, 65, 66)', [ChainId.Avalanche_Fuji]: 'rgb(232, 65, 66)', [ChainId.Celo]: 'rgb(53, 208, 127)', @@ -168,7 +168,7 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Fuse]: 'rgb(255 255 255)', [ChainId.Boba]: 'rgb(255 255 255)', [ChainId.Metis]: 'rgb(255 255 255)', - [ChainId.Optimistic]: 'rgb(255 255 255)', + [ChainId.Optimism]: 'rgb(255 255 255)', }, 'rgb(214, 217, 220)', ) diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index 6814dcb5b014..6db3be6e922f 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -68,10 +68,10 @@ export enum ChainId { // Metis Metis = 1088, - // Optimistic - Optimistic = 10, - Optimistic_Kovan = 69, - Optimistic_Goerli = 420, + // Optimism + Optimism = 10, + Optimism_Kovan = 69, + Optimism_Goerli = 420, // Harmony Harmony = 1666600000, @@ -664,7 +664,7 @@ export enum NetworkType { Boba = 'Boba', Fuse = 'Fuse', Metis = 'Metis', - Optimistic = 'Optimistic', + Optimism = 'Optimism', Harmony = 'Harmony', Conflux = 'Conflux', } diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index fb26ba71d79a..43dc43558f7a 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -89,7 +89,7 @@ export const getChainIdFromNetworkType = createLookupTableResolver = { [NetworkType.Boba]: 'Boba', [NetworkType.Fuse]: 'Fuse', [NetworkType.Metis]: 'Metis', - [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Optimism]: 'Optimism', [NetworkType.Harmony]: 'Harmony', [NetworkType.Conflux]: 'Conflux', } From f04431c34d46c0ca42606b5b7b62ca1773fdb205 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 19:45:31 +0100 Subject: [PATCH 27/47] chore(optmism): add zipswap on cspell --- .vscode/schema/constants.json | 6 +++--- cspell.json | 3 ++- docs/evm-integration.md | 18 +++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.vscode/schema/constants.json b/.vscode/schema/constants.json index 8973b2547c04..d7c5c8ed9f08 100644 --- a/.vscode/schema/constants.json +++ b/.vscode/schema/constants.json @@ -31,9 +31,9 @@ "Mumbai", "Arbitrum", "Arbitrum_Rinkeby", - "Optimistic", - "Optimistic_Kovan", - "Optimistic_Goerli" + "Optimism", + "Optimism_Kovan", + "Optimism_Goerli" ] }, "primitive": { diff --git a/cspell.json b/cspell.json index 8a1938ae9997..a4ec7ccdbd7d 100644 --- a/cspell.json +++ b/cspell.json @@ -130,7 +130,7 @@ "opensea", "openswap", "openx", - "optimistic", + "optimism", "overridable", "overscan", "pageable", @@ -214,6 +214,7 @@ "xdai", "xlarge", "zerion", + "zipswap", "zora", "zubin" ], diff --git a/docs/evm-integration.md b/docs/evm-integration.md index 72ec97395c9f..ce916f25ef3d 100644 --- a/docs/evm-integration.md +++ b/docs/evm-integration.md @@ -114,12 +114,12 @@ Here is the chain abilities checklist. If you are working on a bounty task, plea ## Examples -| Chain | Pull Request Link | -| ---------- | ---------------------------------------------------- | -| CELO | | -| Fantom | | -| xDai | | -| Arbitrum | | -| Avalanche | | -| Harmony | | -| Optimistic | | +| Chain | Pull Request Link | +| --------- | ---------------------------------------------------- | +| CELO | | +| Fantom | | +| xDai | | +| Arbitrum | | +| Avalanche | | +| Harmony | | +| Optimism | | From d558476a6901405b855e7991244f54a76227273d Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 21:26:53 +0100 Subject: [PATCH 28/47] chore(optimism): add hardCode gasLimit and gasPrice on optimism --- packages/mask/shared-ui/locales/en-US.json | 1 - .../src/plugins/Trader/trader/uniswap/useTradeCallback.ts | 2 +- packages/web3-shared/evm/hooks/useGasPrice.ts | 4 +++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mask/shared-ui/locales/en-US.json b/packages/mask/shared-ui/locales/en-US.json index c97bf81ed945..7331c936d720 100644 --- a/packages/mask/shared-ui/locales/en-US.json +++ b/packages/mask/shared-ui/locales/en-US.json @@ -65,7 +65,6 @@ "compose_encrypt_visible_to_private": "Private", "compose_encrypt_visible_to_private_sub": "Just Me", "compose_shared_friends": "1 friend", - "compose_shared_friends_other": "{{count}} friends", "compose_encrypt_visible_to_share": "Share with", "compose_encrypt_visible_to_share_sub": "Just Selected Contacts", "compose_encrypt_share_dialog_empty": "No encrypted friends, you can try searching.", diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index 8d5a87c36c5e..b494b7e2108f 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -142,7 +142,7 @@ export function useTradeCallback( data: calldata, ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed() } : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }), - ...gasConfig, + ...(targetChainId === 10 ? { gasPrice: 15000000, gas: 820000 } : { ...gasConfig }), }, async (error, hash) => { if (error) { diff --git a/packages/web3-shared/evm/hooks/useGasPrice.ts b/packages/web3-shared/evm/hooks/useGasPrice.ts index 9b2523fdce8e..092231c730e2 100644 --- a/packages/web3-shared/evm/hooks/useGasPrice.ts +++ b/packages/web3-shared/evm/hooks/useGasPrice.ts @@ -6,9 +6,11 @@ import type { ChainId } from '../types' export function useGasPrice(expertedChainId?: ChainId) { const currentChainId = useChainId() const chainId = expertedChainId ?? currentChainId + const optimism = currentChainId === 10 const web3 = useWeb3({ chainId }) + const getGasPrice = optimism ? 15000000 : web3.eth.getGasPrice() return useAsyncRetry(async () => { - return web3.eth.getGasPrice() + return getGasPrice }, [web3, chainId]) } From bcf0399490d7ebfd1ce11d43a9e65749a101786c Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 16 May 2022 21:49:55 +0100 Subject: [PATCH 29/47] chore(optimism): enable sushiswap --- packages/mask/src/plugins/Trader/apis/trader/index.ts | 8 +++++++- .../mask/src/plugins/Trader/constants/sushiswap.ts | 1 + packages/web3-constants/evm/rpc.json | 6 +++++- packages/web3-constants/evm/token-list.json | 3 ++- packages/web3-constants/evm/trader.json | 10 +++++----- packages/web3-shared/evm/assets/chains.json | 4 ++-- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index c5e046a4ca0e..6328e8e055e7 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -58,7 +58,13 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Optimism: - return [TradeProvider.UNISWAP_V3, TradeProvider.JUGGLERRED, TradeProvider.ELKFINANCE, TradeProvider.ZIPSWAP] + return [ + TradeProvider.UNISWAP_V3, + TradeProvider.SUSHISWAP, + TradeProvider.JUGGLERRED, + TradeProvider.ELKFINANCE, + TradeProvider.ZIPSWAP, + ] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: diff --git a/packages/mask/src/plugins/Trader/constants/sushiswap.ts b/packages/mask/src/plugins/Trader/constants/sushiswap.ts index 5f5e7931a4c6..bc894a425c72 100644 --- a/packages/mask/src/plugins/Trader/constants/sushiswap.ts +++ b/packages/mask/src/plugins/Trader/constants/sushiswap.ts @@ -34,4 +34,5 @@ export const SUSHISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC].map((x) => x[ChainId.Fantom]), [ChainId.Avalanche]: [WNATIVE, DAI, USDC, WBTC, USDT].map((x) => x[ChainId.Avalanche]), [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT].map((x) => x[ChainId.Harmony]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, WBTC, USDT].map((x) => x[ChainId.Optimism]), } diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index cda9e9183a8b..5d0811c97c62 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -54,7 +54,11 @@ "Arbitrum": ["https://arb1.arbitrum.io/rpc"], "Arbitrum_Rinkeby": ["https://rinkeby.arbitrum.io/rpc"], "xDai": ["https://rpc.gnosischain.com"], - "Optimism": ["https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN"], + "Optimism": [ + "https://opt-mainnet.g.alchemy.com/v2/si4Ts8BGkOpDGesRfjdRZHFzUukHvURN", + "https://optimism-mainnet.infura.io/v3/c44fac7726a64d5bbbb3a1c51f02d75b", + "https://mainnet.optimism.io" + ], "Optimism_Kovan": ["https://kovan.optimism.io"], "Optimism_Goerli": ["https://goerli.optimism.io"], "Avalanche": ["https://api.avax.network/ext/bc/C/rpc"], diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 08d682f43cb7..bbf39123a708 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -14,7 +14,8 @@ "xDai": ["https://tokens.r2d2.to/latest/100/tokens.json"], "Optimism": [ "https://static.optimism.io/optimism.tokenlist.json", - "https://tokens.r2d2.to/latest/10/tokens.json" + "https://tokens.r2d2.to/latest/10/tokens.json", + "https://token-list.sushi.com" ], "Optimism_Kovan": [], "Optimism_Goerli": [], diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 586ae15f29b1..fbd97bbdbbab 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -246,7 +246,7 @@ "Arbitrum": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Arbitrum_Rinkeby": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", - "Optimism": "", + "Optimism": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Optimism_Kovan": "", "Optimism_Goerli": "", "Avalanche": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", @@ -272,9 +272,9 @@ "Arbitrum": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum_Rinkeby": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", - "Optimism": "", - "Optimism_Kovan": "", - "Optimism_Goerli": "", + "Optimism": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", + "Optimism_Kovan": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", + "Optimism_Goerli": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Avalanche": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Avalanche_Fuji": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Celo": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", @@ -324,7 +324,7 @@ "Arbitrum": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum_Rinkeby": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", - "Optimism": "", + "Optimism": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Optimism_Kovan": "", "Optimism_Goerli": "", "Avalanche": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index c121300025d2..f054f15ea6e5 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -336,12 +336,12 @@ "logoURI": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png" }, "infoURL": "https://optimism.io", - "shortName": "gor", + "shortName": "kor", "chainId": 69 }, { "name": "Optimism Ethereum Testnet Goerli", - "chain": "OP", + "chain": "Goerli", "network": "testnet", "rpc": ["https://goerli.optimism.io/"], "faucets": [], From 6e185f54b18aa0a9eea875f034d1e90e961a869f Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Thu, 26 May 2022 17:34:15 +0800 Subject: [PATCH 30/47] fix: add missing deps (#6356) --- .../src/components/InjectedComponents/ProfileTabContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mask/src/components/InjectedComponents/ProfileTabContent.tsx b/packages/mask/src/components/InjectedComponents/ProfileTabContent.tsx index 0487f9d1b095..aaf461822524 100644 --- a/packages/mask/src/components/InjectedComponents/ProfileTabContent.tsx +++ b/packages/mask/src/components/InjectedComponents/ProfileTabContent.tsx @@ -124,7 +124,7 @@ export function ProfileTabContent(props: ProfileTabContentProps) { ? displayPlugins?.find((tab) => tab?.pluginID === PluginId.NextID)?.ID : selectedTabId return getTabContent(tabId ?? '') - }, [selectedTabId, identity.identifier?.userId]) + }, [selectedTabId, identity.identifier?.userId, currentAccountNotConnectPersona]) if (hidden) return null From 836f5f5535702cd8ad948a320f7eee88d142f3ba Mon Sep 17 00:00:00 2001 From: Hancheng Zhou Date: Thu, 26 May 2022 17:44:11 +0800 Subject: [PATCH 31/47] fix(ui): claim button && mind fb tool box hint (#6337) --- cspell.json | 1 + .../InjectedComponents/ToolboxUnstyled.tsx | 5 ++++- .../DashboardComponents/ActionButton.tsx | 21 +++++++++++++++---- .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 2 ++ .../facebook.com/injection/Toolbar.tsx | 3 ++- .../facebook.com/injection/ToolbarUI.tsx | 19 +++++++++-------- .../minds.com/customization/custom.ts | 3 +++ .../minds.com/injection/ToolboxHint_UI.tsx | 4 ++-- .../minds.com/utils/selector.ts | 4 +--- .../src/web3/UI/EthereumChainBoundary.tsx | 3 +++ 10 files changed, 45 insertions(+), 20 deletions(-) diff --git a/cspell.json b/cspell.json index 28e4e04fbc54..4dbe240d7ac5 100644 --- a/cspell.json +++ b/cspell.json @@ -286,6 +286,7 @@ "redpackets", "renfil", "shapeclip", + "ssrb", "steth", "swaptoken", "testweb", diff --git a/packages/mask/src/components/InjectedComponents/ToolboxUnstyled.tsx b/packages/mask/src/components/InjectedComponents/ToolboxUnstyled.tsx index 106098381aeb..6a2593c93cca 100644 --- a/packages/mask/src/components/InjectedComponents/ToolboxUnstyled.tsx +++ b/packages/mask/src/components/InjectedComponents/ToolboxUnstyled.tsx @@ -91,6 +91,7 @@ export function ToolboxHintUnstyled(props: ToolboxHintProps) { function ToolboxHintForApplication(props: ToolboxHintProps) { const { ListItemButton = MuiListItemButton, + ListItemIcon = MuiListItemIcon, Container = 'div', Typography = MuiTypography, iconSize = 24, @@ -104,7 +105,9 @@ function ToolboxHintForApplication(props: ToolboxHintProps) { - + + + {mini ? null : ( ('init') - const completeClass = classNames(classes.success, b.className) - const failClass = classNames(classes.failed, b.className) + const basicClass = classNames(classes.button, b.className) + const completeClass = classNames(basicClass, classes.success) + const failClass = classNames(basicClass, classes.failed) const run = () => { setState('wait') @@ -144,7 +145,16 @@ export function ActionButtonPromise(props: ActionButtonPromiseProps) { }, [executor, noUpdateEffect]) if (state === 'wait') - return ) @@ -155,12 +157,12 @@ export function PreviewCard(props: PreviewCardProps) {

- {t('plugin_gitcoin_by')} + {t.by()} - {t('plugin_gitcoin_view_on')} + {t.view_on()} @@ -199,7 +201,7 @@ export function PreviewCard(props: PreviewCardProps) { color: 'white', }} onClick={onDonate}> - {t('plugin_gitcoin_donate')} + {t.donate()} diff --git a/packages/mask/src/plugins/Gitcoin/SNSAdaptor/index.tsx b/packages/mask/src/plugins/Gitcoin/SNSAdaptor/index.tsx index 956f016b34d3..1ffb8a4109eb 100644 --- a/packages/mask/src/plugins/Gitcoin/SNSAdaptor/index.tsx +++ b/packages/mask/src/plugins/Gitcoin/SNSAdaptor/index.tsx @@ -1,18 +1,15 @@ -import { useMemo } from 'react' -import { ChainId } from '@masknet/web3-shared-evm' -import { usePostInfoDetails, Plugin, usePluginWrapper } from '@masknet/plugin-infra/content-script' -import { NetworkPluginID, useChainId } from '@masknet/plugin-infra/web3' -import { extractTextFromTypedMessage } from '@masknet/typed-message' -import { parseURL } from '@masknet/shared-base' import { GitcoinIcon } from '@masknet/icons' -import { PreviewCard } from './PreviewCard' +import { Plugin, PluginId, usePluginWrapper, usePostInfoDetails } from '@masknet/plugin-infra/content-script' +import { parseURL } from '@masknet/shared-base' +import { extractTextFromTypedMessage } from '@masknet/typed-message' +import { useMemo } from 'react' import { Trans } from 'react-i18next' import { base } from '../base' -import { PLUGIN_NAME, PLUGIN_META_KEY } from '../constants' +import { PLUGIN_META_KEY, PLUGIN_NAME } from '../constants' import { DonateDialog } from './DonateDialog' +import { PreviewCard } from './PreviewCard' const isGitcoin = (x: string): boolean => /^https:\/\/gitcoin.co\/grants\/\d+/.test(x) -const isGitCoinSupported = (chainId: ChainId) => [ChainId.Mainnet, ChainId.Matic].includes(chainId) const sns: Plugin.SNSAdaptor.Definition = { ...base, @@ -41,8 +38,8 @@ const sns: Plugin.SNSAdaptor.Definition = { { ApplicationEntryID: base.ID, category: 'dapp', - description: , - name: , + description: , + name: , icon: , marketListSortingPriority: 9, tutorialLink: 'https://realmasknetwork.notion.site/98ed83784ed4446a8a13fa685c7bddfb', @@ -52,7 +49,6 @@ const sns: Plugin.SNSAdaptor.Definition = { function Renderer(props: React.PropsWithChildren<{ url: string }>) { const [id = ''] = props.url.match(/\d+/) ?? [] - const chainId = useChainId(NetworkPluginID.PLUGIN_EVM) usePluginWrapper(true) return } diff --git a/packages/mask/src/plugins/Gitcoin/base.ts b/packages/mask/src/plugins/Gitcoin/base.ts index 2ba903193d15..399adeb050cb 100644 --- a/packages/mask/src/plugins/Gitcoin/base.ts +++ b/packages/mask/src/plugins/Gitcoin/base.ts @@ -2,6 +2,7 @@ import type { Plugin } from '@masknet/plugin-infra' import { NetworkPluginID } from '@masknet/plugin-infra/web3' import { ChainId } from '@masknet/web3-shared-evm' import { PLUGIN_ID, PLUGIN_NAME, PLUGIN_DESCRIPTION } from './constants' +import { languages } from './locales/languages' export const base: Plugin.Shared.Definition = { ID: PLUGIN_ID, @@ -21,4 +22,5 @@ export const base: Plugin.Shared.Definition = { }, }, contribution: { postContent: new Set([/https:\/\/gitcoin.co\/grants\/\d+/]) }, + i18n: languages, } diff --git a/packages/mask/src/plugins/Gitcoin/locales/en-US.json b/packages/mask/src/plugins/Gitcoin/locales/en-US.json new file mode 100644 index 000000000000..96bdf7b52625 --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/en-US.json @@ -0,0 +1,15 @@ +{ + "name": "Gitcoin", + "description": "Display specific information of Gitcoin projects, donate to a project directly on social media.", + "promote": "Share or browse Gitcoin projects you have donated or interested in.", + "select_a_token": "Select a token", + "grant_not_available": "Grant not available", + "enter_an_amount": "Enter an amount", + "insufficient_balance": "Insufficient {{symbol}} balance", + "gitcoin_readme": "By using this service, you will also be contributing 5% of your contribution to the Gitcoin grants development fund.", + "donate": "Donate", + "last_updated": "Last update:", + "by": "By", + "view_on": "View on Gitcoin", + "readme_fund_link": "https://gitcoin.co/grants/86/gitcoin-sustainability-fund" +} diff --git a/packages/mask/src/plugins/Gitcoin/locales/index.ts b/packages/mask/src/plugins/Gitcoin/locales/index.ts new file mode 100644 index 000000000000..d6ead60252e4 --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/index.ts @@ -0,0 +1,6 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts + +export * from './i18n_generated' diff --git a/packages/mask/src/plugins/Gitcoin/locales/ja-JP.json b/packages/mask/src/plugins/Gitcoin/locales/ja-JP.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/ja-JP.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Gitcoin/locales/ko-KR.json b/packages/mask/src/plugins/Gitcoin/locales/ko-KR.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/ko-KR.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Gitcoin/locales/languages.ts b/packages/mask/src/plugins/Gitcoin/locales/languages.ts new file mode 100644 index 000000000000..9b496c047c8a --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/languages.ts @@ -0,0 +1,34 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts +import en_US from './en-US.json' +import ja_JP from './ja-JP.json' +import ko_KR from './ko-KR.json' +import qya_AA from './qya-AA.json' +import zh_CN from './zh-CN.json' +import zh_TW from './zh-TW.json' +export const languages = { + en: en_US, + ja: ja_JP, + ko: ko_KR, + qy: qya_AA, + 'zh-CN': zh_CN, + zh: zh_TW, +} +// @ts-ignore +if (import.meta.webpackHot) { + // @ts-ignore + import.meta.webpackHot.accept( + ['./en-US.json', './ja-JP.json', './ko-KR.json', './qya-AA.json', './zh-CN.json', './zh-TW.json'], + () => + globalThis.dispatchEvent?.( + new CustomEvent('MASK_I18N_HMR', { + detail: [ + 'com.maskbook.gitcoin', + { en: en_US, ja: ja_JP, ko: ko_KR, qy: qya_AA, 'zh-CN': zh_CN, zh: zh_TW }, + ], + }), + ), + ) +} diff --git a/packages/mask/src/plugins/Gitcoin/locales/qya-AA.json b/packages/mask/src/plugins/Gitcoin/locales/qya-AA.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/qya-AA.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Gitcoin/locales/zh-CN.json b/packages/mask/src/plugins/Gitcoin/locales/zh-CN.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/zh-CN.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Gitcoin/locales/zh-TW.json b/packages/mask/src/plugins/Gitcoin/locales/zh-TW.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Gitcoin/locales/zh-TW.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ITO.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ITO.tsx index 7b761a3bb0fb..325506b44221 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ITO.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ITO.tsx @@ -5,12 +5,9 @@ import { FungibleTokenDetailed, getChainDetailed, isSameAddress, - currySameAddress, resolveLinkOnExplorer, - TransactionStateType, useAccount, useChainId, - useChainIdValid, useTokenConstants, isNativeTokenAddress, } from '@masknet/web3-shared-evm' @@ -246,8 +243,7 @@ export function ITO(props: ITO_Props) { const account = useAccount() const postLink = usePostLink() const chainId = useChainId() - const chainIdValid = useChainIdValid() - const [destructState, destructCallback, resetDestructCallback] = useDestructCallback(props.payload.contract_address) + const [, destructCallback] = useDestructCallback(props.payload.contract_address) const [openClaimDialog, setOpenClaimDialog] = useState(false) const [claimDialogStatus, setClaimDialogStatus] = useState(SwapStatus.Remind) @@ -414,23 +410,8 @@ export function ITO(props: ITO_Props) { return () => clearTimeout(timer) }, [endTime, listOfStatus]) - useEffect(() => { - if (destructState.type === TransactionStateType.UNKNOWN || !canWithdraw) return - let summary = t('plugin_ito_withdraw') - if (!noRemain) { - summary += ' ' + formatBalance(total_remaining, token.decimals) + ' ' + token.symbol - } - availability?.exchange_addrs.forEach((addr, i) => { - const token = exchange_tokens.find(currySameAddress(addr)) - const comma = noRemain && i === 0 ? ' ' : ', ' - if (token) { - summary += comma + formatBalance(availability?.exchanged_tokens[i], token.decimals) + ' ' + token.symbol - } - }) - }, [destructState, canWithdraw]) - const onWithdraw = useCallback(async () => { - destructCallback(payload.pid) + await destructCallback(payload.pid) }, [destructCallback, payload.pid]) // #endregion diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/NftAirdropCard.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/NftAirdropCard.tsx index 7190867404a9..f4eaba6d32be 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/NftAirdropCard.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/NftAirdropCard.tsx @@ -1,17 +1,11 @@ import formatDateTime from 'date-fns/format' -import { - ChainId, - TransactionStateType, - useAccount, - resolveTransactionLinkOnExplorer, - useChainId, -} from '@masknet/web3-shared-evm' +import { ChainId, useAccount, resolveTransactionLinkOnExplorer, useChainId } from '@masknet/web3-shared-evm' import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' import { Box, Typography, Button, TextField, CircularProgress, Link } from '@mui/material' import { useSpaceStationClaimableTokenCountCallback } from './hooks/useSpaceStationClaimableTokenCountCallback' import { useSpaceStationContractClaimCallback } from './hooks/useSpaceStationContractClaimCallback' import { useI18N } from '../../../utils' -import { useState, useEffect } from 'react' +import { useState, useEffect, useCallback } from 'react' import { makeStyles, useCustomSnackbar, OptionsObject } from '@masknet/theme' import OpenInNewIcon from '@mui/icons-material/OpenInNew' import CloseIcon from '@mui/icons-material/Close' @@ -287,8 +281,9 @@ function ClaimItem(props: ClaimItemProps) { horizontal: 'center', }, } - useEffect(() => { - if (claimState.type === TransactionStateType.CONFIRMED && claimState.no === 0) { + const claim = useCallback(async () => { + const hash = await claimCallback() + if (typeof hash === 'string') { showSnackbar(
@@ -299,10 +294,7 @@ function ClaimItem(props: ClaimItemProps) { className={classes.whiteText} target="_blank" rel="noopener noreferrer" - href={resolveTransactionLinkOnExplorer( - ChainId.Mumbai, - claimState.receipt.transactionHash, - )}> + href={resolveTransactionLinkOnExplorer(ChainId.Mumbai, hash)}> @@ -316,7 +308,7 @@ function ClaimItem(props: ClaimItemProps) { ) retry() - } else if (claimState.type === TransactionStateType.FAILED) { + } else { showSnackbar(
@@ -331,7 +323,7 @@ function ClaimItem(props: ClaimItemProps) { } as OptionsObject, ) } - }, [claimState]) + }, [showSnackbar]) const unClaimable = now < campaignInfo.startTime * 1000 || @@ -359,17 +351,10 @@ function ClaimItem(props: ClaimItemProps) { unlockMetaMask: classNames(classes.actionButton, classes.connectWallet), }}> {claimed diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/PoolInList.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/PoolInList.tsx index e044f04798a5..67441435125f 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/PoolInList.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/PoolInList.tsx @@ -5,7 +5,6 @@ import { FungibleTokenInitial, getChainDetailed, isSameAddress, - TransactionStateType, useAccount, useFungibleTokenDetailed, useFungibleTokensDetailed, @@ -35,10 +34,10 @@ import { useAvailabilityComputed } from './hooks/useAvailabilityComputed' import { usePoolTradeInfo } from './hooks/usePoolTradeInfo' import { ITO_Status, JSON_PayloadFromChain, JSON_PayloadInMask, PoolFromNetwork } from '../types' import { useDestructCallback } from './hooks/useDestructCallback' -import { useTransactionDialog } from '../../../web3/hooks/useTransactionDialog' import { omit } from 'lodash-unified' import { useSubscription } from 'use-subscription' import { PersistentStorages } from '../../../../shared' +import { useCallback } from 'react' const useStyles = makeStyles()((theme) => { const smallQuery = `@media (max-width: ${theme.breakpoints.values.sm}px)` @@ -175,11 +174,14 @@ export function PoolInList(props: PoolInListProps) { // #endregion // #region withdraw - const [destructState, destructCallback, resetDestructCallback] = useDestructCallback(pool.contract_address) - useTransactionDialog(null, destructState, TransactionStateType.CONFIRMED, () => { - onRetry() - resetDestructCallback() - }) + const [{ loading: destructing }, destructCallback] = useDestructCallback(pool.contract_address) + const destruct = useCallback( + async (pid: string) => { + await destructCallback(pid) + onRetry() + }, + [destructCallback, onRetry], + ) // #endregion const account = useAccount() @@ -202,7 +204,13 @@ export function PoolInList(props: PoolInListProps) { return ( <> {loadingTradeInfo || loadingAvailability ? null : canWithdraw ? ( - destructCallback(pool.pid)}> + destruct(pool.pid)}> {t('plugin_ito_withdraw')} ) : canSend ? ( diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useDestructCallback.ts b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useDestructCallback.ts index 2e736befd4e6..2176cfce5699 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useDestructCallback.ts +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useDestructCallback.ts @@ -1,43 +1,22 @@ -import { useCallback } from 'react' -import type { TransactionReceipt } from 'web3-core' import type { NonPayableTx } from '@masknet/web3-contracts/types/types' -import { TransactionEventType, TransactionStateType, useAccount, useTransactionState } from '@masknet/web3-shared-evm' +import { TransactionEventType, useAccount } from '@masknet/web3-shared-evm' +import { useAsyncFn } from 'react-use' import { useITO_Contract } from './useITO_Contract' export function useDestructCallback(ito_address: string) { const account = useAccount() const { contract: ITO_Contract } = useITO_Contract(ito_address) - const [destructState, setDestructState] = useTransactionState() - const destructCallback = useCallback( + return useAsyncFn( async (id: string) => { - if (!ITO_Contract || !id) { - setDestructState({ - type: TransactionStateType.UNKNOWN, - }) - return - } - - // start waiting for provider to confirm tx - setDestructState({ - type: TransactionStateType.WAIT_FOR_CONFIRMING, - }) + if (!ITO_Contract || !id) return // estimate gas and compose transaction const config = { from: account, - gas: await ITO_Contract.methods - .destruct(id) - .estimateGas({ - from: account, - }) - .catch((error: Error) => { - setDestructState({ - type: TransactionStateType.FAILED, - error, - }) - throw error - }), + gas: await ITO_Contract.methods.destruct(id).estimateGas({ + from: account, + }), } // send transaction and wait for hash @@ -45,39 +24,14 @@ export function useDestructCallback(ito_address: string) { ITO_Contract.methods .destruct(id) .send(config as NonPayableTx) - .on(TransactionEventType.RECEIPT, (receipt: TransactionReceipt) => { - setDestructState({ - type: TransactionStateType.CONFIRMED, - no: 0, - receipt, - }) - resolve(receipt.transactionHash) - }) - .on(TransactionEventType.CONFIRMATION, (no: number, receipt: TransactionReceipt) => { - setDestructState({ - type: TransactionStateType.CONFIRMED, - no, - receipt, - }) + .on(TransactionEventType.CONFIRMATION, (no, receipt) => { resolve(receipt.transactionHash) }) .on(TransactionEventType.ERROR, (error: Error) => { - setDestructState({ - type: TransactionStateType.FAILED, - error, - }) reject(error) }) }) }, [ITO_Contract], ) - - const resetCallback = useCallback(() => { - setDestructState({ - type: TransactionStateType.UNKNOWN, - }) - }, []) - - return [destructState, destructCallback, resetCallback] as const } diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSpaceStationContractClaimCallback.ts b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSpaceStationContractClaimCallback.ts index 3ceca469f049..ab72cf70ea35 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSpaceStationContractClaimCallback.ts +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSpaceStationContractClaimCallback.ts @@ -1,49 +1,28 @@ -import { useSpaceStationContract } from './useSpaceStationContract' -import { - useAccount, - useSpaceStationGalaxyConstants, - useTransactionState, - TransactionStateType, - TransactionEventType, -} from '@masknet/web3-shared-evm' -import { useCallback } from 'react' -import type { CampaignInfo } from '../../types' import type { SpaceStationGalaxy } from '@masknet/web3-contracts/types/SpaceStationGalaxy' import type { NonPayableTx } from '@masknet/web3-contracts/types/types' -import { getAccountClaimSignature, mutationParticipate } from '../../Worker/apis/spaceStationGalaxy' +import { TransactionEventType, useAccount, useSpaceStationGalaxyConstants } from '@masknet/web3-shared-evm' +import { useAsyncFn } from 'react-use' import Services from '../../../../extension/service' +import type { CampaignInfo } from '../../types' +import { getAccountClaimSignature, mutationParticipate } from '../../Worker/apis/spaceStationGalaxy' +import { useSpaceStationContract } from './useSpaceStationContract' export function useSpaceStationContractClaimCallback(campaignInfo: CampaignInfo) { const account = useAccount() const spaceStationContract = useSpaceStationContract() const { CONTRACT_ADDRESS } = useSpaceStationGalaxyConstants() - const [claimState, setClaimState] = useTransactionState() - const claimCallback = useCallback(async () => { + return useAsyncFn(async () => { if (!CONTRACT_ADDRESS || !spaceStationContract || !campaignInfo) { - setClaimState({ type: TransactionStateType.UNKNOWN }) return } - // start waiting for provider to confirm tx - setClaimState({ - type: TransactionStateType.WAIT_FOR_CONFIRMING, - }) - - let useSignature = '' - try { - useSignature = await Services.Ethereum.personalSign( - `${campaignInfo.name} + const useSignature = await Services.Ethereum.personalSign( + `${campaignInfo.name} ${campaignInfo.description}`, - account, - ) - } catch (error) { - setClaimState({ - type: TransactionStateType.FAILED, - error: new Error('Not allowed to claim.'), - }) - } + account, + ) const { allow, signature, verifyIDs, nftCoreAddress, powahs } = await getAccountClaimSignature( useSignature, @@ -53,10 +32,7 @@ ${campaignInfo.description}`, ) if (!allow) { - setClaimState({ - type: TransactionStateType.FAILED, - error: new Error('Not allowed to claim.'), - }) + throw new Error('Not allowed to claim.') } const params = [campaignInfo.id, nftCoreAddress, verifyIDs[0], powahs[0], signature] as Parameters< SpaceStationGalaxy['methods']['claim'] @@ -64,15 +40,9 @@ ${campaignInfo.description}`, // estimate gas and compose transaction const config = { from: account, - gas: await spaceStationContract.methods - .claim(...params) - .estimateGas({ from: account }) - .catch((error) => { - setClaimState({ type: TransactionStateType.FAILED, error }) - throw error - }), + gas: await spaceStationContract.methods.claim(...params).estimateGas({ from: account }), } - return new Promise(async (resolve, reject) => { + return new Promise(async (resolve, reject) => { spaceStationContract.methods .claim(...params) .send(config as NonPayableTx) @@ -87,39 +57,15 @@ ${campaignInfo.description}`, ) if (!participated) { - setClaimState({ - type: TransactionStateType.FAILED, - error: new Error('Failed to claim'), - }) + throw new Error('Failed to claim') } }) - .on(TransactionEventType.RECEIPT, (receipt) => { - setClaimState({ - type: TransactionStateType.CONFIRMED, - no: 0, - receipt, - }) - resolve() - }) .on(TransactionEventType.CONFIRMATION, (no, receipt) => { - setClaimState({ - type: TransactionStateType.CONFIRMED, - no, - receipt, - }) - resolve() + resolve(receipt.transactionHash) }) .on(TransactionEventType.ERROR, (error) => { - setClaimState({ - type: TransactionStateType.FAILED, - error, - }) reject(error) }) }) }, [account, campaignInfo, CONTRACT_ADDRESS, spaceStationContract]) - - const resetCallback = useCallback(() => {}, [setClaimState]) - - return [claimState, claimCallback, resetCallback] as const } diff --git a/packages/mask/src/plugins/MaskBox/SNSAdaptor/components/PreviewCard.tsx b/packages/mask/src/plugins/MaskBox/SNSAdaptor/components/PreviewCard.tsx index faff29761645..bacbc617e7b8 100644 --- a/packages/mask/src/plugins/MaskBox/SNSAdaptor/components/PreviewCard.tsx +++ b/packages/mask/src/plugins/MaskBox/SNSAdaptor/components/PreviewCard.tsx @@ -97,7 +97,7 @@ export function PreviewCard(props: PreviewCardProps) { }, [openBoxTransaction?.config, openBoxTransactionOverrides, openBoxTransactionGasLimit]) // #region open box - const [isOpening, openBoxCallback] = useTransactionCallback(txConfig, openBoxTransaction?.method) + const [{ loading: isOpening }, openBoxCallback] = useTransactionCallback(txConfig, openBoxTransaction?.method) const onRefresh = useCallback(() => { state[1](CardTab.Articles) setPaymentCount(1) diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftList.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftList.tsx index e26742b4bfd1..ba5f31bf2a4f 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftList.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftList.tsx @@ -3,8 +3,8 @@ import { ERC721ContractDetailed, formatNFT_TokenId } from '@masknet/web3-shared- import { List, ListItem, ListProps, Typography } from '@mui/material' import classnames from 'classnames' import { FC, HTMLProps, useState } from 'react' -import { useI18N } from '../../../utils' import { NFTCardStyledAssetPlayer } from '@masknet/shared' +import { useI18N } from '../locales' const useStyles = makeStyles()((theme) => { const smallQuery = `@media (max-width: ${theme.breakpoints.values.sm}px)` @@ -99,7 +99,7 @@ interface NftItemProps extends HTMLProps { } export const NftItem: FC = ({ contract, tokenId, className, claimed, renderOrder, ...rest }) => { - const { t } = useI18N() + const t = useI18N() const { classes } = useStyles() const [name, setName] = useState(formatNFT_TokenId(tokenId, 2)) @@ -116,7 +116,7 @@ export const NftItem: FC = ({ contract, tokenId, className, claime setERC721TokenName={setName} /> {name} - {claimed && {t('plugin_red_packet_claimed')}} + {claimed && {t.claimed()}}
) } diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryItem.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryItem.tsx index 286a4d520610..1b767ead5a4f 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryItem.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryItem.tsx @@ -1,5 +1,4 @@ import { FC, memo, MouseEventHandler, useCallback } from 'react' -import { Trans } from 'react-i18next' import classNames from 'classnames' import { fill } from 'lodash-unified' import { TokenIcon } from '@masknet/shared' @@ -9,12 +8,12 @@ import { WalletMessages } from '@masknet/plugin-wallet' import { ERC721ContractDetailed, useAccount, useERC721ContractDetailed } from '@masknet/web3-shared-evm' import { Box, ListItem, Typography } from '@mui/material' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../utils/i18n-next-ui' import { dateTimeFormat } from '../../ITO/assets/formatDate' import type { NftRedPacketHistory } from '../types' import { useAvailabilityNftRedPacket } from './hooks/useAvailabilityNftRedPacket' import { useNftAvailabilityComputed } from './hooks/useNftAvailabilityComputed' import { NftList } from './NftList' +import { Translate, useI18N } from '../locales' const useStyles = makeStyles()((theme) => { const smallQuery = `@media (max-width: ${theme.breakpoints.values.sm}px)` @@ -150,7 +149,7 @@ export interface NftRedPacketHistoryItemProps { export const NftRedPacketHistoryItem: FC = memo( ({ history, onSend, onShowPopover, onHidePopover }) => { const account = useAccount() - const { t } = useI18N() + const t = useI18N() const { classes } = useStyles() const { computed: { canSend, isPasswordValid }, @@ -175,7 +174,7 @@ export const NftRedPacketHistoryItem: FC = memo( } } const handleShowPopover = (anchor: HTMLElement) => { - onShowPopover(anchor, t('plugin_nft_red_packet_data_broken')) + onShowPopover(anchor, t.nft_data_broken()) } return ( @@ -196,10 +195,10 @@ export const NftRedPacketHistoryItem: FC = memo( - {history.message === '' ? t('plugin_red_packet_best_wishes') : history.message} + {history.message === '' ? t.best_wishes() : history.message} - {t('plugin_red_packet_history_duration', { + {t.history_duration({ startTime: dateTimeFormat(new Date(history.creation_time)), endTime: dateTimeFormat( new Date(history.creation_time + history.duration), @@ -219,7 +218,7 @@ export const NftRedPacketHistoryItem: FC = memo( )} variant="contained" size="large"> - {t('plugin_red_packet_history_send')} + {t.send()} ) : null} @@ -237,14 +236,13 @@ export const NftRedPacketHistoryItem: FC = memo(
- , }} values={{ - claimedShares: history.claimers.length, - shares: history.shares, + claimedShares: history.claimers.length.toString(), + shares: history.shares.toString(), }} /> diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryList.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryList.tsx index 16affe48056f..dc8e88b63923 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryList.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/NftRedPacketHistoryList.tsx @@ -7,7 +7,8 @@ import { useRef, useState } from 'react' import type { NftRedPacketHistory } from '../types' import { useNftRedPacketHistory } from './hooks/useNftRedPacketHistory' import { NftRedPacketHistoryItem } from './NftRedPacketHistoryItem' -import { useI18N } from '../../../utils' +import { useI18N as useBaseI18n } from '../../../utils' +import { useI18N } from '../locales' const useStyles = makeStyles()((theme, _, refs) => { const smallQuery = `@media (max-width: ${theme.breakpoints.values.sm}px)` @@ -80,7 +81,8 @@ interface Props { export function NftRedPacketHistoryList({ onSend }: Props) { const { classes } = useStyles() - const { t } = useI18N() + const { t: tr } = useBaseI18n() + const t = useI18N() const account = useAccount() const chainId = useChainId() const { histories, fetchMore, loading } = useNftRedPacketHistory(account, chainId) @@ -101,7 +103,7 @@ export function NftRedPacketHistoryList({ onSend }: Props) { if (chainId === ChainId.BSC) { return ( - {t('plugin_chain_not_supported', { chain: 'Binance Smart Chain' })} + {t.chain_not_supported({ chain: 'Binance Smart Chain' })} ) } @@ -109,7 +111,7 @@ export function NftRedPacketHistoryList({ onSend }: Props) { if (loading) { return ( - {t('loading')} + {tr('loading')} ) } @@ -117,7 +119,7 @@ export function NftRedPacketHistoryList({ onSend }: Props) { if (!histories?.length) { return ( - {t('plugin_red_packet_nft_no_history')} + {t.nft_no_history()} ) } diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/OperationFooter.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/OperationFooter.tsx index 1fc627f16cf3..06e1d7d1f0b7 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/OperationFooter.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/OperationFooter.tsx @@ -4,9 +4,10 @@ import { useRemoteControlledDialog } from '@masknet/shared-base-ui' import { ChainId, useAccount, useChainIdValid } from '@masknet/web3-shared-evm' import { Box, useTheme } from '@mui/material' import ActionButton from '../../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../../utils' import { EthereumChainBoundary } from '../../../../web3/UI/EthereumChainBoundary' +import { useI18N as useBaseI18n } from '../../../../utils' import { EthereumWalletConnectedBoundary } from '../../../../web3/UI/EthereumWalletConnectedBoundary' +import { useI18N } from '../../locales' import { useStyles } from './useStyles' interface OperationFooterProps { @@ -28,7 +29,8 @@ export function OperationFooter({ onClaimOrRefund, }: OperationFooterProps) { const { classes } = useStyles() - const { t } = useI18N() + const { t: tr } = useBaseI18n() + const t = useI18N() const account = useAccount() const chainIdValid = useChainIdValid() const theme = useTheme() @@ -45,14 +47,14 @@ export function OperationFooter({ if (!account) { return ( - {t('plugin_wallet_connect_a_wallet')} + {tr('plugin_wallet_connect_a_wallet')} ) } if (!chainIdValid) { return ( - {t('plugin_wallet_invalid_network')} + {tr('plugin_wallet_invalid_network')} ) } @@ -73,13 +75,7 @@ export function OperationFooter({ disabled={isLoading} variant="contained" onClick={onClaimOrRefund}> - {canClaim - ? isClaiming - ? t('plugin_red_packet_claiming') - : t('plugin_red_packet_claim') - : isRefunding - ? t('plugin_red_packet_refunding') - : t('plugin_red_packet_refund')} + {canClaim ? (isClaiming ? t.claiming() : t.claim()) : isRefunding ? t.refunding() : t.refund()} ) } @@ -109,7 +105,7 @@ export function OperationFooter({ startIcon={} variant="contained" onClick={onShare}> - {t('share')} + {tr('share')} )} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/index.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/index.tsx index 57be9b6a6518..d1f52642f190 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/index.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacket/index.tsx @@ -15,7 +15,8 @@ import { usePostLink } from '../../../../components/DataSource/usePostInfo' import { activatedSocialNetworkUI } from '../../../../social-network' import { isFacebook } from '../../../../social-network-adaptor/facebook.com/base' import { isTwitter } from '../../../../social-network-adaptor/twitter.com/base' -import { useI18N } from '../../../../utils' +import { useI18N as useBaseI18n } from '../../../../utils' +import { useI18N } from '../../locales' import type { RedPacketAvailability, RedPacketJSONPayload } from '../../types' import { RedPacketStatus } from '../../types' import { useAvailabilityComputed } from '../hooks/useAvailabilityComputed' @@ -31,7 +32,8 @@ export interface RedPacketProps { export function RedPacket(props: RedPacketProps) { const { payload } = props - const { t } = useI18N() + const t = useI18N() + const { t: tr } = useBaseI18n() const { classes } = useStyles() // context @@ -54,12 +56,6 @@ export function RedPacket(props: RedPacketProps) { // #region remote controlled transaction dialog const postLink = usePostLink() - const shareTextOption = { - sender: payload.sender.name, - payload: postLink, - network: resolveNetworkName(networkType), - account: isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account'), - } const [{ loading: isClaiming, value: claimTxHash }, claimCallback] = useClaimCallback( payload.contract_version, @@ -68,15 +64,25 @@ export function RedPacket(props: RedPacketProps) { payload.contract_version > 3 ? web3.eth.accounts.sign(account, payload.password).signature : payload.password, ) - const shareText = ( - listOfStatus.includes(RedPacketStatus.claimed) || claimTxHash - ? isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) - ? t('plugin_red_packet_share_message_official_account', shareTextOption) - : t('plugin_red_packet_share_message_not_twitter', shareTextOption) - : isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) - ? t('plugin_red_packet_share_unclaimed_message_official_account', shareTextOption) - : t('plugin_red_packet_share_unclaimed_message_not_twitter', shareTextOption) - ).trim() + const shareText = useMemo(() => { + const isOnTwitter = isTwitter(activatedSocialNetworkUI) + const isOnFacebook = isFacebook(activatedSocialNetworkUI) + const shareTextOption = { + sender: payload.sender.name, + payload: postLink.toString(), + network: resolveNetworkName(networkType), + account: isTwitter(activatedSocialNetworkUI) ? tr('twitter_account') : tr('facebook_account'), + } + if (listOfStatus.includes(RedPacketStatus.claimed) || claimTxHash) { + return isOnTwitter || isOnFacebook + ? t.share_message_official_account(shareTextOption) + : t.share_message_not_twitter(shareTextOption) + } + + return isOnTwitter || isOnFacebook + ? t.share_unclaimed_message_official_account(shareTextOption) + : t.share_unclaimed_message_not_twitter(shareTextOption) + }, [payload, postLink, networkType, claimTxHash, listOfStatus, activatedSocialNetworkUI, t, tr]) const [{ loading: isRefunding }, isRefunded, refundCallback] = useRefundCallback( payload.contract_version, @@ -105,8 +111,7 @@ export function RedPacket(props: RedPacketProps) { const myStatus = useMemo(() => { if (token && listOfStatus.includes(RedPacketStatus.claimed)) - return t( - 'plugin_red_packet_description_claimed', + return t.description_claimed( (availability as RedPacketAvailability).claimed_amount ? { amount: formatBalance( @@ -114,9 +119,9 @@ export function RedPacket(props: RedPacketProps) { token.decimals, 8, ), - symbol: token.symbol, + symbol: token.symbol || '-', } - : { amount: '', symbol: '' }, + : { amount: '-', symbol: '-' }, ) return '' }, [listOfStatus, t, token]) @@ -125,18 +130,18 @@ export function RedPacket(props: RedPacketProps) { if (!availability || !token) return if (listOfStatus.includes(RedPacketStatus.expired) && canRefund) - return t('plugin_red_packet_description_refund', { + return t.description_refund({ balance: formatBalance(availability.balance, token.decimals), - symbol: token.symbol, + symbol: token.symbol ?? '-', }) - if (listOfStatus.includes(RedPacketStatus.refunded)) return t('plugin_red_packet_description_refunded') - if (listOfStatus.includes(RedPacketStatus.expired)) return t('plugin_red_packet_description_expired') - if (listOfStatus.includes(RedPacketStatus.empty)) return t('plugin_red_packet_description_empty') - if (!payload.password) return t('plugin_red_packet_description_broken') - return t('plugin_red_packet_description_failover', { + if (listOfStatus.includes(RedPacketStatus.refunded)) return t.description_refunded() + if (listOfStatus.includes(RedPacketStatus.expired)) return t.description_expired() + if (listOfStatus.includes(RedPacketStatus.empty)) return t.description_empty() + if (!payload.password) return t.description_broken() + return t.description_failover({ total: formatBalance(payload.total, token.decimals), - symbol: token.symbol, - shares: payload.shares ?? '-', + symbol: token.symbol ?? '-', + shares: payload.shares.toString() ?? '-', }) }, [availability, canRefund, token, t, payload, listOfStatus]) @@ -150,7 +155,7 @@ export function RedPacket(props: RedPacketProps) { return ( - {t('loading')} + {tr('loading')} ) @@ -178,7 +183,7 @@ export function RedPacket(props: RedPacketProps) { {myStatus} - {t('plugin_red_packet_from', { name: payload.sender.name ?? '-' })} + {t.from({ name: payload.sender.name ?? '-' })}
diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketConfirmDialog.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketConfirmDialog.tsx index 1bde8315ac8e..601ee15fcc2b 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketConfirmDialog.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketConfirmDialog.tsx @@ -6,7 +6,6 @@ import { getChainName, isNativeTokenAddress, resolveTokenLinkOnExplorer, - TransactionStateType, useAccount, useChainId, useNetworkType, @@ -18,10 +17,10 @@ import { makeStyles } from '@masknet/theme' import LaunchIcon from '@mui/icons-material/Launch' import { FormattedBalance, useOpenShareTxDialog } from '@masknet/shared' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../utils' import { RedPacketSettings, useCreateCallback } from './hooks/useCreateCallback' import type { RedPacketJSONPayload, RedPacketRecord } from '../types' import { RedPacketRPC } from '../messages' +import { useI18N } from '../locales' const useStyles = makeStyles()((theme) => ({ link: { @@ -85,7 +84,7 @@ export interface ConfirmRedPacketFormProps { } export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { - const { t } = useI18N() + const t = useI18N() const { onBack, settings, onClose, onCreated } = props const { classes } = useStyles() const chainId = useChainId() @@ -101,12 +100,7 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { const web3 = useWeb3() const account = useAccount() const { address: publicKey, privateKey } = useMemo(() => web3.eth.accounts.create(), []) - const [createState, createCallback, resetCreateCallback] = useCreateCallback(settings!, contract_version, publicKey) - const isCreating = [ - TransactionStateType.WAIT_FOR_CONFIRMING, - TransactionStateType.HASH, - TransactionStateType.RECEIPT, - ].includes(createState.type) + const [{ loading: isCreating }, createCallback] = useCreateCallback(settings!, contract_version, publicKey) const openShareTxDialog = useOpenShareTxDialog() const createRedpacket = useCallback(async () => { const receipt = await createCallback() @@ -114,8 +108,6 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { await openShareTxDialog({ hash: receipt.transactionHash, }) - // reset state - resetCreateCallback() // the settings is not available if (!settings?.token) return @@ -141,9 +133,17 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { payload.current.creation_time = Number.parseInt(CreationSuccess.creation_time, 10) * 1000 payload.current.token = settings.token + const record: RedPacketRecord = { + id: receipt.transactionHash!, + from: '', + password: privateKey, + contract_version, + } + RedPacketRPC.discoverRedPacket(record) + // output the redpacket as JSON payload onCreated(payload.current) - }, [createCallback, resetCreateCallback, settings, openShareTxDialog, onCreated]) + }, [createCallback, settings, openShareTxDialog, onCreated]) // #endregion // assemble JSON payload @@ -154,7 +154,6 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { const { HAPPY_RED_PACKET_ADDRESS_V4 } = useRedPacketConstants() const networkType = useNetworkType() useEffect(() => { - if (createState.type !== TransactionStateType.UNKNOWN) return const contractAddress = HAPPY_RED_PACKET_ADDRESS_V4 if (!contractAddress) { onClose() @@ -163,25 +162,8 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { payload.current.contract_address = contractAddress payload.current.contract_version = contract_version payload.current.network = getChainName(chainId) - }, [chainId, networkType, contract_version, createState]) + }, [chainId, networkType, contract_version]) - useEffect(() => { - if (!settings?.token || createState.type === TransactionStateType.UNKNOWN) return - - // storing the created red packet in DB, it helps retrieve red packet password later - // save to the database early, otherwise red-packet would lose when close the tx dialog or - // web page before create successfully. - if (createState.type === TransactionStateType.HASH && createState.hash) { - payload.current.txid = createState.hash - const record: RedPacketRecord = { - id: createState.hash!, - from: '', - password: privateKey, - contract_version, - } - RedPacketRPC.discoverRedPacket(record) - } - }, [createState /* update tx dialog only if state changed */]) // #endregion return ( @@ -193,7 +175,7 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { - {t('plugin_red_packet_token')} + {t.token()} @@ -215,18 +197,18 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { - {t('plugin_red_packet_split_mode')} + {t.split_mode()} - {settings?.isRandom ? t('plugin_red_packet_random') : t('plugin_red_packet_average')} + {settings?.isRandom ? t.random() : t.average()} - {t('plugin_red_packet_shares')} + {t.shares()} @@ -239,7 +221,7 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { <> - {t('plugin_red_packet_amount_per_share')} + {t.amount_per_share()} @@ -257,7 +239,7 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { - {t('plugin_red_packet_amount_total')} + {t.amount_total()} @@ -273,21 +255,21 @@ export function RedPacketConfirmDialog(props: ConfirmRedPacketFormProps) { - {t('plugin_red_packet_hint')} + {t.hint()} - {t('plugin_red_packet_back')} + {t.back()} - {t('plugin_red_packet_send_symbol', { + {t.send_symbol({ amount: formatBalance(settings?.total, settings?.token?.decimals ?? 0), - symbol: settings?.token?.symbol, + symbol: settings?.token?.symbol ?? '-', })} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketCreateNew.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketCreateNew.tsx index cdc94626b9c1..3ceac4ff3cbd 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketCreateNew.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketCreateNew.tsx @@ -3,7 +3,7 @@ import { useChainId, ChainId } from '@masknet/web3-shared-evm' import { RedPacketFormProps, RedPacketERC20Form } from './RedPacketERC20Form' import { RedPacketERC721Form } from './RedPacketERC721Form' import AbstractTab, { AbstractTabProps } from '../../../components/shared/AbstractTab' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' import { activatedSocialNetworkUI } from '../../../social-network' import { IconURLs } from './IconURL' import { EnhanceableSite } from '@masknet/shared-base' @@ -49,7 +49,7 @@ const useStyles = makeStyles()((theme, { snsId }) => ({ export function RedPacketCreateNew(props: RedPacketFormProps & { state: readonly [number, (next: number) => void] }) { const { origin, onNext, onChange, onClose, state } = props - const { t } = useI18N() + const t = useI18N() const { classes } = useStyles({ snsId: activatedSocialNetworkUI.networkIdentifier }) const chainId = useChainId() @@ -59,7 +59,7 @@ export function RedPacketCreateNew(props: RedPacketFormProps & { state: readonly label: (
- {t('plugin_red_packet_erc20_tab_title')} + {t.erc20_tab_title()}
), children: , @@ -69,7 +69,7 @@ export function RedPacketCreateNew(props: RedPacketFormProps & { state: readonly label: (
- {t('plugin_red_packet_erc721_tab_title')} + {t.erc721_tab_title()}
), children: , diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketDialog.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketDialog.tsx index cdadc425c58d..5e4e92c5d94a 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketDialog.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketDialog.tsx @@ -13,7 +13,7 @@ import { } from '../../../components/DataSource/useActivatedUI' import AbstractTab, { AbstractTabProps } from '../../../components/shared/AbstractTab' import Services from '../../../extension/service' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' import { WalletMessages } from '../../Wallet/messages' import { RedPacketMetaKey } from '../constants' import { DialogTabs, RedPacketJSONPayload, RpTypeTabs } from '../types' @@ -63,7 +63,7 @@ interface RedPacketDialogProps extends withClasses { } export default function RedPacketDialog(props: RedPacketDialogProps) { - const { t } = useI18N() + const t = useI18N() const chainId = useChainId() const account = useAccount() const { classes } = useStyles() @@ -134,7 +134,7 @@ export default function RedPacketDialog(props: RedPacketDialogProps) { const tabProps: AbstractTabProps = { tabs: [ { - label: t('plugin_red_packet_create_new'), + label: t.create_new(), children: ( , sx: { p: 0 }, }, @@ -172,7 +172,7 @@ export default function RedPacketDialog(props: RedPacketDialogProps) { ) const isCreateStep = step === CreateRedPacketPageStep.NewRedPacketPage - const title = isCreateStep ? t('plugin_red_packet_display_name') : t('plugin_red_packet_details') + const title = isCreateStep ? t.display_name() : t.details() return ( diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC20Form.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC20Form.tsx index a4843e141d93..1055ed3cbb27 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC20Form.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC20Form.tsx @@ -17,7 +17,8 @@ import { ChangeEvent, useCallback, useEffect, useMemo, useRef, useState } from ' import { usePickToken } from '@masknet/shared' import { useCurrentIdentity, useCurrentLinkedPersona } from '../../../components/DataSource/useActivatedUI' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' +import { useI18N as useBaseI18n } from '../../../utils' import { EthereumERC20TokenApprovedBoundary } from '../../../web3/UI/EthereumERC20TokenApprovedBoundary' import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' import { TokenAmountPanel } from '../../../web3/UI/TokenAmountPanel' @@ -82,7 +83,8 @@ export interface RedPacketFormProps extends withClasses { } export function RedPacketERC20Form(props: RedPacketFormProps) { - const { t } = useI18N() + const t = useI18N() + const { t: tr } = useBaseI18n() const classes = useStylesExtends(useStyles(), props) const { onChange, onNext, origin } = props // context @@ -105,7 +107,7 @@ export function RedPacketERC20Form(props: RedPacketFormProps) { // #region packet settings const [isRandom, setRandom] = useState(origin?.isRandom ? 1 : 0) - const [message, setMessage] = useState(origin?.message || t('plugin_red_packet_best_wishes')) + const [message, setMessage] = useState(origin?.message || t.best_wishes()) const currentIdentity = useCurrentIdentity() const { value: linkedPersona } = useCurrentLinkedPersona() @@ -153,32 +155,32 @@ export function RedPacketERC20Form(props: RedPacketFormProps) { // #endregion const validationMessage = useMemo(() => { - if (!token) return t('plugin_wallet_select_a_token') - if (!account) return t('plugin_wallet_connect_a_wallet') + if (!token) return t.select_a_token() + if (!account) return tr('plugin_wallet_connect_a_wallet') if (isZero(shares || '0')) return 'Enter shares' if (isGreaterThan(shares || '0', 255)) return 'At most 255 recipients' - if (isZero(amount)) return t('plugin_dhedge_enter_an_amount') + if (isZero(amount)) return tr('plugin_dhedge_enter_an_amount') if (isGreaterThan(totalAmount, tokenBalance)) - return t('plugin_gitcoin_insufficient_balance', { symbol: token.symbol }) + return tr('plugin_gitcoin_insufficient_balance', { symbol: token.symbol }) if (!isDivisible) - return t('plugin_red_packet_indivisible', { - symbol: token.symbol, + return t.indivisible({ + symbol: token.symbol!, amount: formatBalance(1, token.decimals), }) return '' - }, [account, amount, totalAmount, shares, token, tokenBalance]) + }, [account, amount, totalAmount, shares, token, tokenBalance, t, tr]) const creatingParams = useMemo( () => ({ duration, isRandom: Boolean(isRandom), name: senderName, - message: message || t('plugin_red_packet_best_wishes'), + message: message || t.best_wishes(), shares: shares || 0, token: token ? (omit(token, ['logoURI']) as FungibleTokenDetailed) : undefined, total: totalAmount.toFixed(), }), - [isRandom, senderName, message, t('plugin_red_packet_best_wishes'), shares, token, totalAmount], + [isRandom, senderName, message, t.best_wishes(), shares, token, totalAmount], ) const onClick = useCallback(() => { @@ -193,7 +195,7 @@ export function RedPacketERC20Form(props: RedPacketFormProps) { <>
- {t('plugin_red_packet_split_mode')} + {t.split_mode()} @@ -241,7 +243,7 @@ export function RedPacketERC20Form(props: RedPacketFormProps) {
@@ -282,7 +284,7 @@ export function RedPacketERC20Form(props: RedPacketFormProps) { fullWidth disabled={!!validationMessage} onClick={onClick}> - {validationMessage || t('plugin_red_packet_next')} + {validationMessage || t.next()} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC721Form.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC721Form.tsx index 63c55e2e534b..b53e3f69a5da 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC721Form.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketERC721Form.tsx @@ -1,7 +1,7 @@ import { Box, Typography, List, ListItem, CircularProgress } from '@mui/material' import { makeStyles } from '@masknet/theme' import { useState, useCallback, useEffect, useMemo } from 'react' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' import classNames from 'classnames' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' import { ERC721ContractSelectPanel } from '../../../web3/UI/ERC721ContractSelectPanel' @@ -201,7 +201,7 @@ interface RedPacketERC721FormProps { onClose: () => void } export function RedPacketERC721Form(props: RedPacketERC721FormProps) { - const { t } = useI18N() + const t = useI18N() const { onClose } = props const { classes } = useStyles() const [open, setOpen] = useState(false) @@ -259,10 +259,10 @@ export function RedPacketERC721Form(props: RedPacketERC721FormProps) { const { RED_PACKET_NFT_ADDRESS } = useNftRedPacketConstants() const validationMessage = useMemo(() => { - if (!balance) return t('plugin_red_packet_erc721_insufficient_balance') - if (tokenDetailedList.length === 0) return t('plugin_wallet_select_a_token') + if (!balance) return t.erc721_insufficient_balance() + if (tokenDetailedList.length === 0) return t.select_a_token() return '' - }, [tokenDetailedList.length, balance]) + }, [tokenDetailedList.length, balance, t]) return ( <> @@ -297,8 +297,11 @@ export function RedPacketERC721Form(props: RedPacketERC721FormProps) { {tokenDetailedOwnerList.length === 0 ? 'All' - : t('plugin_red_packet_nft_select_all_option', { - total: Math.min(NFT_RED_PACKET_MAX_SHARES, tokenDetailedOwnerList.length), + : t.nft_select_all_option({ + total: Math.min( + NFT_RED_PACKET_MAX_SHARES, + tokenDetailedOwnerList.length, + ).toString(), })}
@@ -310,9 +313,7 @@ export function RedPacketERC721Form(props: RedPacketERC721FormProps) { )}>
- - {t('plugin_red_packet_nft_select_partially_option')} - + {t.nft_select_partially_option()}
) @@ -338,12 +339,8 @@ export function RedPacketERC721Form(props: RedPacketERC721FormProps) { {contract && balance && !loadingOwnerList ? ( <> - - {t('plugin_red_packet_nft_unapproved_tip')} - - - {t('plugin_red_packet_nft_approve_all_tip')} - + {t.nft_unapproved_tip()} + {t.nft_approve_all_tip()} ) : null} @@ -358,7 +355,7 @@ export function RedPacketERC721Form(props: RedPacketERC721FormProps) { disabled={!!validationMessage} fullWidth onClick={() => setOpenConfirmDialog(true)}> - {t('plugin_red_packet_next')} + {t.next()} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx index 3e0749c9e2fc..1a2595f81691 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx @@ -18,9 +18,8 @@ import intervalToDuration from 'date-fns/intervalToDuration' import nextDay from 'date-fns/nextDay' import { omit, pick } from 'lodash-unified' import { MouseEvent, useCallback, useState } from 'react' -import { Trans } from 'react-i18next' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../utils' +import { Translate, useI18N } from '../locales' import { dateTimeFormat } from '../../ITO/assets/formatDate' import { StyledLinearProgress } from '../../ITO/SNSAdaptor/StyledLinearProgress' import { RedPacketJSONPayload, RedPacketJSONPayloadFromChain, RedPacketStatus } from '../types' @@ -185,7 +184,7 @@ export interface RedPacketInHistoryListProps { export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { const account = useAccount() const { history, onSelect } = props - const { t } = useI18N() + const t = useI18N() const { classes } = useStyles() const isSmall = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm')) const { @@ -246,28 +245,24 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) {
- {history.sender.message === '' - ? t('plugin_red_packet_best_wishes') - : history.sender.message} + {history.sender.message === '' ? t.best_wishes() : history.sender.message}
- {t('plugin_red_packet_history_duration', { + {t.history_duration({ startTime: dateTimeFormat(new Date(history.creation_time)), endTime: dateTimeFormat(new Date(history.creation_time + history.duration), false), })} - {t('plugin_red_packet_history_total_amount', { + {t.history_total_amount({ amount: formatBalance(history.total, historyToken?.decimals, 6), - symbol: historyToken?.symbol, + symbol: historyToken?.symbol!, })} - {t('plugin_red_packet_history_split_mode', { - mode: history.is_random - ? t('plugin_red_packet_random') - : t('plugin_red_packet_average'), + {t.history_split_mode({ + mode: history.is_random ? t.random() : t.average(), })}
@@ -291,12 +286,12 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { variant="contained" size="large"> {canSend - ? t('plugin_red_packet_history_send') + ? t.send() : refunded - ? t('plugin_red_packet_refunding') + ? t.refunding() : listOfStatus.includes(RedPacketStatus.empty) - ? t('plugin_red_packet_empty') - : t('plugin_red_packet_refund')} + ? t.empty() + : t.refund()} - {t('plugin_red_packet_data_broken', { duration: formatRefundDuration })} + {t.data_broken({ duration: formatRefundDuration })}
@@ -319,20 +314,18 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { />
- , }} values={{ - claimedShares: history.claimers?.length ?? 0, - shares: history.shares, + claimedShares: history.claimers?.length.toString() ?? '0', + shares: history.shares.toString(), }} /> - , span: , @@ -344,7 +337,7 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { historyToken?.decimals, 6, ), - symbol: historyToken?.symbol, + symbol: historyToken?.symbol!, }} /> diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketNft.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketNft.tsx index 3db5fa3656c9..62b11814cbc8 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketNft.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketNft.tsx @@ -1,30 +1,31 @@ +import { PluginWalletConnectIcon, SharedIcon } from '@masknet/icons' +import { NFTCardStyledAssetPlayer } from '@masknet/shared' +import { openWindow } from '@masknet/shared-base-ui' import { makeStyles } from '@masknet/theme' import { - useAccount, resolveAddressLinkOnExplorer, - useWeb3, resolveNetworkName, - useNetworkType, TransactionStateType, + useAccount, + useNetworkType, + useWeb3, } from '@masknet/web3-shared-evm' import LaunchIcon from '@mui/icons-material/Launch' -import { Card, CardHeader, Typography, Link, CardMedia, CardContent, Button, Box, Skeleton } from '@mui/material' -import { useCallback, useEffect, useState } from 'react' -import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' -import { useI18N } from '../../../utils' -import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' -import type { RedPacketNftJSONPayload } from '../types' -import { useClaimNftRedpacketCallback } from './hooks/useClaimNftRedpacketCallback' -import { useAvailabilityNftRedPacket } from './hooks/useAvailabilityNftRedPacket' +import { Box, Button, Card, CardContent, CardHeader, CardMedia, Link, Skeleton, Typography } from '@mui/material' import classNames from 'classnames' +import { useCallback, useEffect, useMemo, useState } from 'react' import { usePostLink } from '../../../components/DataSource/usePostInfo' +import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' import { activatedSocialNetworkUI } from '../../../social-network' -import { isTwitter } from '../../../social-network-adaptor/twitter.com/base' import { isFacebook } from '../../../social-network-adaptor/facebook.com/base' -import { NFTCardStyledAssetPlayer } from '@masknet/shared' -import { openWindow } from '@masknet/shared-base-ui' -import { PluginWalletConnectIcon, SharedIcon } from '@masknet/icons' +import { isTwitter } from '../../../social-network-adaptor/twitter.com/base' +import { useI18N as useBaseI18N } from '../../../utils' import { EthereumChainBoundary } from '../../../web3/UI/EthereumChainBoundary' +import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' +import { useI18N } from '../locales' +import type { RedPacketNftJSONPayload } from '../types' +import { useAvailabilityNftRedPacket } from './hooks/useAvailabilityNftRedPacket' +import { useClaimNftRedpacketCallback } from './hooks/useClaimNftRedpacketCallback' const useStyles = makeStyles()((theme) => ({ root: { @@ -249,7 +250,8 @@ export interface RedPacketNftProps { } export function RedPacketNft({ payload }: RedPacketNftProps) { - const { t } = useI18N() + const { t: i18n } = useBaseI18N() + const t = useI18N() const { classes } = useStyles() const web3 = useWeb3() const account = useAccount() @@ -295,29 +297,23 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { // #region on share const postLink = usePostLink() const networkType = useNetworkType() - const shareText = availability?.isClaimed - ? t( - isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) - ? 'plugin_red_packet_nft_share_claimed_message' - : 'plugin_red_packet_nft_share_claimed_message_not_twitter', - { - sender: payload.senderName, - payload: postLink, - network: resolveNetworkName(networkType), - account: isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account'), - }, - ).trim() - : t( - isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) - ? 'plugin_red_packet_nft_share_foreshow_message' - : 'plugin_red_packet_nft_share_foreshow_message_not_twitter', - { - sender: payload.senderName, - payload: postLink, - network: resolveNetworkName(networkType), - account: isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account'), - }, - ).trim() + const shareText = useMemo(() => { + const isTwitterOrFacebook = isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) + const options = { + sender: payload.senderName, + payload: postLink.toString(), + network: resolveNetworkName(networkType), + account: isTwitter(activatedSocialNetworkUI) ? i18n('twitter_account') : i18n('facebook_account'), + } + if (availability?.isClaimed) { + return isTwitterOrFacebook + ? t.nft_share_claimed_message(options) + : t.nft_share_claimed_message_not_twitter(options) + } + return isTwitterOrFacebook + ? t.nft_share_foreshow_message(options) + : t.nft_share_foreshow_message_not_twitter(options) + }, [availability?.isClaimed, t, i18n]) const onShare = useCallback(() => { if (shareText) activatedSocialNetworkUI.utils.share?.(shareText) @@ -330,13 +326,13 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { - {t('loading_failed')} + {i18n('loading_failed')}
@@ -389,14 +385,14 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { ) : ( - {availability.claimedAmount}/{availability.totalAmount} {t('collectibles_name')} + {availability.claimedAmount}/{availability.totalAmount} {i18n('collectibles_name')} )} - {t('plugin_red_packet_nft_tip')} + {t.nft_tip()}
@@ -426,7 +422,7 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { />
- {availability.expired ? t('plugin_red_packet_expired') : t('plugin_red_packet_completed')} + {availability.expired ? t.expired() : t.completed()}
@@ -439,7 +435,7 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { fullWidth onClick={onShare} variant="contained"> - {t('share')} + {i18n('share')} {availability.isClaimed ? null : ( @@ -460,7 +456,7 @@ export function RedPacketNft({ payload }: RedPacketNftProps) { onClick={claimCallback} className={classes.button} fullWidth> - {isClaiming ? t('plugin_red_packet_claiming') : t('plugin_red_packet_claim')} + {isClaiming ? t.claiming() : t.claim()} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketPast.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketPast.tsx index 644196520eae..40f166399cf0 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketPast.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketPast.tsx @@ -2,7 +2,7 @@ import { useChainId, ChainId } from '@masknet/web3-shared-evm' import { makeStyles } from '@masknet/theme' import { useCallback, useState } from 'react' import AbstractTab, { AbstractTabProps } from '../../../components/shared/AbstractTab' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' import { IconURLs } from './IconURL' import { RedPacketHistoryList } from './RedPacketHistoryList' import { NftRedPacketHistoryList } from './NftRedPacketHistoryList' @@ -58,7 +58,7 @@ interface Props { } export function RedPacketPast({ onSelect, onClose }: Props) { - const { t } = useI18N() + const t = useI18N() const { classes } = useStyles() const state = useState(RpTypeTabs.ERC20) const chainId = useChainId() @@ -95,7 +95,7 @@ export function RedPacketPast({ onSelect, onClose }: Props) { label: (
- {t('plugin_red_packet_erc20_tab_title')} + {t.erc20_tab_title()}
), children: , @@ -105,7 +105,7 @@ export function RedPacketPast({ onSelect, onClose }: Props) { label: (
- {t('plugin_red_packet_erc721_tab_title')} + {t.erc721_tab_title()}
), children: , diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketMessagePanel.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketMessagePanel.tsx index 7270b5f44c14..86b54fb72449 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketMessagePanel.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketMessagePanel.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames' import { Box, InputBase, Typography } from '@mui/material' import { makeStyles } from '@masknet/theme' -import { useI18N } from '../../../utils' +import { useI18N } from '../locales' const useStyles = makeStyles()((theme) => { return { @@ -40,20 +40,20 @@ export interface RedpacketMessagePanelProps { export function RedpacketMessagePanel(props: RedpacketMessagePanelProps) { const { onChange, message } = props const { classes } = useStyles() - const { t } = useI18N() + const t = useI18N() return (
- {t('plugin_red_packet_message_label')} + {t.message_label()}
onChange(e.target.value)} - inputProps={{ placeholder: t('plugin_red_packet_best_wishes') }} + inputProps={{ placeholder: t.best_wishes() }} value={message} />
diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketNftConfirmDialog.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketNftConfirmDialog.tsx index 0a676a0f9a01..3b96cc508aee 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketNftConfirmDialog.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedpacketNftConfirmDialog.tsx @@ -20,7 +20,7 @@ import { Button, Grid, Link, Typography, DialogContent, List, ListItem } from '@ import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' import LaunchIcon from '@mui/icons-material/Launch' -import { useI18N } from '../../../utils' +import { useI18N as useBaseI18N } from '../../../utils' import { useCreateNftRedpacketCallback } from './hooks/useCreateNftRedpacketCallback' import { useCurrentIdentity } from '../../../components/DataSource/useActivatedUI' import { useCompositionContext } from '@masknet/plugin-infra/content-script' @@ -29,6 +29,7 @@ import { WalletMessages } from '../../Wallet/messages' import { RedPacketRPC } from '../messages' import { useAsync } from 'react-use' import Services from '../../../extension/service' +import { useI18N } from '../locales' const useStyles = makeStyles()((theme) => ({ root: { @@ -167,7 +168,8 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) const web3 = useWeb3() const { attachMetadata } = useCompositionContext() - const { t } = useI18N() + const { t: i18n } = useBaseI18N() + const t = useI18N() const { address: publicKey, privateKey } = useMemo(() => web3.eth.accounts.create(), []) const duration = 60 * 60 * 24 const currentIdentity = useCurrentIdentity() @@ -236,12 +238,12 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) }, [createState, onSendPost]) return ( - + - {t('plugin_red_packet_nft_account_name')} + {t.nft_account_name()} @@ -266,7 +268,7 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) - {t('plugin_red_packet_nft_attached_message')} + {t.nft_attached_message()} @@ -274,13 +276,13 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) variant="body1" color="textPrimary" align="right" - className={(classes.text, classes.bold, classes.ellipsis)}> + className={classNames(classes.text, classes.bold, classes.ellipsis)}> {message} - {t('plugin_wallet_collections')} + {t.collections()} @@ -307,7 +309,7 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) - {t('plugin_red_packet_nft_total_amount')} + {t.nft_total_amount()} @@ -327,7 +329,7 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) onClick={onBack} size="large" variant="contained"> - {t('cancel')} + {i18n('cancel')} @@ -344,8 +346,8 @@ export function RedpacketNftConfirmDialog(props: RedpacketNftConfirmDialogProps) onClick={onSendTx} className={classNames(classes.button, classes.sendButton)} fullWidth> - {t('plugin_red_packet_send_symbol', { - amount: tokenList.length, + {t.send_symbol({ + amount: tokenList.length.toString(), symbol: tokenList.length > 1 ? 'NFTs' : 'NFT', })} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/SelectNftTokenDialog.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/SelectNftTokenDialog.tsx index 0915e71da8a8..acf9198e6695 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/SelectNftTokenDialog.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/SelectNftTokenDialog.tsx @@ -8,17 +8,17 @@ import { isSameAddress, formatNFT_TokenId, } from '@masknet/web3-shared-evm' -import { useI18N } from '../../../utils' +import { useI18N as useBaseI18N } from '../../../utils' import { DialogContent, Box, InputBase, Paper, Button, Typography, ListItem, CircularProgress } from '@mui/material' import QuestionMarkIcon from '@mui/icons-material/QuestionMark' import { makeStyles, ShadowRootTooltip } from '@masknet/theme' import { useCallback, useState, useEffect } from 'react' import { SearchIcon } from '@masknet/icons' import CheckIcon from '@mui/icons-material/Check' -import { Trans } from 'react-i18next' import { useUpdate } from 'react-use' import { findLastIndex } from 'lodash-unified' import { NFT_RED_PACKET_MAX_SHARES } from '../constants' +import { useI18N, Translate } from '../locales' interface StyleProps { isSelectSharesExceed: boolean @@ -320,7 +320,8 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { onClose, loadingOwnerList, } = props - const { t } = useI18N() + const { t: tr } = useBaseI18N() + const t = useI18N() const account = useAccount() const [tokenDetailed, setTokenDetailed] = useState() const [searched, setSearched] = useState(false) @@ -435,8 +436,7 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { }, [tokenDetailed, tokenDetailedSelectedList, setExistTokenDetailedList, onClose]) const NonExistedTokenList = () => ( - @@ -452,12 +452,10 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { /> ) + const maxSharesOptions = { amount: NFT_RED_PACKET_MAX_SHARES.toString() } + return ( - + {tokenDetailedOwnerList.length === 0 ? ( @@ -476,17 +474,13 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { className={classes.searchButton} variant="contained" onClick={onSearch}> - {t('search')} + {t.search()}
{loadingToken || !tokenDetailed || !contract ? ( - {loadingToken - ? t('wallet_loading_token') - : searched - ? t('wallet_search_no_result') - : null} + {loadingToken ? t.loading_token() : searched ? t.search_no_result() : null} ) : ( @@ -512,21 +506,15 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) {
- {isSelectSharesExceed - ? t('plugin_red_packet_nft_max_shares_tip', { amount: NFT_RED_PACKET_MAX_SHARES }) - : null} + {isSelectSharesExceed ? t.nft_max_shares_tip(maxSharesOptions) : null} {tokenDetailedSelectedList.length > NFT_RED_PACKET_MAX_SHARES - ? t('plugin_red_packet_nft_max_shares_tip', { - amount: NFT_RED_PACKET_MAX_SHARES, - }) - : t('plugin_red_packet_nft_max_shares', { - amount: NFT_RED_PACKET_MAX_SHARES, - })} + ? t.nft_max_shares_tip(maxSharesOptions) + : t.nft_max_shares(maxSharesOptions)} } placement="top-end" @@ -546,10 +534,10 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { variant="contained" onClick={onSubmit}> {tokenDetailed && !isOwner - ? t('wallet_add_nft_invalid_owner') + ? t.nft_invalid_owner() : isAdded - ? t('wallet_add_nft_already_added') - : t('confirm')} + ? t.nft_already_added() + : tr('confirm')} ) : ( @@ -574,14 +562,12 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { className={classes.searchButton} variant="contained" onClick={tokenDetailedOwnerList.length === 0 ? onSearch : onFilter}> - {t('search')} + {t.search()}
{(loadingToken || !tokenDetailed) && searched ? ( - - {loadingToken ? t('wallet_loading_token') : t('wallet_search_no_result')} - + {loadingToken ? t.loading_token() : t.search_no_result()} ) : tokenDetailed?.info.name ? ( @@ -606,12 +592,11 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { {selectAll ? : null} - {t('select_all')} + {tr('select_all')} - , }} @@ -670,9 +655,7 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { ) : null} - {isSelectSharesExceed - ? t('plugin_red_packet_nft_max_shares_tip', { amount: NFT_RED_PACKET_MAX_SHARES }) - : null} + {isSelectSharesExceed ? t.nft_max_shares_tip(maxSharesOptions) : null} @@ -681,12 +664,8 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { title={ {tokenDetailedSelectedList.length > NFT_RED_PACKET_MAX_SHARES - ? t('plugin_red_packet_nft_max_shares_tip', { - amount: NFT_RED_PACKET_MAX_SHARES, - }) - : t('plugin_red_packet_nft_max_shares', { - amount: NFT_RED_PACKET_MAX_SHARES, - })} + ? t.nft_max_shares_tip(maxSharesOptions) + : t.nft_max_shares(maxSharesOptions)} } placement="top-end" @@ -714,10 +693,10 @@ export function SelectNftTokenDialog(props: SelectNftTokenDialogProps) { variant="contained" onClick={onSubmit}> {tokenDetailed && !isOwner - ? t('wallet_add_nft_invalid_owner') + ? t.nft_invalid_owner() : isAdded - ? t('wallet_add_nft_already_added') - : t('confirm')} + ? t.nft_already_added() + : tr('confirm')} )} diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx index aced424d9e3e..f5b967e28b4c 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/hooks/useCreateCallback.tsx @@ -5,14 +5,13 @@ import { EthereumTokenType, FungibleTokenDetailed, TransactionEventType, - TransactionStateType, useAccount, useChainId, useTokenConstants, - useTransactionState, } from '@masknet/web3-shared-evm' import { omit } from 'lodash-unified' import { useCallback } from 'react' +import { useAsyncFn } from 'react-use' import type { TransactionReceipt } from 'web3-core' import Web3Utils from 'web3-utils' import { useRedPacketContract } from './useRedPacketContract' @@ -120,17 +119,10 @@ export function useCreateParams(redPacketSettings: RedPacketSettings | undefined export function useCreateCallback(redPacketSettings: RedPacketSettings, version: number, publicKey: string) { const account = useAccount() const chainId = useChainId() - const [createState, setCreateState] = useTransactionState() const redPacketContract = useRedPacketContract(version) const getCreateParams = useCreateParams(redPacketSettings, version, publicKey) - const resetCallback = useCallback(() => { - setCreateState({ - type: TransactionStateType.UNKNOWN, - }) - }, []) - const createCallback = useCallback(async () => { - resetCallback() + return useAsyncFn(async () => { const { token } = redPacketSettings const createParams = await getCreateParams() @@ -139,28 +131,15 @@ export function useCreateCallback(redPacketSettings: RedPacketSettings, version: const { gas, params, paramsObj, gasError } = createParams if (gasError) { - setCreateState({ - type: TransactionStateType.FAILED, - error: gasError, - }) return } try { checkParams(paramsObj) } catch (error) { - setCreateState({ - type: TransactionStateType.FAILED, - error: error as Error, - }) return } - // pre-step: start waiting for provider to confirm tx - setCreateState({ - type: TransactionStateType.WAIT_FOR_CONFIRMING, - }) - // estimate gas and compose transaction const value = toFixed(token.type === EthereumTokenType.Native ? paramsObj.total : 0) const config: PayableTx = { @@ -175,22 +154,11 @@ export function useCreateCallback(redPacketSettings: RedPacketSettings, version: .create_red_packet(...params) .send(config) .on(TransactionEventType.CONFIRMATION, (no, receipt) => { - setCreateState({ - type: TransactionStateType.CONFIRMED, - no, - receipt, - }) resolve(receipt) }) .on(TransactionEventType.ERROR, (error: Error) => { - setCreateState({ - type: TransactionStateType.FAILED, - error, - }) reject(error) }) }) }, [account, redPacketContract, redPacketSettings, chainId, getCreateParams]) - - return [createState, createCallback, resetCallback] as const } diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/index.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/index.tsx index f56ca1eb9aec..d1ec432b53a0 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/index.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/index.tsx @@ -1,4 +1,4 @@ -import { type Plugin, usePluginWrapper } from '@masknet/plugin-infra/content-script' +import { type Plugin, usePluginWrapper, PluginId } from '@masknet/plugin-infra/content-script' import { ChainId, EthereumTokenType, @@ -94,9 +94,9 @@ const sns: Plugin.SNSAdaptor.Definition = { ApplicationEntries: [ (() => { const icon = - const name = + const name = const recommendFeature = { - description: , + description: , backgroundGradient: 'linear-gradient(180.54deg, #FF9A9E 0.71%, #FECFEF 98.79%, #FECFEF 99.78%)', } return { @@ -125,7 +125,7 @@ const sns: Plugin.SNSAdaptor.Definition = { appBoardSortingDefaultPriority: 1, marketListSortingPriority: 1, icon, - description: , + description: , name, tutorialLink: 'https://realmasknetwork.notion.site/0a71fd421aae4563bd07caa3e2129e5b', category: 'dapp', diff --git a/packages/mask/src/plugins/RedPacket/base.ts b/packages/mask/src/plugins/RedPacket/base.ts index cb9aeeea4ca9..c1fe7aa7fc8b 100644 --- a/packages/mask/src/plugins/RedPacket/base.ts +++ b/packages/mask/src/plugins/RedPacket/base.ts @@ -2,6 +2,7 @@ import type { Plugin } from '@masknet/plugin-infra' import { NetworkPluginID } from '@masknet/plugin-infra/web3' import { ChainId } from '@masknet/web3-shared-evm' import { RedPacketMetaKey, RedPacketNftMetaKey, RedPacketPluginID } from './constants' +import { languages } from './locales/languages' export const base: Plugin.Shared.Definition = { ID: RedPacketPluginID, @@ -40,4 +41,5 @@ export const base: Plugin.Shared.Definition = { contribution: { metadataKeys: new Set([RedPacketMetaKey, RedPacketNftMetaKey]), }, + i18n: languages, } diff --git a/packages/mask/src/plugins/RedPacket/locales/en-US.json b/packages/mask/src/plugins/RedPacket/locales/en-US.json new file mode 100644 index 000000000000..b3491141c7f6 --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/en-US.json @@ -0,0 +1,84 @@ +{ + "promote": "🧧🧧🧧 Try sending Lucky Drop to your friends with tokens or NFTs to share the joy now! Install Mask.io to send your first Lucky Drop.", + "promote_short": "🧧🧧🧧 Try sending Lucky Drop to your friends with Mask.io.", + "nft_shift_select_tip": "You can also use {{text}} to select multiple NFTs.", + "collections": "Collections", + "select_a_token": "Select a Token", + "search": "Search", + "loading_token": "Loading token...", + "search_no_result": "No results.", + "nft_already_added": "The collectible has already been added.", + "nft_invalid_owner": "The collectible does not belong to you.", + "nft_max_shares": "The maximum number of NFTs to be sold in NFT lucky drop contract is {{amount}}.", + "nft_max_shares_tip": "The NFT lucky drop supports up to {{amount, number}} NFTs selected for one time.", + "nft_non_existed_tip": "Token ID does not exist or belong to you.", + "nft_select_collection": "Choose your collection", + "completed": "Completed", + "expired": "Expired", + "nft_tip": "This is an NFT lucky drop.", + "nft_share_foreshow_message_not_twitter": "@{{sender}} is sending an NFT lucky drop on {{network}} network. \n{{payload}}", + "nft_share_foreshow_message": "@{{sender}} is sending an NFT lucky drop on {{network}} network. Follow @{{account}} (mask.io) to claim NFT lucky drops.\n#mask_io #LuckyDrop\n{{payload}}", + "nft_share_claimed_message_not_twitter": "I just claimed an NFT lucky drop from @{{sender}} on {{network}} network.\n$t(promote_short) \n{{payload}}", + "nft_share_claimed_message": "I just claimed an NFT lucky drop from @{{sender}} on {{network}} network. Follow @{{account}} (mask.io) to claim NFT lucky drops.\n$t(promote_short)\n#mask_io #LuckyDrop\n{{payload}}", + "nft_total_amount": "Total Amount", + "nft_attached_message": "Attached Message", + "nft_account_name": "Wallet account", + "message_label": "Title", + "claiming": "Claiming...", + "claim": "Claim", + "data_broken": "The Lucky Drop can’t be sent due to data damage. Please withdraw the assets after {{duration}}.", + "refund": "Refund", + "empty": "Empty", + "refunding": "Refunding", + "history_send": "Send", + "history_total_amount": "Total Amount: {{amount}} {{symbol}}", + "history_split_mode": "Split Mode: {{mode}}", + "history_total_claimed_amount": "Total: {{claimedAmount}}/{{amount}} {{symbol}}", + "attached_message": "Attached Message", + "indivisible": "The minimum amount for each share is {{amount}} {{symbol}}", + "name": "Lucky Drop", + "description": "Gift crypto or NFTs to any users, first come, first served.", + "next": "Next", + "nft_approve_all_tip": "Note: When selecting approve all, all NFTs in the contract will be authorized for sale by default, including the NFTs transfered later.", + "nft_unapproved_tip": "You can get the rest of your NFTs back after 24 hours of sending.", + "nft_select_partially_option": "Select partially", + "nft_select_all_option": "ALL ({{total}} NFT)", + "erc721_insufficient_balance": "Insufficient Balance", + "erc721_tab_title": "Collectibles", + "erc20_tab_title": "Token", + "claimed": "Claimed", + "details": "Lucky Drop Details", + "display_name": "Plugin: Lucky Drop", + "select_existing": "Past", + "create_new": "New", + "send_symbol": "Send {{amount}} {{symbol}}", + "back": "Back", + "hint": "You can withdraw the remaining balance 24 hours after the Lucky Drop is sent.", + "amount_total": "Amount Total", + "amount_per_share": "Amount per Share", + "shares": "Shares", + "average": "Average", + "random": "Random", + "split_mode": "Split Mode", + "token": "Token", + "chain_not_supported": "Not supported on {{chain}} yet.", + "nft_no_history": "You haven’t created any NFT lucky drop yet. Try to create and share lucky with your friends.", + "history_claimed": "Claimed: {{claimedShares}}/{{shares}} Share", + "send": "Send", + "history_duration": "Time: {{startTime}} ~ {{endTime}} (UTC+8)", + "best_wishes": "Best Wishes!", + "nft_data_broken": "The Lucky Drop can’t be sent due to data damage.", + "from": "From: @{{name}}", + "share_message_official_account": "I just claimed a lucky drop from @{{sender}} on {{network}} network. Follow @{{account}} (mask.io) to claim lucky drops.\n$t(promote_short)\n#mask_io #LuckyDrop\n{{payload}}", + "share_message_not_twitter": "I just claimed a lucky drop from @{{sender}} on {{network}} network.\n$t(promote_short)\n{{payload}}", + "share_unclaimed_message_official_account": "Hi friends, I just found a lucky drop sent by @{{sender}} on {{network}} network. Follow @{{account}} (mask.io) to claim lucky drops.\n$t(promote_short)\n#mask_io #LuckyDrop\n{{payload}}", + "share_unclaimed_message_not_twitter": "Hi friends, I just found a lucky drop sent by @{{sender}} on {{network}} network.\n$t(promote_short)\n{{payload}}", + "description_claimed": "You got {{amount}} {{symbol}}", + "description_refund": "You could refund {{balance}} {{symbol}}.", + "description_refunded": "The Lucky Drop has been refunded.", + "description_expired": "The Lucky Drop is expired.", + "description_broken": "The Lucky Drop is broken.", + "description_empty": "The Lucky Drop is empty.", + "description_failover": "{{shares}} shares / {{total}} {{symbol}}", + "recommend_feature_description": "Surpirse your social friends with Lucky Drop" +} diff --git a/packages/mask/src/plugins/RedPacket/locales/index.ts b/packages/mask/src/plugins/RedPacket/locales/index.ts new file mode 100644 index 000000000000..d6ead60252e4 --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/index.ts @@ -0,0 +1,6 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts + +export * from './i18n_generated' diff --git a/packages/mask/src/plugins/RedPacket/locales/ja-JP.json b/packages/mask/src/plugins/RedPacket/locales/ja-JP.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/ja-JP.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/RedPacket/locales/ko-KR.json b/packages/mask/src/plugins/RedPacket/locales/ko-KR.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/ko-KR.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/RedPacket/locales/languages.ts b/packages/mask/src/plugins/RedPacket/locales/languages.ts new file mode 100644 index 000000000000..e8cd5a8b1cd5 --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/languages.ts @@ -0,0 +1,34 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts +import en_US from './en-US.json' +import ja_JP from './ja-JP.json' +import ko_KR from './ko-KR.json' +import qya_AA from './qya-AA.json' +import zh_CN from './zh-CN.json' +import zh_TW from './zh-TW.json' +export const languages = { + en: en_US, + ja: ja_JP, + ko: ko_KR, + qy: qya_AA, + 'zh-CN': zh_CN, + zh: zh_TW, +} +// @ts-ignore +if (import.meta.webpackHot) { + // @ts-ignore + import.meta.webpackHot.accept( + ['./en-US.json', './ja-JP.json', './ko-KR.json', './qya-AA.json', './zh-CN.json', './zh-TW.json'], + () => + globalThis.dispatchEvent?.( + new CustomEvent('MASK_I18N_HMR', { + detail: [ + 'com.maskbook.red_packet', + { en: en_US, ja: ja_JP, ko: ko_KR, qy: qya_AA, 'zh-CN': zh_CN, zh: zh_TW }, + ], + }), + ), + ) +} diff --git a/packages/mask/src/plugins/RedPacket/locales/qya-AA.json b/packages/mask/src/plugins/RedPacket/locales/qya-AA.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/qya-AA.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/RedPacket/locales/zh-CN.json b/packages/mask/src/plugins/RedPacket/locales/zh-CN.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/zh-CN.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/RedPacket/locales/zh-TW.json b/packages/mask/src/plugins/RedPacket/locales/zh-TW.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/RedPacket/locales/zh-TW.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx index 7986af9309d3..47d5a9576b6c 100644 --- a/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx +++ b/packages/mask/src/plugins/Savings/SNSAdaptor/SavingsForm.tsx @@ -13,6 +13,7 @@ import { formatCurrency, getAaveConstants, isSameAddress, + resolveChainName, useAccount, useFungibleTokenBalance, useTokenConstants, @@ -26,7 +27,6 @@ import { useAsync, useAsyncFn } from 'react-use' import type { AbiItem } from 'web3-utils' import { ActionButtonPromise } from '../../../extension/options-page/DashboardComponents/ActionButton' import { activatedSocialNetworkUI } from '../../../social-network' -import { isFacebook } from '../../../social-network-adaptor/facebook.com/base' import { isTwitter } from '../../../social-network-adaptor/twitter.com/base' import { useI18N } from '../../../utils' import { EthereumChainBoundary } from '../../../web3/UI/EthereumChainBoundary' @@ -164,16 +164,12 @@ export function SavingsForm({ chainId, protocol, tab, onClose }: SavingsFormProp }, [protocol.bareToken, inputAmount, chainId]) const openShareTxDialog = useOpenShareTxDialog() - const shareText = [ - `I just deposit ${inputAmount} ${protocol.bareToken.symbol} with ${resolveProtocolName(protocol.type)}. ${ - isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) - ? `Follow @${ - isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account') - } (mask.io) to deposit.` - : '' - }`, - '#mask_io', - ].join('\n') + const shareText = t('promote_savings', { + amount: inputAmount, + symbol: protocol.bareToken.symbol, + chain: resolveChainName(chainId), + account: isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account'), + }) const [, executor] = useAsyncFn(async () => { switch (tab) { case TabType.Deposit: diff --git a/packages/mask/src/plugins/Snapshot/SNSAdaptor/VotingCard.tsx b/packages/mask/src/plugins/Snapshot/SNSAdaptor/VotingCard.tsx index 1d09bbab169f..068d235a77f1 100644 --- a/packages/mask/src/plugins/Snapshot/SNSAdaptor/VotingCard.tsx +++ b/packages/mask/src/plugins/Snapshot/SNSAdaptor/VotingCard.tsx @@ -13,6 +13,7 @@ import { usePower } from './hooks/usePower' import { VoteConfirmDialog } from './VoteConfirmDialog' import { useRetry } from './hooks/useRetry' import { NetworkPluginID, useCurrentWeb3NetworkPluginID } from '@masknet/plugin-infra/web3' +import { activatedSocialNetworkUI } from '../../../social-network' const useStyles = makeStyles()((theme) => { return { @@ -52,11 +53,12 @@ export function VotingCard() { const networkPluginId = useCurrentWeb3NetworkPluginID() const retry = useRetry() const onVoteConfirm = useSnackbarCallback( - () => { + async () => { setLoading(true) - return PluginSnapshotRPC.vote(identifier, choice, account, proposal.type) + await PluginSnapshotRPC.vote(identifier, choice, account, proposal.type) + activatedSocialNetworkUI.utils.share?.(t('promote_snapshot')) }, - [choice, identifier], + [choice, identifier, account, proposal.type, t], () => { setLoading(false) setOpen(false) diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/Trader.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/Trader.tsx index 0f3f1536c37f..656592bc4d28 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/Trader.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/Trader.tsx @@ -21,7 +21,8 @@ import { useUnmount, useUpdateEffect } from 'react-use' import { activatedSocialNetworkUI } from '../../../../social-network' import { isFacebook } from '../../../../social-network-adaptor/facebook.com/base' import { isTwitter } from '../../../../social-network-adaptor/twitter.com/base' -import { useI18N } from '../../../../utils' +import { useI18N as useBaseI18N } from '../../../../utils' +import { useI18N } from '../../locales' import { isNativeTokenWrapper } from '../../helpers' import { PluginTraderMessages } from '../../messages' import { AllProviderTradeActionType, AllProviderTradeContext } from '../../trader/useAllProviderTradeContext' @@ -61,7 +62,8 @@ export function Trader(props: TraderProps) { const chainIdValid = useChainIdValid() const { NATIVE_TOKEN_ADDRESS } = useTokenConstants() const classes = useStylesExtends(useStyles(), props) - const { t } = useI18N() + const { t: tr } = useBaseI18N() + const t = useI18N() const { setTargetChainId } = TargetChainIdContext.useContainer() // #region trade state @@ -248,16 +250,17 @@ export function Trader(props: TraderProps) { }.${ isTwitter(activatedSocialNetworkUI) || isFacebook(activatedSocialNetworkUI) ? `Follow @${ - isTwitter(activatedSocialNetworkUI) ? t('twitter_account') : t('facebook_account') + isTwitter(activatedSocialNetworkUI) ? tr('twitter_account') : tr('facebook_account') } (mask.io) to swap cryptocurrencies on ${ isTwitter(activatedSocialNetworkUI) ? 'Twitter' : 'Facebook' }.` : '' }`, '#mask_io', + t.promote(), ].join('\n') : '' - }, [focusedTrade?.value, inputToken, outputToken]) + }, [focusedTrade?.value, inputToken, outputToken, tr, t]) const openShareTxDialog = useOpenShareTxDialog() const onConfirmDialogConfirm = useCallback(async () => { setOpenConfirmDialog(false) diff --git a/packages/mask/src/plugins/Trader/base.ts b/packages/mask/src/plugins/Trader/base.ts index 2bb1969f0c29..e9970b26ff6b 100644 --- a/packages/mask/src/plugins/Trader/base.ts +++ b/packages/mask/src/plugins/Trader/base.ts @@ -2,6 +2,7 @@ import type { Plugin } from '@masknet/plugin-infra' import { NetworkPluginID } from '@masknet/plugin-infra/web3' import { ChainId } from '@masknet/web3-shared-evm' import { PLUGIN_ID } from './constants' +import { languages } from './locales/languages' export const base: Plugin.Shared.Definition = { ID: PLUGIN_ID, @@ -30,4 +31,5 @@ export const base: Plugin.Shared.Definition = { [NetworkPluginID.PLUGIN_SOLANA]: { supportedChainIds: [] }, }, }, + i18n: languages, } diff --git a/packages/mask/src/plugins/Trader/locales/en-US.json b/packages/mask/src/plugins/Trader/locales/en-US.json new file mode 100644 index 000000000000..5920a7a664f4 --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/en-US.json @@ -0,0 +1,3 @@ +{ + "promote": "Instantly token exchange on Twitter. Install Mask.io to explore “better server” on Multi-chain Dex." +} diff --git a/packages/mask/src/plugins/Trader/locales/index.ts b/packages/mask/src/plugins/Trader/locales/index.ts new file mode 100644 index 000000000000..d6ead60252e4 --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/index.ts @@ -0,0 +1,6 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts + +export * from './i18n_generated' diff --git a/packages/mask/src/plugins/Trader/locales/ja-JP.json b/packages/mask/src/plugins/Trader/locales/ja-JP.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/ja-JP.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Trader/locales/ko-KR.json b/packages/mask/src/plugins/Trader/locales/ko-KR.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/ko-KR.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Trader/locales/languages.ts b/packages/mask/src/plugins/Trader/locales/languages.ts new file mode 100644 index 000000000000..a189384a2e40 --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/languages.ts @@ -0,0 +1,34 @@ +// This file is auto generated. DO NOT EDIT +// Run `npx gulp sync-languages` to regenerate. +// Default fallback language in a family of languages are chosen by the alphabet order +// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts +import en_US from './en-US.json' +import ja_JP from './ja-JP.json' +import ko_KR from './ko-KR.json' +import qya_AA from './qya-AA.json' +import zh_CN from './zh-CN.json' +import zh_TW from './zh-TW.json' +export const languages = { + en: en_US, + ja: ja_JP, + ko: ko_KR, + qy: qya_AA, + 'zh-CN': zh_CN, + zh: zh_TW, +} +// @ts-ignore +if (import.meta.webpackHot) { + // @ts-ignore + import.meta.webpackHot.accept( + ['./en-US.json', './ja-JP.json', './ko-KR.json', './qya-AA.json', './zh-CN.json', './zh-TW.json'], + () => + globalThis.dispatchEvent?.( + new CustomEvent('MASK_I18N_HMR', { + detail: [ + 'com.maskbook.trader', + { en: en_US, ja: ja_JP, ko: ko_KR, qy: qya_AA, 'zh-CN': zh_CN, zh: zh_TW }, + ], + }), + ), + ) +} diff --git a/packages/mask/src/plugins/Trader/locales/qya-AA.json b/packages/mask/src/plugins/Trader/locales/qya-AA.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/qya-AA.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Trader/locales/zh-CN.json b/packages/mask/src/plugins/Trader/locales/zh-CN.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/zh-CN.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/Trader/locales/zh-TW.json b/packages/mask/src/plugins/Trader/locales/zh-TW.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/packages/mask/src/plugins/Trader/locales/zh-TW.json @@ -0,0 +1 @@ +{} diff --git a/packages/mask/src/plugins/dHEDGE/UI/InvestDialog.tsx b/packages/mask/src/plugins/dHEDGE/UI/InvestDialog.tsx index 53f8e5eda38c..d636468993f7 100644 --- a/packages/mask/src/plugins/dHEDGE/UI/InvestDialog.tsx +++ b/packages/mask/src/plugins/dHEDGE/UI/InvestDialog.tsx @@ -94,7 +94,7 @@ export function InvestDialog() { // #endregion // #region blocking - const [isInvesting, investCallback] = useInvestCallback(pool, amount.toFixed(), token) + const [{ loading: isInvesting }, investCallback] = useInvestCallback(pool, amount.toFixed(), token) const openShareTxDialog = useOpenShareTxDialog() const cashTag = isTwitter(activatedSocialNetworkUI) ? '$' : '' const shareText = token diff --git a/packages/mask/src/plugins/dHEDGE/hooks/useInvestCallback.ts b/packages/mask/src/plugins/dHEDGE/hooks/useInvestCallback.ts index ced58ff42cde..ec087c129d64 100644 --- a/packages/mask/src/plugins/dHEDGE/hooks/useInvestCallback.ts +++ b/packages/mask/src/plugins/dHEDGE/hooks/useInvestCallback.ts @@ -1,6 +1,6 @@ import { toFixed } from '@masknet/web3-shared-base' import { EthereumTokenType, FungibleTokenDetailed, TransactionEventType, useAccount } from '@masknet/web3-shared-evm' -import { useCallback, useState } from 'react' +import { useAsyncFn } from 'react-use' import { useDHedgePoolV1Contract, useDHedgePoolV2Contract } from '../contracts/useDHedgePool' import { Pool, PoolType } from '../types' @@ -15,9 +15,8 @@ export function useInvestCallback(pool: Pool | undefined, amount: string, token? const poolV2Contract = useDHedgePoolV2Contract(pool?.address ?? '') const account = useAccount() - const [loading, setLoading] = useState(false) - const investCallback = useCallback(async () => { + return useAsyncFn(async () => { if (!token || !poolV1Contract || !poolV2Contract) return // step 1: estimate gas @@ -32,11 +31,9 @@ export function useInvestCallback(pool: Pool | undefined, amount: string, token? : poolV2Contract.methods.deposit(token.address, amount) } - setLoading(true) const estimatedGas = await deposit() .estimateGas(config) .catch((error) => { - setLoading(false) throw error }) @@ -53,6 +50,4 @@ export function useInvestCallback(pool: Pool | undefined, amount: string, token? .on(TransactionEventType.ERROR, reject) }) }, [pool, account, amount, token]) - - return [loading, investCallback] as const } diff --git a/packages/mask/src/social-network-adaptor/twitter.com/injection/NFT/NFTAvatarInTwitter.tsx b/packages/mask/src/social-network-adaptor/twitter.com/injection/NFT/NFTAvatarInTwitter.tsx index 1fb279a56651..b8a0682dcea7 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/injection/NFT/NFTAvatarInTwitter.tsx +++ b/packages/mask/src/social-network-adaptor/twitter.com/injection/NFT/NFTAvatarInTwitter.tsx @@ -1,4 +1,4 @@ -import { createReactRootShadowed, MaskMessages, NFTAvatarEvent, startWatch } from '../../../../utils' +import { createReactRootShadowed, MaskMessages, NFTAvatarEvent, startWatch, useI18N } from '../../../../utils' import { searchTwitterAvatarLinkSelector, searchTwitterAvatarSelector } from '../../utils/selector' import { MutationObserverWatcher } from '@dimensiondev/holoflows-kit' import { makeStyles } from '@masknet/theme' @@ -16,6 +16,9 @@ import { trim } from 'lodash-unified' import { RSS3_KEY_SNS } from '../../../../plugins/Avatar/constants' import { openWindow } from '@masknet/shared-base-ui' import { usePersonaNFTAvatar } from '../../../../plugins/Avatar/hooks/usePersonaNFTAvatar' +import { NFTCardStyledAssetPlayer, useShowConfirm } from '@masknet/shared' +import { Box, Typography } from '@mui/material' +import { activatedSocialNetworkUI } from '../../../../social-network' export function injectNFTAvatarInTwitter(signal: AbortSignal) { const watcher = new MutationObserverWatcher(searchTwitterAvatarSelector()) @@ -61,6 +64,7 @@ function NFTAvatarInTwitter() { const windowSize = useWindowSize() const location = useLocation() + const { t } = useI18N() const showAvatar = useMemo( () => getAvatarId(identity.avatar ?? '') === avatar?.avatarId && avatar.avatarId, [avatar?.avatarId, identity.avatar], @@ -81,6 +85,7 @@ function NFTAvatarInTwitter() { const onUpdate = (data: NFTAvatarEvent) => { setNFTEvent(data) } + const openConfirmDialog = useShowConfirm() // After the avatar is set, it cannot be saved immediately, and must wait until the avatar of twitter is updated useAsync(async () => { @@ -118,6 +123,21 @@ function NFTAvatarInTwitter() { window.alert('Sorry, failed to save NFT Avatar. Please set again.') return } + openConfirmDialog({ + title: t('plugin_avatar_setup_share_title'), + content: ( + + + + {t('plugin_avatar_setup_success')} + + + ), + confirmLabel: t('share'), + onSubmit() { + activatedSocialNetworkUI.utils.share?.(t('plugin_avatar_setup_pfp_share')) + }, + }) setAvatar(avatar) MaskMessages.events.NFTAvatarTimelineUpdated.sendToAll( @@ -130,7 +150,7 @@ function NFTAvatarInTwitter() { ) setNFTEvent(undefined) - }, [identity.avatar]) + }, [identity.avatar, openConfirmDialog, t]) useEffect(() => { setAvatar(_avatar) diff --git a/packages/mask/src/tsconfig.json b/packages/mask/src/tsconfig.json index 9d137580ffed..5be5ef7a1573 100644 --- a/packages/mask/src/tsconfig.json +++ b/packages/mask/src/tsconfig.json @@ -31,6 +31,7 @@ { "path": "../../plugin-infra" }, { "path": "../../plugins/Wallet" }, { "path": "../../plugins/Flow" }, + { "path": "../../plugins/FileService" }, { "path": "../../external-plugin-previewer" }, { "path": "../../injected-script/sdk" }, { "path": "../../mask-sdk/server" }, diff --git a/packages/mask/src/web3/UI/EthereumERC20TokenApprovedBoundary.tsx b/packages/mask/src/web3/UI/EthereumERC20TokenApprovedBoundary.tsx index 8759226ec53d..7ae770d3fc76 100644 --- a/packages/mask/src/web3/UI/EthereumERC20TokenApprovedBoundary.tsx +++ b/packages/mask/src/web3/UI/EthereumERC20TokenApprovedBoundary.tsx @@ -154,7 +154,7 @@ export function EthereumERC20TokenApprovedBoundary(props: EthereumERC20TokenAppr ) : null} ) - if (approveStateType === ApproveStateType.PENDING || approveStateType === ApproveStateType.UPDATING) + if (transactionState.loading || approveStateType === ApproveStateType.UPDATING) return ( - {approveStateType === ApproveStateType.PENDING + {transactionState.loading ? t('plugin_ito_unlocking_symbol', { symbol: token.symbol }) : `Updating ${token.symbol}`} … diff --git a/packages/mask/src/web3/UI/EthereumERC721TokenApprovedBoundary.tsx b/packages/mask/src/web3/UI/EthereumERC721TokenApprovedBoundary.tsx index e10bd3c2760b..e84035bd6bf9 100644 --- a/packages/mask/src/web3/UI/EthereumERC721TokenApprovedBoundary.tsx +++ b/packages/mask/src/web3/UI/EthereumERC721TokenApprovedBoundary.tsx @@ -1,17 +1,16 @@ +import { makeStyles, useCustomSnackbar, useStylesExtends } from '@masknet/theme' import { - useERC721ContractIsApproveForAll, - useERC721ContractSetApproveForAllCallback, - TransactionStateType, ERC721ContractDetailed, resolveTransactionLinkOnExplorer, + useERC721ContractIsApproveForAll, + useERC721ContractSetApproveForAllCallback, } from '@masknet/web3-shared-evm' import OpenInNewIcon from '@mui/icons-material/OpenInNew' -import { useI18N } from '../../utils' -import { makeStyles, useCustomSnackbar, useStylesExtends } from '@masknet/theme' -import { Typography, Link } from '@mui/material' -import ActionButton, { ActionButtonProps } from '../../extension/options-page/DashboardComponents/ActionButton' -import { useMemo, useEffect } from 'react' +import { Link, Typography } from '@mui/material' +import { useCallback, useMemo } from 'react' import { EthereumAddress } from 'wallet.ts' +import ActionButton, { ActionButtonProps } from '../../extension/options-page/DashboardComponents/ActionButton' +import { useI18N } from '../../utils' const useStyles = makeStyles()(() => ({ snackBarText: { @@ -48,45 +47,39 @@ export function EthereumERC721TokenApprovedBoundary(props: EthereumERC712TokenAp const { t } = useI18N() const classes = useStylesExtends(useStyles(), props) const { value, loading, retry } = useERC721ContractIsApproveForAll(contractDetailed?.address, owner, operator) - const [approveState, approveCallback, resetCallback] = useERC721ContractSetApproveForAllCallback( + const [approveState, approveCallback] = useERC721ContractSetApproveForAllCallback( contractDetailed?.address, operator, true, ) const { showSnackbar } = useCustomSnackbar() - useEffect(() => { - if (approveState.type === TransactionStateType.CONFIRMED && approveState.no === 0) { - showSnackbar( -
- - {t('plugin_wallet_approve_all_nft_successfully', { symbol: contractDetailed?.symbol })} - - - - -
, - { - variant: 'success', - anchorOrigin: { horizontal: 'right', vertical: 'top' }, - }, - ) - resetCallback() - retry() - } else if (approveState.type === TransactionStateType.FAILED) { - showSnackbar(approveState.error.message, { - variant: 'error', - }) - resetCallback() + const approve = useCallback(async () => { + const hash = await approveCallback() + if (typeof hash !== 'string') { + showSnackbar(approveState.error?.message) + return } - }, [approveState, contractDetailed]) + showSnackbar( +
+ + {t('plugin_wallet_approve_all_nft_successfully', { symbol: contractDetailed?.symbol })} + + + + +
, + { + variant: 'success', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }, + ) + retry() + }, [showSnackbar, approveState, retry, contractDetailed]) const validationMessage = useMemo(() => { if (!contractDetailed?.address || !EthereumAddress.isValid(contractDetailed?.address)) @@ -97,7 +90,7 @@ export function EthereumERC721TokenApprovedBoundary(props: EthereumERC712TokenAp return '' }, [contractDetailed, owner, operator, _validationMessage]) - if ([TransactionStateType.WAIT_FOR_CONFIRMING, TransactionStateType.HASH].includes(approveState.type)) { + if (approveState.loading) { return ( {t('plugin_wallet_approve_all_nft', { symbol: contractDetailed?.symbol diff --git a/packages/plugins/FileService/src/index.ts b/packages/plugins/FileService/src/index.ts index 69226b786ae4..79ee5520eaa9 100644 --- a/packages/plugins/FileService/src/index.ts +++ b/packages/plugins/FileService/src/index.ts @@ -1,6 +1,8 @@ import { registerPlugin } from '@masknet/plugin-infra' import { base } from './base' +export { FileInfoMetadataReader } from './helpers' + registerPlugin({ ...base, SNSAdaptor: { diff --git a/packages/web3-shared/evm/hooks/useERC20TokenApproveCallback.ts b/packages/web3-shared/evm/hooks/useERC20TokenApproveCallback.ts index 346b49771765..2e52b2049043 100644 --- a/packages/web3-shared/evm/hooks/useERC20TokenApproveCallback.ts +++ b/packages/web3-shared/evm/hooks/useERC20TokenApproveCallback.ts @@ -1,13 +1,13 @@ -import { useCallback, useMemo } from 'react' -import { once } from 'lodash-unified' import type { NonPayableTx } from '@masknet/web3-contracts/types/types' -import { TransactionStateType, TransactionEventType } from '../types' +import { isLessThan, toFixed } from '@masknet/web3-shared-base' +import { once } from 'lodash-unified' +import { useCallback, useMemo } from 'react' +import { useAsyncFn } from 'react-use' import { useERC20TokenContract } from '../contracts/useERC20TokenContract' +import { TransactionEventType } from '../types' import { useAccount } from './useAccount' import { useERC20TokenAllowance } from './useERC20TokenAllowance' import { useERC20TokenBalance } from './useERC20TokenBalance' -import { useTransactionState } from './useTransactionState' -import { isLessThan, toFixed } from '@masknet/web3-shared-base' const MaxUint256 = toFixed('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') @@ -23,7 +23,6 @@ export enum ApproveStateType { export function useERC20TokenApproveCallback(address?: string, amount?: string, spender?: string) { const account = useAccount() const erc20Contract = useERC20TokenContract(address) - const [transactionState, setTransactionState] = useTransactionState() // read the approved information from the chain const { @@ -44,43 +43,20 @@ export function useERC20TokenApproveCallback(address?: string, amount?: string, if (!amount || !spender) return ApproveStateType.UNKNOWN if (loadingBalance || loadingAllowance) return ApproveStateType.UPDATING if (errorBalance || errorAllowance) return ApproveStateType.FAILED - if (transactionState.type === TransactionStateType.WAIT_FOR_CONFIRMING) return ApproveStateType.PENDING return isLessThan(allowance, amount) ? ApproveStateType.NOT_APPROVED : ApproveStateType.APPROVED - }, [ - amount, - spender, - balance, - allowance, - errorBalance, - errorAllowance, - loadingAllowance, - loadingBalance, - transactionState.type, - ]) + }, [amount, spender, balance, allowance, errorBalance, errorAllowance, loadingAllowance, loadingBalance]) - const approveCallback = useCallback( + const [state, approveCallback] = useAsyncFn( async (useExact = false) => { - setTransactionState({ - type: TransactionStateType.UNKNOWN, - }) if (approveStateType === ApproveStateType.UNKNOWN || !amount || !spender || !erc20Contract) { return } // error: failed to approve token if (approveStateType !== ApproveStateType.NOT_APPROVED) { - setTransactionState({ - type: TransactionStateType.FAILED, - error: new Error('Failed to approve token.'), - }) return } - // start waiting for provider to confirm tx - setTransactionState({ - type: TransactionStateType.WAIT_FOR_CONFIRMING, - }) - // estimate gas and compose transaction const config = { from: account, @@ -96,16 +72,12 @@ export function useERC20TokenApproveCallback(address?: string, amount?: string, }) }) .catch((error) => { - setTransactionState({ - type: TransactionStateType.FAILED, - error, - }) throw error }), } // send transaction and wait for hash - return new Promise(async (resolve, reject) => { + return new Promise(async (resolve, reject) => { const revalidate = once(() => { revalidateBalance() revalidateAllowance() @@ -113,43 +85,25 @@ export function useERC20TokenApproveCallback(address?: string, amount?: string, erc20Contract.methods .approve(spender, useExact ? amount : MaxUint256) .send(config as NonPayableTx) - .on(TransactionEventType.RECEIPT, (receipt) => { - setTransactionState({ - type: TransactionStateType.CONFIRMED, - no: 0, - receipt, - }) + .on(TransactionEventType.RECEIPT, () => { revalidate() - resolve() }) .on(TransactionEventType.CONFIRMATION, (no, receipt) => { - setTransactionState({ - type: TransactionStateType.CONFIRMED, - no, - receipt, - }) revalidate() - resolve() + resolve(receipt.transactionHash) }) .on(TransactionEventType.ERROR, (error) => { - setTransactionState({ - type: TransactionStateType.FAILED, - error, - }) revalidate() reject(error) }) }) }, - [account, amount, balance, spender, loadingAllowance, loadingBalance, erc20Contract, approveStateType], + [account, amount, spender, erc20Contract, approveStateType], ) const resetCallback = useCallback(() => { revalidateBalance() revalidateAllowance() - setTransactionState({ - type: TransactionStateType.UNKNOWN, - }) }, [revalidateBalance, revalidateAllowance]) return [ @@ -160,7 +114,7 @@ export function useERC20TokenApproveCallback(address?: string, amount?: string, spender, balance, }, - transactionState, + state, approveCallback, resetCallback, ] as const diff --git a/packages/web3-shared/evm/hooks/useERC721ContractSetApproveForAllCallback.ts b/packages/web3-shared/evm/hooks/useERC721ContractSetApproveForAllCallback.ts index 6eb6672de354..99c2cf200196 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractSetApproveForAllCallback.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractSetApproveForAllCallback.ts @@ -1,9 +1,8 @@ -import { useCallback } from 'react' import type { NonPayableTx } from '@masknet/web3-contracts/types/types' -import { useAccount } from './useAccount' -import { useTransactionState } from './useTransactionState' +import { useAsyncFn } from 'react-use' import { useERC721TokenContract } from '../contracts' -import { TransactionStateType, TransactionEventType } from '../types' +import { TransactionEventType } from '../types' +import { useAccount } from './useAccount' import { useChainId } from './useChainId' /** @@ -19,62 +18,32 @@ export function useERC721ContractSetApproveForAllCallback( const account = useAccount() const chainId = useChainId() const erc721TokenContract = useERC721TokenContract(contractAddress) - const [approveState, setApproveState] = useTransactionState() - const approveCallback = useCallback(async () => { + return useAsyncFn(async () => { if (!erc721TokenContract || !contractAddress || !operator) { - setApproveState({ type: TransactionStateType.UNKNOWN }) return } - setApproveState({ - type: TransactionStateType.WAIT_FOR_CONFIRMING, - }) - const config = { from: account, gas: await erc721TokenContract.methods .setApprovalForAll(operator, approved) .estimateGas({ from: account }) .catch((error) => { - setApproveState({ type: TransactionStateType.FAILED, error }) throw error }), } - return new Promise(async (resolve, reject) => { + return new Promise(async (resolve, reject) => { erc721TokenContract.methods .setApprovalForAll(operator, approved) .send(config as NonPayableTx) - .on(TransactionEventType.RECEIPT, (receipt) => { - setApproveState({ - type: TransactionStateType.CONFIRMED, - no: 0, - receipt, - }) - resolve() - }) .on(TransactionEventType.CONFIRMATION, (no, receipt) => { - setApproveState({ - type: TransactionStateType.CONFIRMED, - no, - receipt, - }) - resolve() + resolve(receipt.transactionHash) }) .on(TransactionEventType.ERROR, (error) => { - setApproveState({ - type: TransactionStateType.FAILED, - error, - }) reject(error) }) }) - }, [account, chainId, erc721TokenContract, approved, contractAddress, operator, setApproveState]) - - const resetCallback = useCallback(() => { - setApproveState({ type: TransactionStateType.UNKNOWN }) - }, []) - - return [approveState, approveCallback, resetCallback] as const + }, [account, chainId, erc721TokenContract, approved, contractAddress, operator]) } diff --git a/packages/web3-shared/evm/hooks/useTransactionCallback.ts b/packages/web3-shared/evm/hooks/useTransactionCallback.ts index b2a8f6f446d2..a2f6d92d0f7e 100644 --- a/packages/web3-shared/evm/hooks/useTransactionCallback.ts +++ b/packages/web3-shared/evm/hooks/useTransactionCallback.ts @@ -1,32 +1,24 @@ import type { PayableTransactionObject, PayableTx } from '@masknet/web3-contracts/types/types' import { omit } from 'lodash-unified' -import { useCallback, useState } from 'react' +import { useAsyncFn } from 'react-use' import { TransactionEventType } from '../types' export function useTransactionCallback( config: PayableTx | undefined, method: PayableTransactionObject | undefined, ) { - const [loading, setLoading] = useState(false) - - const updateCallback = useCallback(async () => { + return useAsyncFn(async () => { if (!config || !method) return const gasExpectedConfig = { ...config } - setLoading(true) try { const estimatedGas = await method.estimateGas(omit(config, 'gas')) if (!gasExpectedConfig.gas && estimatedGas) { gasExpectedConfig.gas = estimatedGas } } catch (error) { - try { - await method.call(config) - } catch (error) { - setLoading(false) - throw error - } + await method.call(config) } return new Promise(async (resolve, reject) => { @@ -40,6 +32,4 @@ export function useTransactionCallback( }) }) }, [config, method]) - - return [loading, updateCallback] as const } From 1cf6309a7be2cff46d8bfbc6d975525585101e78 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 26 May 2022 21:14:42 +0100 Subject: [PATCH 33/47] chore(optimism): fixed swap tokens --- .../mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts | 2 +- packages/mask/src/plugins/Wallet/apis/debank.ts | 3 ++- packages/web3-constants/evm/token.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index 87a0254fb60c..2c7f592dd1a4 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -118,7 +118,7 @@ export function useTradeCallback( data: calldata, ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed() } : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }), - ...(targetChainId === 10 ? { gasPrice: 15000000, gas: 820000 } : { ...gasConfig }), + ...gasConfig, }) .on(TransactionEventType.CONFIRMATION, (_, receipt) => { resolve(receipt.transactionHash) diff --git a/packages/mask/src/plugins/Wallet/apis/debank.ts b/packages/mask/src/plugins/Wallet/apis/debank.ts index e64de5fe31d7..6c56811dbb7d 100644 --- a/packages/mask/src/plugins/Wallet/apis/debank.ts +++ b/packages/mask/src/plugins/Wallet/apis/debank.ts @@ -31,6 +31,7 @@ export async function getAssetsList(address: string) { const auroraChainOnDebank = getDeBankConstants(ChainId.Aurora).CHAIN_ID const harmonyChainOnDebank = getDeBankConstants(ChainId.Harmony).CHAIN_ID const arbitrumChainOnDebank = getDeBankConstants(ChainId.Arbitrum).CHAIN_ID +const optimismChainOnDebank = getDeBankConstants(ChainId.Optimism).CHAIN_ID const fieldKeys = ['fast', 'normal', 'slow'] as const /** * Debank's data might be outdated, like gas price for aurora which requires 1 Gwei at least @@ -38,7 +39,7 @@ const fieldKeys = ['fast', 'normal', 'slow'] as const * Once debank fixes it, we will remove this modifier. */ function gasModifier(gasDict: GasPriceDictResponse, chain: string) { - if ([auroraChainOnDebank, arbitrumChainOnDebank].includes(chain)) { + if ([auroraChainOnDebank, arbitrumChainOnDebank, optimismChainOnDebank].includes(chain)) { fieldKeys.forEach((fieldKey) => { const field = gasDict.data[fieldKey] field.price = Math.max(field.price, formatGweiToWei(1).toNumber()) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index a6b4d1d6b3b0..36ce981404d9 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -1390,7 +1390,7 @@ "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", "xDai": "0x0000000000000000000000000000000000000000", - "Optimism": "0x0000000000000000000000000000000000000000", + "Optimism": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", "Optimism_Kovan": "0x0000000000000000000000000000000000000000", "Optimism_Goerli": "0x0000000000000000000000000000000000000000", "Avalanche": "0x0000000000000000000000000000000000000000", From 0e0e13898e644e6cd6db6d266a6e54c0cd529e6e Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 26 May 2022 21:53:58 +0100 Subject: [PATCH 34/47] chore(optimism): remove unecessary assets --- .../mask/src/plugins/EVM/assets/optimistic.png | Bin 42536 -> 0 bytes packages/mask/src/resources/jugglerred.png | Bin 196981 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/mask/src/plugins/EVM/assets/optimistic.png delete mode 100644 packages/mask/src/resources/jugglerred.png diff --git a/packages/mask/src/plugins/EVM/assets/optimistic.png b/packages/mask/src/plugins/EVM/assets/optimistic.png deleted file mode 100644 index d88f2fcd2c20b98c5b695cad3c7509ac1a43dd49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42536 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 X0MW`4|Y2yS8P`gIHS$_6`>td9_+ac|?% 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 diff --git a/packages/mask/src/resources/jugglerred.png b/packages/mask/src/resources/jugglerred.png deleted file mode 100644 index 286d9f4c81224f374f41317eee8069c2da19bd5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196981 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

YJ#&twVB_)D z+UXcstWNweA5sokuOTTPZ3mBc(ugKLJbG&Ms{Qd#&+I-%IA(q@VOIfLt&dRlIeus|Kg8~|FaWR^+YXU^DEAF?-H}Hc$MN-(S-6%U> zTI-{#RKd*NQ+2=T%(CRAj)z(M4~5zS))jh8f9lFGREhr=$VTBkC+po^vtw+x@L2YY zRS-cWogG&EUHnf>*1qIoOxVqi%`6Ct9r+rr_?=*er!7E`C+2}>M}WTu65gV{n9Aqy zK2^Hi5|nM^77S}Ae7Gd?mV4&+>xoH9sl3xrTl4c#o|=gpL*7DnjQ9OQedX4bEUGKt z>E679X1QM_A5hg?kSbCR<}Ja7~)#EtuPvbngPxXX#b%>Xn)?;wsfMky+Vop zX#aKdg^O3_`(UoA=2yzT*HT0de?`h3X5NupM!vW|_E|L*fYfHGX6s1Y z#twNvE3HKl*g2 zQ?T1_ooaeSP1ro@a5uD(z;;nrhvdpqJNz-o-zmP#&*i+ z)eMzJ3yecW?y7Psx4l(21%#*ey2Tt9H*WO0E$oF?NLRpyAKmwou^$9eGQ@Kyg>}rZ zkcj;9yS#(-R1@cFeP}t_BB140N0kW4+*c^Y6}tCjV@`xUD|(v^^N_9S%ZwGvKJt)g znhf%n;ZsEOCMyeMNst(;&>{NOZlat~@83O%Lz0@>PrJ~YPW)`FU&O(+;i{9${uLk^ z&_w%;qe{6?dqU;aG^e*5o42-WP12tjf!9FJ2lO6O0-#Yq8duiM<05xousTIrJrdMI zfZJ~ieQCQ`I zE&JNlwWV_j-AmVQP~g;01lI^o$!l5pxyk2_KDVkb`|CCK52(G;Aq{OU_L)_LgL+=7 zdwf5R>6CE~^N({HKa+{sD{!M0L;2C67Q3*LcM#;Tz%abnAbH^=v|kxYgqLJGmC2IB zndIHdY`q~&Kota10J1S5@9ks^q0>9a&+Suek^t(62?A(hHN_8-pHu_f9{zQtp5tV^ z_Zq^KfDd>~(kjCMMs{*j^Mf=Bk0!~atL5KZFCkz06GloJG%oX8JdT$?47R+anFbR7wYd>JP$!q(oFzyQSiJ5sY31CLAMezjwJb^En&YM|~`Lsu(fE&o22_3*I9 zLk76>yS1H<4mD|=ZNB0S%uIG&UhPyr?_DFptqAkpl4j|EiSRG3kls~Sldkxx8-YHW z_tjipxSZk}{Drn%sXcBvgKxP&cEfP%vS8z+6pJ%Qmvidft0s)BAa&$&UkhbSDp>V= zpLgY}3pt=?_fG+_CC9&k>@TV={-}#))MrLbv|5c8QY$L?J+jUf5T+yLKZ=qH^sRRv z!noH)2KACAEtTuZxJxwFyNVT5`)M2G9?IM`mLqryHa=S6?h*&rUxbpCp2DvfGuHQT zKGzulhx97jf%B0W4M_}!p zT}gaeM~?7GVvlB{;?jN^zvyG+3E?H^p`PI`+@C!_FtTU*k9w< zg_PiWx{uverJvU3^t?dxT?Kv#?`u)>4+!oG*;8AK3$g4v%#f6Of?L!_-h14rPer%05%X=Q-ULlmUUV zK$H+SWSq=FUJG`o1J)r5$~)q%SVCL%tYu7WX(y^f_ucrOBmASQzfqv|8{4d%W^KjZ zXdzkUf6rP*nNlW>6n? z3!b#(v^4SxB4$8S^{!9>bXHhzG2;Nl7_XQUl+IWZY1^OMxiWMQg#_f-hr(=%DjY9w z`(J|d;rF6j+>fo}skQzu3qYp=Xp`-+?50*B>YHJ2tONca&-S#u{w?$SpskXqfr#+k zf0}r`WGOw!m@jC|pvCF(d1F4VYQ48b`TuLXv;e8pxz z*u9u|`W{eNGHzpz*IO)q^fpi@?i^_FFTTPPxANab#)!xbkbjx?6zRRY>#nYy<704P zGKP~IPKM#Lsi>)6R3Qx`P?`X|{5&<|rT96<7DS^6f<-~|-?>8juiFsDH#Xj%r8@Y4}>sN(Z-#r)kmnhnz^}^&{ z(S3`QwBD)ahzyIqlIGxkn-o~c@+1$)jyMy#{0_Y}#MK8tuTKrbg+5U z)05m0lPhimi8ZmPPzr1LkD5&?%lD4#5zy`t)mTy#b#l^K2pGR|AJZh|WaTzq5P?&< zDWZOGD(Z?4`gh&5P|tAX_)TWxWb9htm$rk|%&*7p|4_dtU3=yGlq+{K>78o}Di)vo zZYT04;63hB>hMOteVJ0!%6+xM`4$-$AlV$KAa9X(+8$8v^m`)0k@F+bQQ=TpC{^ys zanoE0p;*}b<$**iG+#O5s&DC>F;9}(HHTfJ5_>P_PnhDJEW%|P2h3IXc~sxa?HNJ) z32}WO6Ft3cVEuIJ5uiaR8LdDcrBh2Ww_6%8^zw1{X3pm(w@|?=g>r)A+ZOFkYwxHs z$E$Qcf*;f_w2(@k=t8Bhep#;zi11=`0ds#9C^{zene=Ik@WMO5TvB zcTSpM$d5m*by1C(AVbm7bnoj<*%)9XMx zDb65G0j%164*W}+!p=JXOG$>(YJDk~FQ2dDgw6h(+rNPS0d4Xsfka>X&HgO;pw*jn`Vd+-a`$Y(Dm=8iHB}lqI#BB-oj=TYW2H+HAlXfF-IV{ z5Kw}?D8M(=1WA9l;DSF_L2LR$oVN#5?1h6Bf#~YBYgbpA{x1f^{3fcm z%|~~3ch3trcVN&ns3B-ji}Y7n{j7Em%LTVp`x;EE?0!--Ob6u0N2mvA_Xw73>#)In zvHL-TF5}$eJfmw7g|oP0X#)m6Ew-$CZn4IJzqKUY=67 z$@YOzgZzkY?j6uKU%N%mKXEZ1BTjn{b`s9?w_er6KC3cyE>G7x+T?hd-DDA1rS<(O zuOyhP0Y@o=;AWFGch>Gpn&6`OC$0bB@Tii5GOh~v*CanvnWlGea41Xqe(ggq(4Y9J zujD0ti8K67Ey<7T^9NHuK~Q4}^m9`E+HXFxZ9`vk!`YkwIjwzo4i*7=UO?E^h>{@i(` zxud}10>VQ7QYn2~B)ypIM>z%z#=Ga0HNYH4B;pQb)Z|7`dlKMpwE$xl_Ox%ek9CiT zPIu}rUy9E6i3dl*2Xp0EU|9oK_e2+novjmqX7KX!I`DU%H4>8QT5LZS7cpz@WyhgK zBCquKlrCi=i-n}J)H2;O1-YxAP9@757QJ&hzYXux`wi*1>zZUQZ z;2-BoP!jkb2>AcxhhCsxso)=WPu29kYgy7ap!Of8<^~7>H2+er_4~81P|@|?ymKIk zim(GRSfJtiT35rq7tHxSx?h2=Mj&ko=)ih_OoOp7L@Tcz-bo(XL)6ouJj1e}?q2+a z-V~ka-xYp4QpWvOiz3Bo=k88dJm|V~QV#@CF#E{fB8UgQMJboJ80XV}@cr)&>U#gT z2apIT!dk$wPIf9n>B1xD&$F4jndnl_& z+#->UVhJcDfa+4hg#=7lV_#=rjCB3(KK;w@-=z0FeVKM(g};_ZinRoFYg4sbOpQKz5~`eVUz}e_K62%!aE1!s^9dx z$e8PfczeG%BoeyLz(Mu9+A4O9<`wCYpW)TVAF@mh8mGHkG>_Qt4=dx5#nC(V)|@t_ zu*tg6m4N}B$Wq1)^!n?spZmtI{o3&S{oWox3;-^X8roOMF#u;CQ7&pNGHW9_gHP$L z0knS$_Ke#A>Zo3cS{Bu<>Uu*GhILi71faCHIq$NxwJM*)is04LVH7-o8T7k20o6eM zR!yy_N%g~LDcrE5&%peQZ{9RAlMzB?DsWf81U;c2XmVXtzTUiMyuH4EB`K!+YwC*1 zk<=%&Iv_8L;`a~IU1#XJ5po4267cHzv-#k*=J(&!<$`ynDTDAo`|cZgiQ!li3>9;E z=|w4yV6Llg##(Z$^AF~_T3=bX=P1w9zjN5K|Xg>!GA{ZpXZXe zs801m@c$D(^@qxmzOt~-I$IN3z~73dya-VZR79VC*7&VEpsoH#r2Y3@U-J5%oC|nR zeugfhKR}VX69gn7Kp>QVIY7Bim24l^k9Pd=T#~(x1FcmZyf*0L3EEz;2m3a1i*#l| z^jE>R@qGA!S}Vb|@_w+CUiS}L5Z(^H|t$BZHZK{jW;ICg{foNFlha5CyTKD|< zN6x?h10P&&&ilAMu*HD7Ly_pzsnd_3iP8dV8`w@KbfyjJC4xzpD}Y=fq9X-O!_T!; z76Owmz`Rjsgjmwl<8TL>sJ9-Rc*9o5N(7+yqV;=Ez)T(-^n+XX=>PuK>-5q)o}hIMc~DE_dLjTxyH8pEsN~AXAYPa0O%eM!qW^G1 zclP$_=G}X=cX(9R5SUYjzil?>^Rm9F$m@6Zvz36&{!<43gEFI_`uuai-`VqRs$Vku zi?3f#`QxZX&h&@DeiN?sFXn#F=dV9j`;Jj->>$Lo!0P+C65S37kS7Imf8aAw-QN*r z=NOhBq{m?ygK|0sp-bRuy6Zg0Zv3^7{haDNJ$9~(+o;h>jx#ymD>iS@|2Qm#1-n6}C@@=kn&cql&8;M=V zQ{W%)Zft+Y&u?|_3gEmxOOfBv=^{;Y51gH_257a@(Oz!eQk&~l2kj8W9H@-Yz4s(g zX~7Shyz7AA@UzH0>a2@qv_U;BBN$eCS%^g41?2i}iWj>jsO=LquSh3n&4EDu)Iy)k zVJEfXNCz!a^_@CN1M6q#6A-Z_fW-pm2}mU1Pdw2`K)U9z0^2&2z`*a{+@pW|uU?}M zJ^v)_MC~U{<1JYN(v9hF%ITjX`Ljm9nQ8yvknZdq&>MLg-vJ#QZL7x>A*&npy8#u5;8bUzXR{tU4*+1u`K#J}o# zqx-bb*F?bR^Uip)_j4Z!-aT@xjmg%#f^(_qw|KvO88615Zy>nbNzkQM+B7EZZqtM! z*db#H&0rgy?S}B^IzeG*&{2U=e>Vk3!M2^>U+j7B{W|=DhvRqLJ$34lYfoKUc)R<% z-PhFs`$Ji1e0LCj{sd^DEg!8e=O8~{+RG%U{TH`>3H;gEn6 zZx+wn>kkL7ItA$PW**zMHoE!o86LO?bCW$!&OM{&s_O^8<)qb$oXvS=15y(-W2=ea zK!bPhgaX!wC6%-8uMy6z0u}(8CNK4bj}bz1SK)$0bDoi3NWf$WL5d0ZlS~5c?q$vW za5GU@r@8*AVl#d3<{kP!evjxw&tI#ib4YVN&r*@}S~-DF{kOM&NVo1*?SKD}4(s&3 zZJfpApK5VEgMV4rXI(Y_d&%d&DVBlk^Z#iE|5JKlAF%+yDu1l~8&iKO7nk=X0+2V~ z(e)UrPisss*ayu|+j+HyJ_=AiF4`YJ0my)z^LO*{D#ol zMLn0QMWZG$S4LBJtH9JBHa5h6n7&U<>Fe&p?~Aev`i1v$s{T>>@iEjTrRhF<<AWyNJ+pp*8;qz<|H0x(Hko z+<@#@IV-`AQ`0j2H_{EvLbRNZPUDmp(z64&q?#d+EkdCYfKdJWfAWbd6#t+sC7jIi zhiOs3P!j&6625!=4iSBiUV83o&L+6sAzH5}pJ(evvM3yFN(R3a?Z0<$NPGJS8T``} zzns%QTMb(Oe&a5K|CV+H{13(K|J4t@zk>gHndh%e{;b_Q5&tsH5B&bPyf1&R5D*8J z`VpS<-B=?0t-ucu8LvPaL7W5_n%B$%K~P`bXDWk0wC-onheqHwTvtOs&pY2e${RbX zyq?Ho84+5|tBQ;U3+yzISpzFi_h5H3^))i2Q*G4-8YmAVY%V_8+F9UUFMgV|frhE|Wt=xf->T;4h9o8;HWX_cn8b~61?;y4+l75$d&9%U(S_XJa;Qgnb zxI*CvWp==(z(M}Ft}?L2GX{cn4mPOaCpyR)J*yDK`qyF)uEFTiS|gEZ%V zyUFJMgM%ZwcW^}e$@jn6X7fMB)V`5?{s+bEpTU1MW$@2g0*UA=KmPs_?Jo=a?6&Cs z8u*vB`}JxZ;5QY`-;eZfoy&_4@?^Apk5Nk84)~$0z~6NQI`uo+YGgXl%`7`(e!X zuUOl){jlFwT1lhfB}yO(;v~Tfyv1WEN+h*{cuB-T+|NF8j(z}j@W<~t-= z0FvKxOjH3N)aGIVNe~M&cfxQ?C6s?g0;tD6vjo`qG!lz}xc-*x57)-5sXV8Q?v=s@ z$Y)lVCmLvKzspHHn0K{ZE7Wp7;LmbVgk!OsQ7K1~0EWdJyd{|9BRMp*A*OsNPhMF1 zQgY|zkW949oPh^mgMRzQ69%*fI7`6I$HRdkev6>nqwm(^-Ex38u>(AE@~qeJpLf*} zn2uZ6-dOV`HPca;XKsCe(R*)yM*=+f&z-|xpAPkLrFqSNZ|=SQCv6BZ>?{V0c{tVY zEeQV6+uyJId!QfjAU`8&+RxzMNJ7B&`19>~xfh4POWYpNuvOE&5aK+cNnfp~hhcJR z*uk%q71Ca=%RwPj<8qF+^G2BqD-d4gOPR06Q}h}y&rV6IPa#7TG+>{Z{5K*Thgu!6 zlq?1q5;o03%HJ_3ec`fS?}_%vM03A8lJ`6;x*nc=YzMk71Q>GLAE$0j z0Kl8?{ki`$M*tQubEbc?8{y>H3vgjJ_h$i2+&ZC~- zIF)iDeIw>7Q@JOlpCk9rdiHaU`gOd^a2-4W5HG|=O?osQud{HxG&m0%B9?gi#tt?- z&J8)mo10v13F1J?ED3>4f7mOrJc$lmP`o|{P=n}<32Yizg}=f9Tnu-}=OINk*NpTx z1_UZ(YZ(kEXOh7z-BT`GUAHWs%TX2$DWU}b1iE;SYLdlTogtH1CjptK$SGD&dp^|GjXe@6_ctYT(>%*g4>;aNVn38pHc$ zv%e2F>`eY-t6$S*;7@D&ZP@bXNdgJ?n=OD`Ln?t^88Jyd@bQ#-&I}L645lT5sDLbh zLboQAz9X!%;+|5gvYkVDs*hA;$};drV#5@a6|W`f>H8?ELFWr4(3KvNw@NNpti$YPKfxHK*QmdL~ z0pOvHsn$`(!P34;@_{$&GAIkPq776d6m@|Z$c4QFx{jP_c=~H131Li~7$!0a2!lEk z0>b-A6t^1bs*?cp)NdlOa7#-~Jd7$F7UaYAdar!Rz(Qodn~z@!@aW_4g>x5t#6HtZ zV6AOn5~+y;`JX@f6g>C%5$`zYzE3A3==M4|bAAs_p9@?6`k3db^B26CAHjbT!Qbr; z$lxD>{P?r{{dxYQ_%B5H%Ot=7JBjqykoA5V?;i}Y{!vgZBr$tW@-iu%R4kOe@P#9& z47`({(_Z3oPkkeP)*xQCugVzN@&W&=JNMNAvn)r~m^t|>tqqnYEuO99SZaynvi0s< z=_<<5@{0XjZs+8+RY{%jOB;H(+E0iv!j_P&iw5BE&d%ZexBTf{2TlNzQ)gNu4`AFh z&6rvM@IDuiL&0$Prf$n0qi7{6qyc^zLm(eFysU*4vo$`tPbHq3(Ji^hPxUKmFhD~p z_1agZ=p3bMX5?hXnt*}wU=AxMrsg|gGvI4tP)0hoGOy&!Xqf{kU>}pQ1Ie5$w|0?n z#R`w&!erkNFN|pz3wbO6nd}m9SR5g2Tx88|uf4H3!{iHK!?^2VhY0@8 zf54sc=bQrp&Hn#B2Kn(3{w6%O|A>43Q}9o_0E`Ix%iaZlpXvS4YbD1q3D$D>>3Q;i zGMa5!g0@oDkV78(rUB4!z4SEnqrR7as6K`$A_EVUbyh(<4eIiV6_9k%Wu&+uB z1}@fJy1ju;bFEl8AJMT!`cB~dK|)cJ%{1h164Epx907NlFZ)NeOz{j83yMHNAxSj{ zdfJ~Q^azQsDYpBO2C1Duf(hABfB_8T!(&*`BdTpYal=~z;BmO`+yx(&*O-Z4@1Mqc zIv{_rKMhwN+K6Pwz|4gf?yUFhKXZQ99|Ytwo_O$gn*S^Y`LS^AD{J6C%342*^Php= zulq-9K#uMw&h#gJV?Znq$$>$bRTbZsN^cEd^E~94m3|_+MM41(TzukgzV7WdBITgH=P;pH!`|xDA57{?6FeVuiR_ zl13ks+L%h2^Y?_$SZuos2fX<&mH?<%)UKP*&OQ);+PXYm(ou_qe>Eu8HEkb&ng69H zKPL}XJY0dh0`wIUV3HCyaA`lHsfiOIRy{fa$*|PV3s?dCF~9Uzo21%=&Ap?RqRubs zv7v~fLZ}MzAhdEz((t*fIRJ7Y9^(Jw*dp74l(4}}1Hc_2aZM`k3IMVGZ}?~73xkbk z!bk!DS{q11lhSXa4}i-f2KK?Z)-l-1DOakJhp$+@PmCoA#mw?dcRUQgXqW#umdCyvGfjv0Jrj8U@9?wxE7~7kk$ZP zgI;R!&@Z}MMIjWTI2CBh%J8}rfqI6(U#kaJvy6|y$ydRW)tXr$B`nV|{6^0)Q>t9l zLspi4WI#>(MIkYyt;Kz%?F9)bDx|TKJpU(SH@Pm)b%_W-jKEK@y=_MgbpWJ-tN!XL zlRM9((i$Kzoq;_{;aG0KT{_eZ3+yA?1kC!NK;R(w*RDL8`Pwp>MFRY_;&=dCD)Mq) z6*I`%B3V|_6_QgG61AI_93^bn+7BroZr0w^LSQ(1OK4;bMSxPzrPO5#%A#J zA5B*@rj$K}S$rk% zm%aqb_)J$RZFp04;9Z_~DKD64tSyDmO4wqM78Oykn58YP6;i6;yq5Rr18Le>E;~$- zUdk;|X@VU^4QuNU>avf1m5NFE2&WxoyT{}4SkL|7uS;tIFd26@H>RG|SQ-h?2Luv& ztRbjv%AR9sEvRga4FM~MgJpF~PvF|_fFDA+^l(s@m|=wmo7rJm7Yg@bAnjfHfz5U??G@ zks^uqNLOs~`=QOv@7L1T08j!FZh`Z^H?bZV6TgWEcs72Ipj$=*=at{h0o*BkX5sIR zOb<7o2+ILqK6f5wvpv5Yu*J=iA&{GsRiM~{CD?$aP)qo?@M{-)zkf^YgL#}(1^hbE|;S6cq$ zmXW{FdTMo%)(Vv!|90x;+2Y;5V@vE38QM}n@R^{d&**=*9GS27RT z7VS0is+Dv>NzJ}yOM~{Fl;_nkz-5vo59N{p9?m^H-24@rGaipFi)9`z5dp|;wE@th z`LqFCyX=JzfOwBgE~J}TKp+?trgIg*E%Vs6#Ru^?B@PA@^FNf|E2gcbV>GumC#Gg8 zOFkf&C9ol+z(DCGmlN`IO!ml1<7?9bSX7JxMFK5frMY}FCw-cKPSxiGiPe#6jR@{c z^N&EEc9$XmNrHgc(Ea&QY((Tvgdh%588D2H$6DyL>04aM9fd^=a15+WmZ z@l<i5i~L7Ox9e4zyu#F40=;)iT= z%4IA=XSuTYSU6opMN<(eP| zbs#+*z?V5wfKUKVmZffgsXS9ucEw9cs%yEHSulo+D6@p=~t+s$7wVY&zkU&Mn zO8FcAQf~1r$oxQ@u@QP||vZB7Obmhr4ypw>GMFbhA z(fa`SfxN+%leG|%?72$0QcEegjW~zj$lqwa2m?sKj{b7o?4Q9t|4Zk}V*$Q#_MAWB*D;AUt|Ih(m&o>8Uho2V?;GC)&2$5r={lITHE4Z& z{}Gt+C?4+{w0?+|3Wz|@xBWE*@yY~%js?T}i@ks4eH8sm2Pj|uqjO0!*%q94H9hteldRf`923HRHS5U1T$kM2&;o`~#i%9d1elis4B+-R9rhASN_o~S&036XUK?%e z8<0Vod1JOn@F^ndRV+h1{p;x(4-SMdU?u|$y_o;XOOVPwK2epAs@x_syxn0x zU-MzHa-uNXD=H;IIm``!6If7&N>mQjRwo&jr7S`ZS1$xpr3`k*79WSe zpC+SLyXD;c{=Dixbr`!Swf6VaVLHk;aG-@iU)mNQUZ_% z18(>y&VT3!(DT#$=#zXIAo~U|?{9KMqouvL&sye3Deqn~?hD~^acE2j$YmP?73nGY zd?rT20+gEx3(2P>R13^xUm6$$_@}hOw9hnZ=J8*W0O=3VC{AgBV+3btEy^Ej9~q~R z$14zF%`6a!00iLoB)~)w--o&4EC9xR?%Wo@4y^k(51{WH0?i`)YkHdw|8d~|>Bpb) zMLTbQcY7Ys{SR7u(EdHxHwNzc`yW9EE!_Mc-T~lt9kjhadC2%v22J!mF!6k1Bu^3e zeZSy*gxoIe1xi3mw>Y3sOMjLL(!fh71Yrw&?C4<2$2}z+a*XOn4Gjv18c78Ger>Co z4qherFTEIf8eAYK+omJx(pE`_%krw(ZGT{x#vF{95Vf6}yIwZ_H0u zD=*J=sR%%Eobuj$K94_n@bAf1z|>sTYn`mA0QK%u_!OIPq7NCrkiS`Wo39?_B+_h? z*B42V7xC(>Xw`nQ+E;oxp%+s=r`k?`OL`g4rsd0mwV3- z|JI!{0JpsLUC_8~hwZ{I0eI!#;#4%zDH2J5NhF}}$xe$T_GJ6>XAnL-^p#uMxikfv zkJ@_Gl7Uw-`x;Q}?rK(q&`EE1Gw_^Z>Zi*B+)-3s*{X!QP|9t7N_n=FomD6+5PUhp zNx7AaGZWCh+M7Jxqa1LR)FS2@Bl%7^G>b+v^U;ZY^4lYx8?DQlVqKQBLTZDgR5l8?6zpIej9N_m0#E5$z ze&FE%{(bMg{{24x-MQEP-3GuHUNQ2T|35t5!Q7AGF-%6S7YZ)q@I62Hp3mo&w_gv< z*sb|5z?gBUYM=O!ucN=$a?!@4OcU^j7+=AVev{*Zd{{w_r~6BlO)RUJ<^yZ~Od-_3 zS%i?TYW+GP;PXrw=gOp|;6J#{&+zjEmiLdP!c}dnx)iFk-(U=w!Ix%v2b+u;5}TwV4Wre6Wy4 zSGC*)%Qed;f?_URBBaZEhRNg%`r?K(`IAH}sE=ItH`%ln7^Y1wzQhJI~?nUJJdgU2*r{e%Dv^mUq6#`y$u|xBf-T zU7txnAXt!>=?ovoS!>E*B>S=iU}0uof?&(Vx}K0js1bLSdWwuVMpkOEq?nxLC~s~@UIz4M~kSW;&C#>^O7hj0*{9M#VI4lOjR~1L~cmxrCgcCiH<$_4u%Jz zN=_tClVdp+-nl)wm+886aR4Bl#o@2TVv$*mk7M46WdPy14|JS}u9N~56Q{pAe6r(N z3De}Y7G_{o+(X0yaE%F*3>5TI_AQE?ZoMkT!fUh{~Jd zvu4gES&21uc7O*X3B=={kORDz(&WWup&XjH?n{JO+Wtk4`V~^MATF{^#G9S)GZV{V zX8&mJx6$O^bW!U^Q@nX>Y|#8&c;DUGJVgGp7Oq%p;8iC^-qi1w z1m5_fDJ;6(U|Hy^T(McJHI#&fQ0I`wgCI3Ot(TXH9rbN29fmM54#ainpK!uN?R%V z>43kA@cHJ-S=KcEVhl?jEEDo%av46CN9T_Y?EIdVCWE3SlY$C5mR`;^;q<3E{GqcS zu?Dc+0SNrG%>t~gTt6kkqj-G;G?I)R_tjRO;%{5o##Z=A*-!M{oCtJwSy z)aN77?C&&x2mVg;_u%jNx3%!Btp;9syoK?^z~)*5>(ddmjfH>r$~8FjlRfy(KXovh zS%2K`)Q2Q@4u%%)`QCSY88^S{J;6b7;Vc1@5SJj%Y!CjP1ki1ACMyG&MhIJlf>y^# z_0llYit$ria?FeGR@6aBr;`@>V)Gvxp{yP|K!4bfIkLR4JU*)ilf*!^iMOO7Wof0z zjB{qC{sG?4vYj^FEyoU(;X_3gM021c%Q_dTdc8@-{R%;l`VesjoX!8oAOJRs0^iWS z>*f~7X@IExN9U$Y0$2v&5*nZXjjXLu6Vb9N88#R&Zh&~yiqDF4l0{ijirNR(dd4;nw3`qNr}ZzK3;zxoEZ-vPjf zA4Ic%@7MdC$N%o$Jcajt&UOR;>UitV`rlY@;Hsk&xZ>EB^Ur}Zr_aHSuN%R}+6DN^ z{WAzM$dP~$lx%O_!Cl||mM`>{cfA+PW>^Za-Y3B3y1PpCrpQ_t)NJ{Fj@=xJyQMz@!gm)aU7ndP6CSx7{krRcF@ zyz~B8iCyF_M(bnBUyvY8Ua!Ces&b3m*73VWW0sHt4f_$lC|MF?^4z)eXZ1=R{BC>DXjr%zq(j%U}q8xY{W^Of$N19SYrU#cdU!mfS;|(^Z`Jfxj$<92>f32 z_ecLi)cixfP24G9BlzEU>U08s=kf0}|E>!sZeG1%;5SaRus$&`oftT})56u)ti#b~ zAA|W`5943Bbh~i#?{2|(bQZq&qZusbGcYjm%Kupy#9SG+MkU8<(>O% zj8$ObP6!b#siw)Q2RteLZ`l~ir>$u@@)wssGoD?Pq3lOcmK~F9SYgfIvQI-6jiO{? z3tRz2V;yTPFN(4`MV*=yv_AhO+(^nFJ)fa^r0R>Ovi3jB={Wc^5j)Tcg*l$F0SW%~ zcgNpX@syIPA)j-KGiT16s@3+OuS;qHuw*`Wi^VRn^ov~p)CrJ5b8*q`qh8eVd!#rj;$N`H&?Z=H8HS0 zHL$tSz>y>0LO<>HXw*-Vk3T%R7PYC+hNe%4`G5(Nfv%VZKNn7ris=X?;ESXJh2}@M1c4chP zQt|O`C=N1J;3WSL;?(3istkA9z`7M9RYiG zG;nr`st@+Uz$1G*Igm&-E^oEbGPQ%ld|&)~_)?@5HG8ESLx1;CBh|>jke#P5m2bUQ zG>tz^Fd42*KE$e_5E|Nie7_X@$r=7R01%MBrRL9^|FkNRqP5Xi+*i6@l`m;#Lmp@; zqG0@t8h>ZGxxb46eK6v0@@dSv&_^EnWdMKZlehoe?ep&zKE-pk4gC7?2G+;MYyWQD ze{-XSt?e;v9bSj6BS!$HSHkY8Q?R&j7R+MT*Xfq)wtaiP@I$v8FbA+Bf0VGB%XV(z z&ToIySLi?9@cytXzytj_hU2!$0^pbT7+~k^TeC{d}*Jd5|b+#WTH@m!%8WG3%#OU(UhC&C4e|pTnJ$b*ctT67v}7je`^{e(ksok*&w72 z6~p_G^0{Hg?{Nr24vGS3J9r&Nh;6G}^k-m!n z{x3LW;J2=BVRK?&Z5*`!HRt%Z(Za^|2-dgPV7j>p)2$uYI({{bH@5&rV}E#%``-uO zatPk^vWZ_-m@gJETUbv5#{O&qfIGkS4fxZKe+cY_bN)DDaE^vOnae%#4bXVE&3(?s z275UiEM+gNy{_-vBH1bLNdtf7VHEH>!QgXPy(%n`YOBLUhTq9cOO_EsGt>@R$ckJ6 zl>97|&nwcqniEaJWfPAID%f1%g2Z%Fw}E>b4krya-%_RsmiAU-{Cf zu0CNk5TOZ54$T8wsG7T;)$m0omfX@;yEt1GWU7#1hRk47d8`yT^)-JwBSjkW{!Ki} zmTCG;Ht{EoztN-psb+uqnc-FxM76nIRi*H`4EzvH`d;Hl%|Dv|(cF*Q{2+S!H*^OB zSor9}kHUSYPx}$$z~7nZyG57G{x94K;O_$cxHEjlW4HF-z}mEdwT%(1Z%tsbF@^Ek zI>2-t){h>C$)Q6q-#s544LWbxcO<~T>0k+1xNU?jOvWSMl-Z(#+rRmBA9(1N8*Yl4 zyj%AlMbYODCu)KZ06GYk>qWVn4AFRPe*HWklQOQX72}ZTTzYZk+uB!X%ZfQ!XtC-% zD+(s^3%E%=`KYi5bwIDz+?KVWZCz?e^!dh#8{gP2{Z7--Ep%y2>!|1KBB% zvIo?F-TrEV7j>hqv;gPWD4ttj>7tpqj2`gr(n_bK3`Xfrs?74>kff2 zXW(-`*n@?OPXKN537Fd+Zu`bpeZ6jZ&--(5rLmK0@w{OO#}=E&;%$n*6rBcj6iDYS zK%D-ZeA00x2N978WEfdxxD8pWn3Nw(pYNMOPRQ}EltaOSS58SQpXV}9AJzjSdLJ@J z_94yQ8mfdXxoTXQ^`EWl&q_baTRLrtcc>$^e4GOJ z$27P4ZxRqqSx?fe<=XmCnFAFuaoQx&lK@tE$S8Tyb@rmn%5Q2EY`$$S^#akB3meX7F@~4_V{4^BmO=;V?vECLXvB!` zs3B(mkN;AD|G05mY@v(b|Kh_9y#ASPz21a>&hc;J_WL)m5y5|JXAE0M9r#cD(n#x; z57xI}p4J`V6roY4V_g}jWzx(p3Z<9MmVBT36k47*Wg*2b~##iCb{^CQ> z$K?P!C(8kSPe@SxL{3Nq3OknAUksh5RVG_`H|1yjM(wvHl0e890u@UONb_Cbk45ER zsBS3xh>}y5XxMzJ&hZuH9h*nA!Qw23r59Sa6n=6d3Tzb?520Afcix~}iKZV$kW6QK8etuXHhKm`i9 zpkPg6p-eMPrATdcSwm~63KLA#tVe#fqE{_&&?Dx4)62hT@(&JwWsskc z^I!e)QTRdxe;2{edHcIP{0RQPa=3xlKGSLb0OOGf|HdY0|LZMmZnv;~WDGmUHevh9 zZ7{8Yez6PfbOxi*Cai62z+`;_v)vKQy51lC@A5FV@xg*VaP79QhqDB9KBRE#4-g9T zyN6GG?JNHG58n9xusgsvU>r35IM2PMrjPnvqx2mE6~28CG!yFJ_#9veir_}GbB+8D zF6|f98LlVREY(iPgE~>4gwGiB2GxmXXgN5 z3vc6202UX(+RCIQ-Aqqn!ONH;WfIg&ZMv&yc>BAG@k#zB&)oruLR-iuhcFc?*2!`Y zyO@kLc!>xUu*~9+^Q(Oo<~1^bvZYo`1`YhFBvink0)F!H7pDJo=#Qzq#G%I02`=8B z)O_-fhWoLQBYaapAG8J#UjVkv&!#R2+J8Jj@YY8jh0i7M2k-6gz&`}}0eJC|0RH0^ zU^Fs52+(*E*8QhW``;eHp(7L6x?&xUJYxse4_)%E8aFzf^0$hFWjU)j4Aww7^podR>?JGXc!Y%K)DX+mh$3j0Y+)`hR z9neRh#SE)++oXCBFBb7@bAH{=92B!%FlWr-iKqk*` zx`-afx5}aEO#abfW>QE^b%Nsn#yC5KyjL3)lHGfYzRAszi zw(*+HW@jFL_?H8;SODVRy}iA&U}=F^9g8Ni~;v$JPt&tiT&Z&M4!F>=oqnS zj8e4DZAsT@(whteA5RB_^cVEafaE!H zyrq#Z-{jGiDownQmHCjyZRJ`rXO{O1-Cj88v0LUThl!O5SV}%f$>t&k%u5SZ%3~ph zi}Le#%RU>1?My*nGd>q;XkrHb!UBNn{0(2@=hgx8a?|m%mRB?lmpnc!8xXv2$(xLw z!N)RR_orU|5&Zko(?9I<$1$Bv|E^BAKKeL(K6?8j_&c(k*8Cm#JF`EU{GIk6!GFW= z_YV$#hmUW-;j0fpyD@?B#u|**H+*@0=P1V>EM~hfHoGtxS(v$Ph5q>85%it2OjxEp zJM6ysTIU#e8b0&4d*1xtMoWOZ-1l3*a-UD{NdUgz$v7_gK{_Mee{MjaKb@4tk%IL> zOD`+OSUtH>bv`0d$XM1g(yJv21^*=xdP;O+ZnfAO{DJ&RYKs=hkBVluf)L>2oWour zatt@Dl!XnvgUTNK!V0sb{$%P$tAtJm^fi02%~+O4%SgM)v`U*Yk4imddU~BbbNb8= z{_gwgZKYS?> z)VWnafPZ1`2W2UsV*YP(xd!q&X%Ybb2TKGmX`dB;DT%6u2c}~*2K6bxzt3m(dryCV zc7Fi>e4K9xq1%`&KyH2XG5GxHGrkz~_ILASLBRj@&ywKZ1joOPkq3XL`5(G6nEf}e zJPeDzhtXsV?RW~K(a2j8Y~Ml)d$6(5z}ChH+(KQy05H>u|7#b)Lg5c6ietBFttSBh zr{SKz-3uXy+XhCs9Ng+iVN|tE;mc#^rJgqb)Rsf>7*qP4C!^JyZJ}F3z27ez+A8mbRe@L9FNe5A#KG^ah z!@=KZ!{5;U;zCGH03#;Ca`4AWXHD<(O%Q#KUS$q2X38dyUL_L=A+}2Zi52?|##Cixj1>`@HY^);R0jtr;XEw5 zoatT=O&2Oj0lBWQtrbc|NN@z%&Fu3ZTgBO{?;WzrqWXuYMB`#FP1ixPCn%KLgh7rhnWBN;i|{~kPLh|$?BJI_K>j)uG*)WRwisv z8^EV~lS4CY@>B+sC4**Q`AK|cWUSXsjBQ&jVl`WBS}@?Uc3|U^!?0IRVwLoNkqRK9-a<#6$T3(PlEHnaelX3yg|$cT3uJH zo`~Y6pT3rT2F28u^orHeNr6xHUI)-skTI=zd){s$A2`5#2|c&e2~!=zKQD*`aEM zva(~pHu13gQa9dmK&ziG8+aIu&%*TN*1CG+IUvW=Z9E@zOY`)AM*#BuUQphB6S(9U zdpw#vnW4Kj5UP0?L9Y`A7up;cCT`imu-M3JJON2RRRZ=uIerlK z(@uM}9a*}bzn6Z9&`{JFvyw)Batp%4e27+s7JThY+h@<0byr0+sj&6>j_YxunZu-h zaBtI|&xKw+T0x7)XJh*p%=9S(o4l-P>#$x)jG4nNRr4-7=hxjy6^v^g96%i} zza{Fz0wUUq(-Uz!S!0oy;cJ-rN6<+&+EznBPRsDUC1Ke;YrTZjED)yb_Exkodj7OW z9G?~0E#{67%?W8kMF`?Q8&KLWtXDvkasu(zLxoK!T>8IjSR=#%_qe_GvQbG)2Li=^ zUg|5=MdMh-iE|O3&qsO;vBhjCkD@&Vomh7glV93&W#AkI+P`GSGMZ;jhlD6S5lEKm zC@0zemp7Q1S+u8|LnZT;RVXQ3{t1cR(*@t2<1x`>jvzL264TE<`H{7E>#F1m|6Q8; zem|;gl`)1jxy+)UD;p@TS0`}^r-kC6-tix8_*X=KPkitoc+92<@WS@i@44)&^cXR* zvj1Rc{N|M;a(rHjujZTm7A2c(p-FAJn_cq8P|T{WgkHI&Yw5F6bTB2&jXajz+SBb^ zEg?{;vI9s9PkRpvM#i%m1`CNHbiHA_CTK;{7dUP0kf!d+VGVEHY0ri`_DPcUw z(DnAy{CA1-1h(UDw4>C69PUyka_TxE3w@Kscg$oS*)xBPa}HaB`pC^jm? znt4VwsWzYq=|W7?A)m7AL)G^USf!r%(8_iJ>9X0Fj`RYsw$&=$<_OZiqwW!_Ao%hc zI?3DDEn%}%Q=N7=BnrdRYl$&rjXwi0E@wGj9tL@3V#n;K4b38ru!YcK2+&e*~ z9CB#w?Z{~powk}e;_!dv)6Teg&RC7Kn&qi|9|Da&Jsb0wS0zVn9^ZD|enfWbxLZhJ ztygKVf_xb^O^=^xwlAFA1uI>{F1t1TQn}t^rz8gdO3Nz0JCFG|B``|M?WVG$^#pfw)-#g|qS# z(nWl6blP$4h+WO;jIzZ-F=k_+q0AVVC^DxREh$&?dGkqZa}z?gYv%HyZ!~*#xiOBS zxXT=JvO789Fa>OmTuTB*_PHWqeXNd*j&I)vuR&c{me!sZt)rK3N7c`~@!xt6N}rE+ zE&dw;exzo?UR~^rWA)+d|PaHo?)}1W_yYgf~d38 zK7cB}chj5sX^Jk1(rkWHQ&*|ffACEj&|{9bQ$FCUJS8h>gZmt^qot)}#BP0`cA8 zJ1b#w!ruWn&|Cr^6yjj}LKm#959zJt5AK@9_Z*j6H9LIfQqIOJO(0rZ(~Iq^Wh`J- zE@4~RmJUlZ{?Pb~ra{BuBspL|gU`UM(AV)1+jP=KDLZS_ysW>z87a|NzT0Zb`ot|N z<+>~xTxK7fLt5d0y>SR!J9w@7UCEuYevgPUVGQ|Mv3mPHqDvKa*h?x7{ ztuPnWG1A>0n~Cz1IH)%lxGOxyN#6T<<9Gv%`{`3xzaVeS#U66o*Fy(-_) zC4ZiFQ!ggoq|$d^XdExxvMDTqu!q|GdOBj)vB4oBAktR9m=ed^o3YpG;sJQOJdq=F zMK58~K|6nE%f?1a67>vQ8)n2@T~weH)75~$ZeedwlUi@+ej!NXtmJkq@M;D7OlC7WVe4DVY_3w6`Kk*uq+x>i{U~-%n=_(bumV3T8PUX(f3eu|~ zXK1bm2>Lm$ctU@NPyL0L0v(v$0~Iv{l;#K0d#P7Q*nza`@m($J%`C0VxW$@SOw}G- z(9(x>e{4ccBn&SfpSqab2TV?!>6)$iXF-N`DZt(ZG9kzxIGd^Q`FS6wBQ&6D>_sMi zqv7M1;CR}Md}i4maN5hgm`EH#=tLOKkO{5;70{RT{R^km!mhMxhejS+<7B}UZ4WK` zVm2w8?Ba?Ndo|8l+`uF0e`)UXF!Z@b0&+7L-`H*Cxn%}7834mE%Kv*sH2uefS%KwS z7NKQhx?QTBWdt~SCK7yZSzR4@-qr7oDp0kF_V zql;esEE#4emw89CX1Kx$e)>Wb;r*e>tv9T~6j;*4d!&r3KouNIU83Ln$?A&dhbleuuHCay zlyDQ8od~sd3?e)+9mSrUpc7qM!kTHA6v2W|czYLm<3K;IntSCDcwLRl-G4rX7U6AD zshu^G#UpOIU(}FDOjZ8OzjHlDCbi0TU1h`Swm`58n1~Wxvy3biAP>g`9wQRe-L++o zIEBQ)7oPOvLz%HCx6H-8r=QsiP~3G?T&d|dEUj$k3$fZgvrg-P|BI1f`CwDQCV=hx zu7x1(uUV#`*#j5WS9`YH(&SU>mU3qSj(VdS(#LExK>e?xPEJ)Mbv^dBFPJ&ccHh3H z#8?P)9oX8HO4uDFm)@%K!P?QRL0*TbhcnjlzHZBmS^V`4jl5@0n?W|Nf9hQbA+p@2 zHx_U0rd5Fpc17kgQv$t^Dr8FI&0&KCjmM7qV_C|^!s@|C=`E8*_>E+hpD$8wG#iyY zT8BOdP#Dcd`5)f4rdV-cC#s^}g8&BAzI1K$y$!3=}lw>N{r;d;S>9EaEY{&0G|%e_PGMYPhRZ=o+x|DRM%N9JOi#L>49R z!Xrw5hnpk33qUO0KH`@e1baJ-#QuAgpr-)AM?V+FXkA-e2f&@kE~|6%#~ro>p9IfW z9X5)s5bX(P>mj&1g;HN5aZS5KM32d$6tS)qoQZ$*36Z|o&g+_$Fp(1dt7?DkvhQF0 zQF5i)?8siHj^nRq$(LkZCNJ|yOU}ypx`)U-P494{7oG%vs7NN_a)}HH>?~OqS#-zU zm9d>tt{4szY;=bN^TwZB_Q#$1qn&OqR^8f84|bcXkLsu(#2ABAN;{t(^#pM6wVIL& z&WDU)wi(!QWA><&juxQBVIh&J69+z3s*$Nfxj{4teI%GkDnTqjRy~Q=|5#1VE4Y!% zZ4+wKr(n&{#ReRf1<`ksriOwD&cBB#Rb;q)dsGr*f+I@FN|bp{xunEJ9s-uQyb@td__zbfHe2s1wXxXM&$uU-%pOwPEKI2d%t+NrG*GnTy%;2*bSezoT?7{)! z{(Jjf#O>Wn9EI;JEw^*qS9dwn>zdz=R(U$NUgar~GQ~e*dGZ3Fea=mi7TZpAsp>(f zCS|0|SM^<0t@qGac57|d@Q-?uOlek;u_@npa_Yw2yIi#qN)5F!#X=$sd2Bv3_r&RC zd|mvPA^*y^jpv=uD?I5l>-5_f4nf{hUS(h{$oq?K~su49)q zvz-&OOL<`pN+`YxjxJOF;vzX>STbnbA3>QY7;rztyJ3j|<7(&LVz;@wXHEB}kPM51 zQPdXA_CRPC`B`>1EO(D}6t!IAix8bbFk8z_p!&kESQe0-;4_j1-^#9K;`Or}tRC37 z2+-@Q=6c-*eJdu*nheO8IL##P^q*^*3pIe=Gw8D8Uo5p*hf=d2`12FHb)MFMGxJg7 zzWW7{cq^1W>?VoC0*RUs&~tYM`F%2q5IhCo)+qpy^SZMnIq~@~ zQo1gF!0Vik(g2>3!A0aEUKnYA1JQ2i%Ra6_q{Lq!vIjL} z=nM}+C5E)A3=28TT!57%$K1so*-O|eU&M}pM6c4j7?(PbqpRNXQj??DT{n7wD)}!q z;jdu`98wTCt9 z;*X|$OU54oxck?`X{?oek&S;Z>#cw?ugVFov3=cV2n|0Yehxf1cmU`#lz;}$Y42zx zzpUlu4F3pJJEe33$FP6!_{r*Vt?K+}vN1@f=|_^cZY!rF%5^M17|hyy&kj$ZhZ_*W z-7ol?eoU|#e(|?47XUr6pw(;9-ka&%QKKJ<_#N5s zY5+}z=u;Ye_acpJ$tP`Yz)WLmPRN#6fH(CKA5AzGB3Pf2vn-a2hUD{Z*8BY%vC$x)tik&?j#6_^NT?Oe7TXWIaEawHt)P^k-K>#maphErW$h**;-q z+PC~-&&Y{TUOA;B`=?yr6?2BcsN=7fYd*_Ex@JzNUatj%o4tXps|w_UV_sNg%;7t@ z`1k&w+)!4d9Po*d+pZau!ubPdgp*-axxkW=FzrRBj`Zr=tA~f>Asn8gKzAN5wQgY> zpE%8F4#Og+C3CDqoB{(SMtw@J5p34`l@8RlF#s^cJ67p+G9Byo|MSA#t_iI z&tj}P%kL4Wsh=!sYu_w)5CC|RtM0Pv%t9ph z?zqhaB;1hV2a81cORqfK$-rSa zCDzIxpJfP|V#N}s0|Ejhv~By$vCOov_TNhH1cWYmGSDI4_uXaozc_(BP8N!{`CLsw zs|l3FeUiK+g(Tjzti+nWS7v$5Qr~x_>I5IN|CyFrlIA-}#>pkzrBI8S*vT_q#wu{$ z8H$PaUOg1;-S`p4wK^R-2D*S#lfxbs{rOugvoHn7dhctD8J0WNx)?c%Bgo$`S1OM< zvB@rN1eiWLDKUB={z+oz$4rm=%NNt@Ki7jx3TZuJLV5m;SK3QI(=w_0*^6J+7@LpV zWA_MWV-(-l@T=VpGOfF-XiNZNRq@UR087u*MSpE_6BM1P?}EM2#ozqdI?*+8n|zbN z9+-)-*!*O6MQ4!&g~=hpD}&Y(u1}DkL=3XJ2=&1n?QVEz$%U2=#7*(xl3;Qa-qyaz zpVqG1Q!6F6IP%@lGVpiggvjp`aJ|b-zITm#7McUlJcD?6F1p9*!^;xyR_fuvKyR{O zs@U?$mWqrjOW%4LUkCCT1(>9!vWB;NjR4(bHm}sEDAKX9GCkV&Rd0jlK({EywT%96 z4`rH!V^&zFEV{(pW#HpBfo!4y-oBej|J=dq--H zZ|x(;CNw|DIvg}*=Gw>KvcncoCKpTKAxB^aH z0AT4A1^6=Hw;m39UNI8?E>m^}ofX{puV&Wm$`A)lJ+*N*X>4+(F$QCvtN-@k2zDLG zn<>b>IlD#pM?#8JYVWz<|{cg1%XtfTx~yZFB%; z;C=%e#{kA2JVvHPQr~)Y6Rh$t!x1lKHj|kOMl`aNzT0E$8l7=)Yc3Rc8v@K{&5{zW zJKXt8k@sQrY7D<}6%BtT!edV?yNQ(QD$M}X$aWW#jK*v4o~5eKqvFV@Xm@qL;af|^ zUw7mr#M>Nic+}%mL@yxp?lN>Xt zR~Kj%&oK#CXPq~h&Qq$QxPr~v;r-DuEv|+3o0{RkuzAs(cfZPe>#r-k(uC-R3mUjm zam2px|A@Y;AnaARV+Pq;J(it3P#9)tpiNPj&B9V?4w!r>Li#kQo=Ueer|#xzaW6Y1 zkD_JD$<4674dtuB1@0B3rh-AP|C|xND6v8E52yh%pVfNvt^tr7LS_sELHEB0piczm z)+eKd7UVmzXHEbpvK6Gyb>v-`4@&Vz{wI^`-HV#~0&iy&+|8S^1NHPAe+K*)GdXRe z-_0-q?)xi&A?{${C)W0#_-(snR3EJ6nejKL!r=gV&M4vh!p8m-$Wc7pKFJ{9i0OjR z(V9{Vnh(BVL9ggZw@ZH{ZY+kYlU8KZPfO^raNzyshNy7%s1jYaqz5=|VCO__TCIvZ zj+DPuXIyLLckQdm_-sQP7A7G0`F_Mn+f?u0ryu9ZaL$qh{4^Gw!I9}tcQ203S)}p; z1~*HSQ+|{Z$G;@fec^E7%7;#QBz!5FhVxkh4o0IQ$ya^%a{c^;r~XTm|hm|Z&Vc<7vv*)BnX%)S059XtXN8f&8>gR^%Un%VzrZqP(0OziqJm2=_?%) zrZIk~7U6`_a#8Y6hT!rj521mjx^-oC>6a2Ji}NDO+&Rx?%tRCgqJVn&GrL_4JAJb$ z5=KPY(Zl0Dbr*7Aym^kN7dV}#Zo$tUb|k0}wU4j!b-W)^9wP!1^Iu%woP{)_1^)Z% z&W<&pu#dM_7{heT>wD`LEW(1(5+Pt53x|6vJL|Kpb+40u#=+0=uU5mGNd#9~(K$Z% zB6VeFx5(RcQ-F#f;4R+ZdxRp3^Gbh^6T&HcH{j=jBGFwzH!PstRZk^sF}&{be~`0ZlsqijcF16r-z$mOUK>zrRny^( z;Txvn)mK$S2CTXQBB~9ywP_WX|JMTK#G9W&D7-%~l~Q4rt)4u^Gq)M!(q4I≀Ck zqHj#)Am+E-%P=^{jQ)$ShV{}{B^gh-?NZ@1v83xQwjncj9Sg$?w!o{LJ;k$V82D%z zv4@78Vm~)wE zBtn;tc?v!pbS$a%UNtIqn&!r^HUvB}8Xh*32uv+CNe@p3KGsgw9Zn16eKg0PZEqld zSGixd`SdY)LqZr`CAagBm9G?pg=1zQGobFZ&BO!Z>h}0LLq>1+DebAxB_CYy11cg5 zNr}LWeB|s!B5p|^5Tw68;*5cv{YjQJR)>O=uku~o`mGi9a3*|GtCyQW3C{NlQhBF2>@ph$oS9J>l4ufFFW_#D`ST&&NSbWLcY7evImjwisNQ&%z_Kexf7@QoBI7DIr{R$Iohd_Q zUe6sNq~ucjb)IMIB_hHlZb+Nmx4<}w!|EiH=$+`Zzj$UNQu&X4;2Tzo*KlgO$m)lV z|9-){Shj2!^6O&{(pTfphb*u^=V; z6JTlc*+>~Uc!9D|3o39Hv6~X1A@O;S8}jR9W`~zNC@_d;ig6_S5Q=^pGzPo>ee0^g zx@io`*iIYBYS_*1d64>Z3<{|vK$#DaM#EN)0#2|yRRy{L1l03 zwu2W~1#?9n)pzRkN0Lgdm#2IpLDWyIoD9Go)&e;RX}7f#)Vg<$G^z58bcGgl>tFR- z)~*?-Q@$W*2#0Rx47bnYD@}zMWwLwOjY=9f=BUQHk&GU!i1WPi5gWc@=$=g3P4#_b zbQLg9ki=0y%w2?sD)lP89FIC{6xZ!|H+%WDVcLh|5v$aVN;di~KL~Y>O^&e9D#Z8y z4-V~te9(Qy>+eL=+HniCl>YE=o2K-=h{NIu=xzvMq1DZJHVWXna`aTM_k4n#M9(kP zC$3GAk<=}@_X(M*{PEF9`PWPFX@=P}*(WKjJb!4GZ8PhHd7^(2S4M5qdKG1xS%eQH z0wPvulbHz9Ot98ppdB@==M?00d#x0F=TiX`q*PlE&UvT;3F2;;n#cwr%fT{cn2nLE z0ZQOJ>wiupG;ge*kq;&Mw$-#2E!~Mu|y?TwlP~eEh8N&VOfs*SN>JI4x1k zA0FtBzfUlLSta2mNX+iO&0$ErE)W>B&EXx4Vx zQ=ui@A!CAt3DT#|%2BZzZ1{}-=_PsBnZ+5fzKN0mJ-BWRff~KN7dFGqvaZ!MbMq{U z;iaQB^VJ$)KcQie^=ExH_0~@_v2M)z@p_5QJ5nk{<$HIiF`wiNzg(j3B87!~&KCj4 zBs5-=$@$Bh;j-$GvCDVGQjs{kTOodIyg{4^lk9Sa4 zADe@`N@*?s>;By5bMspk#90wNR=zDCv-)u~pz5NB$N1~KH0pSxhbG3@k3>9cik9OD z=0bnxkA~8SZvE2o4^aM$ppH!94})YaDXpaVI$h(!V{2{J=ift#>i+;t*J?}w-y!_C zoiF){d>>{ec+v`69vH@}f28MdF^UzCbUWX$*)lAuSPz;&G_j@=a0VqRL6vvdq?ak* zf83nuDj>WBrAy9Ly_CPe8J(Et)|R zUT&~{1aKpCzeSj0M~t!+O=Zy&`~v4`b^P;Tz>KPU8u*xcDJKmU#avQx6t=Q%BE|h``$}F!JvlB`X13I=`CgHdlyxS zU!JRc&Ef+&YXk10jlIi*4i|aTh6}fAplXE9oD|L>#iTnXaePCI_|`D+%yTORpQntsrEx%J|H2M-dwg zsnjw`PX5o8aR1;#^a(Mu6Q0lfCeq^6`TRXTU|S(ZQIJ4+xI1;iM4M|r z4~57s`-hDSu01^qYCoz-ai7SnM}1m5q#M8Tp0Cbz+nDq^a zCImr`gMPLfx@DCQS^Yy? z$s*mk6(Ntg9IpBK!W`FjEv`-=LZ4ayR};wnE>%DW_pr1i#ZD#p-vAOkjb2}S#L*KaN_Y9o2AVt!G~Xg2S#5qI?OCMXP=+0{KVYxZtuzP*^;Zm$7U=f z6SgV1{X>9*x!lIOmiH0P)WDN4WCIoZERPbs2GIf)tmLI9q4E7|Ioz6+OOu!R4NET_#yEuPm(qR9X(RYGUQo778#(o))y`1U z4K7y95n?^0U9$KiF7j6~f_;Yzv+H_L1jRa0w)6S zE7i!plfRzj_g|Te&L`ASB#LJ0m4f}BW@NuH2b2XEH&s_LPjbrXe9wkAY#98N%zT^0 zJ@Fy1wt><&of=;rw??`BjW*eRzAzw4LBp@FhTQ8e0y4d;!*%i>d(-z_X1_#Xg zZ7%EzfjJ#Mk5GVPY<&q);~Uk%q^vvD;gvnq3yMu-%Q%Qnu_Sef@W@jy%5^%&&F|o+ z=gU67+}!`vKmMB{qQ|B}D|m#`efGN%`gMN08pGusmk66_P&MIjKt@D_hx4t-YJ>!* z8&0(fX)-@9F`utVvtIZHA&!D^Ft-)wd8yX(0w(0#23MZ4u+cDKXX|3QYmql+KI2#b zm{Zw`WRgksxNV$Ir~wY?x^uEd+_K(a`;EH;?ZQ>nI8sqsCF0`5Cps_wCiV^vlcX4n z1^=SEdj$jw#~-c#NXbcNN^Rt5G?Yij2uK+^XH;yPk9=KI@V+_b>9x<(*ug{R4<6eh!|4{IHGb&ooG0qjZg1M zNV9AzHgiTE%t?Rwv2c}MX>k$-sG+2P4qBVKGhPH%gT8&)zgk8GfVANf)|&I-Iu198Us zaKG5VG}*KviqXKM7LowA>k-XX`B#&g5aQIo>PJc(CW~SefI~H<6}v3~(oaMOWdW%* zFZl>#1>dpGJkyqbZ?Q%9^7D3R12A-%T^a9%&0`_cG(n>)1OBEh7(d)u+k{Npt`MGd z$kCWp(;yBrGdm#^eyX#prZHS}gg%(JLYf~m`=7$?8dF2tZ&(S>>u)W*F5C_^$U9CO z2LjqJd2n&Rg48#%6+TezhYn4eY|zzQ+N(JViK~&2N>N9)zQ--dIu@TJw-Zd<`>m@y z$j|tvFRK5e^Yg5ggmAzNFB7s45cOq#i?Te!aQE4dbCUhqPNM>zNgiKQL#pB2T$=4^ zxh?a1s8PM52Ot(pKO|@qJZBNcBE9I^=9bJm{naDI$v8of&vf|kV`m6AsDlb%T0rU$Mwy+zbT%Un=Y1mw1%nr$OI>E^PlR5 z)uh8HVM%2Z7x&nNj`D<#2o%cEbpIYvRfFY}cjIxy4)qTb!68=B!Tf3NT+ovU00h*! z^##<)M5y`cI~$Nk&BtXB@w~U!>E+e6h$gU9`&T64b5VO1B2c;h&qsSqDXgzaJHm#q zCDVFJNwb5nryh)GLqCssRuDWE?8HoQqZ6jNm#9Xa8SZ}I=x7RX;JS?Gy1G@FJ&R(h zq`99A#ptXe!MDf_B8!m!ibsSu67_uE#((b|giEYM9D##FBoc8p6G8JU+-AsgJ45>k zMI@9zy3x){E0SI4mOE7QArtF0gM`-H)tIDsx_98Tb^4-|DJqATE%zA86I=e9_QT5* zvi?i!BW-9(!|vNJY5^dg4r?Btb7W}1iIhT53m(1zN;*h$8DJ|}$wpLC;aeXX-j*** z=$$*X5jaq67&O0(gQ~V)cY6jOcml?FZq#;?A?C^4c>X)N?E=O@E6U!>#DOWX(P92m zBVD}CNVToKdafC+9xE}On2-I;^q1Z@_b!H4freJp2p}LAr|mqby^}fcF(2VMK6?FV z|GwRrMZ@h2No+b~4jR|x-Rq2IeK^ca91klFqtnE4MK@HR{li%QgyZz4;8c<`8y@d$ zZ~^#({khE9i#qtp1@pm5`D3{BrTL3nq5M*-t53O_qgV};Kk%eYg7qd%v6nitBzjWdMZ_6Ph!1AFFc+2bm=;?%mTHA0p0T1D=qp8>|k zlb7U#?Obmr)5+-zYs3ZA35?PXfQlSVfO!;k8{3U#EX|7 zFg0WX_ullD_dzcp3Pyr@3BuPtA^@Tr8r_m~(ew-72VUMq8HBQO__*u(iM>0P&?Cyk zrkAgdMiYKxtz`2M$Z>LM#aH0v^+ifvJGouCD!ws3BgAUm#&uTW0g_5^UaqxSCaN8S zRj{&XUE%rh@IRoN#`-B!Q8kh<#p^zF;KO%h{d^bFA_wOiJ=@@-M9%cob1I5pMbi)x zVZ!xO9Q!?`R!`WHraI|MH|{Yix`UpOu$f?p{m=NW3Vf|Z;mmlw@vi}c6ErivfR#76 zXq8p#iF2!;9G?l-=SC7gCw?>xk(>Q#QhA%qzvurquNu9kL7-|MN|EA@<)0VZ-bvxmjbR85Q`7mi4Xp!1gX=`57 zR8PoBx7Pe|P-zhPQOw%F>;4lvn6CWp*4NqU?PDEi0=9t6RwhMSjhimn7USbY|AsU( z%rVk#!akm?8{f6z@`gole+u9Yh#CUJ`xfD)Yd|d-bVd!~0t6fbTw)%H?)ZNvR~t#H zW(<-(CWDt_7WWmN?`u^w+DAi~)>%l^#VQtR5vXwU0>pdzB zsEhth&Q^EdpgEc@*PF?!ZBLRa?#)ND@YekH;Gdh%40biRC)=nMeHjU3_y7(5Z%qe` z;KipZ+;>1Pqfx_EPRml1fSIUH^$nNBn_@fCCx0DucpmBd-^uXe{`u1YQ8>PnSmajT zxO2*QuLao@%T2*npoWx47>d+C>mV8|pW(OZqo0@kDrwB_Xg57YO=S8L2bc^>&)e_m zdfHuKhEK77XQ=h?8=w5&&|TmzrVr-)fD-b6tB#>(-!z_Q?cvp9{9Ipb2?5x9-LRb* zU8})I1~<#Ht+Y_|IcIc!A79Q5Bfl{H%;#PR-Sgvf#m*bLi!*u8I-$%izG&UbJFdSq`q z6{>QDL2rYL$o|YtTAMBbW};i;rWBr9r5{|qNfl4aG=6U|Z33+XOWv{PQTV?4@VxBm z!}`RGXK)d)(TpBx;PB8$ehcNDUzmT3^L~k=^m1wr9HGL~?~vl)Q+^Tz*AsxoKa~eHdsop<<>Z{bX}G zP#ljylV_R=4;L`0FNTeq}7T>`e(~Y`s=+AG0 zf1diwI{$FB{?%c_Jl2h(|3h~CDR&Ssu!bPaHgv0fA1-QebXIoDAf6nem`Aq%3yUB& z+IU9URjZ{oZ*CzBrk4YG_XgW1ZEXz98y!IRdjS|IqdrahSMj(3x`W{l;6(R0YE+PP z$gf~XPAI2*8MPIFmO2+RVMN29PYZ;|ACOSVsYSU8B zN-H@ja|>vTK6zI>>v5}}uZWy%bNlU~o{#K*BYe7meEnbOKFsP6yjQZ=EVc?SGqYce zPTVfE7NUVvvus7nD;>XVUTQD>r4izH@}smE*Gw~o3i6Ci++K4LW)1YIrsyJ;B#mMv z=IfVBE#n4r!)*@^>e-V}f=~qlRKJQd#+>#q0=)IX3m)?xO@E9piT=EI-7Farr&>&c zQJ27iyBM!LJ7|Mj2i6s1w&8n?C;~*P9d{(ZtYx^=Hyf0HTn>tsX^VkvEBdo0b{t`R zxCLDT_9-$sh-25OV$@m6(Q~ z{kcOcx(du}7u&-|%0C*vFg~rW1n~pX{azaMkv*7I(#|scB%({VTKSn_ct4T7*%kVT zvO+-CREuc(XPSzomfF`13In6Za{?7C(R2Q3q zsybSbw1jHqWWpZsdf!C8_@qaYd$vgk@n(pv?o2?p`q)_iJ&fi~5pgK^!bI&$HAx|W zD#_-EGWo~2>KOyUwTId`!8~6)YR-Stof3gVNxTjDOS1~P|jE!-y*Mp}GjTmKfKDbVi|A~S*s)=!S zh7SJV9jx-X+;b7~PkZIz@cCEe(a+l_#D6YS0#zVPm!V!dcz1-+AnI<`&4<#guC^c@ z2#5+&EB(OuttthMlB32#y>#sVc>S5ZJlaAX3JMPTi})BD;Y6{=cx}O6GLv89WaRCG zuTs4sjS`8A9sGr3w@~;GJGd*swji4K-^L~6fVtr6Nk}Rk<6IMyJRYfcM4|!XK>Q~! zudKEd{0dTvdv=kTo!cWl*c8=zI<`EaXfV$81dlZT@^)g-;oyg7^z;9R&Ej{}eB zhv071s9-u3+i<5{o(a?LhnNjw!{KO^=k)z=fmzq-D%&x1KjfuN^qI?Jvvv#__X~`^ z{ut(sqFrQQuMku=q|(-a)uEVMKYUYAE7iStS3u=UhQciWqAsL6zjzEBgI51brL?a5 z5Ntl5K%1cHeha{Fmao8IE;s90@9@usLJEC1veTWo@yw-q>*)Jqg&$`J~ON&cCY7a+iJKh-bA$aLn!pHd#&xC(d_ z@A6e{=anUHQ>_RUMFLiDwVX6vf(J{!O*O@8dp|HV12%@VxZ-kx%#@3~{-+T}QuNIn2N)OOG=YP@f7|zu&nrErwn6 z|ILqP1+;3pP4=TpI#3pLn>W;zpq$YR+}2y+iANLG%ZaNvihfp#%hHuu8?wyF%qe72CJhgnOSaeaMzEPAzCLrLXqPirruKllIYJj`UecwI2NFC zFrNh&YX8jy-ck5jHigu}&V@!ZczEwJ9uuJXg%kjjXkb~GUf#b^WxDSI18g#{2$f5t zHCb9RMgsmeD=Q8m;O1Mi1=d4g>-C8s+RM0|{(#`4I<4Ig3vcwJf0MloITeLF%O)1Q zWq{Lt$GYsC{8}qoI`g&_<%ezpih5vG5$+WP#f$F#vDgQcpmbY zJ7SW6ddp!+J)YY7d@>an{hoq_W|EKB!$MGn%J1J5pd20IlZ>>-itFPqx;@8{y&omY z_*%#lsPVn#*HpnLy8Ip5OG2OL^QInFi2?%C>8`kF^ck&nYOsDOtMS zs*;L@pm`1QN&R68@W@s{86gG{(lJ~+;4dz5T}RhmI(93);C{l{@3E0AZv<*NMV)l(g;$uP&31?ngIesJHBg8g zXQfi&jkXu}OT%P9OS_b4ab$PYZt+p(FY#YC5nr)^heZ3pOdAr!r@PqfQfXm9&XT;h zf(N*?uL{-ko?)-wRvz>3yutu29S%?HH^)EM@TreZyABVX$%M}W-(mn%+tq2oa8Q8a zvfN^tPkJyeQ~c6Jm}X^K@otWOv+c2`PQ!!T=Y{f-+*?fYa~Ac^g#V$x2fnJ9NmuMsB` zcZIbCpCTmO-yk={AV+cQ6TupaojVI@brnn5e(Gy`zC6nZPw-3y(QVFGKggYT{Ru|n z=}OJFFT(trH4J29<$~o*1tlM-E3N##6!XbC3H}v%8Z1(Ewx=43=vKl&9a?h2Vf3Fs zO|=5vJ$x?WaJJuYvX#2fJ|Qq6BD^f}v)x(NuL^VX(R!~cNVu0Pz%mbqE8dNo@Z8|0 zJ7(g!u*<3^l#%Q%jP+sZE^*G(RhKbd_=_SClTY4f%c!2^Zm3`Rwj&dn=sxGN=f@)# zE|XfOGm2=kjOonE9DxAEw1WtUK}T4@kZJa@fS80mE_=^ymLj~eRV#so|yv$MZn0wxrkekoLNw=vCk z5<*`ZD1J7atxHh2fhTxNNn4%>0g9#iu%KWzOL0k-Er#ktN8?yB?xg7K?B_o&!wb`Y zjg5@zio!LLg4qVI^AO_ziedvouvyEz?%yeH`Gv7&JmL)~3)Msb4gncN4u z9B;_=!9v*RgB#g~88Q03$@i0Siq&`iCpmc6(G0SrN7+Mc{YPm?IDXmb6bAHIm=V`oF*$3r3q$Wt7OFmwGs)NJ z{t3`eV8(|0wDj72^(f}<`m}8I0Z$71H>C!42`mlm^BK!#h$|a+Tbd_q?f5Iz_e0=d z_pe9fqj?ES*Vi1TljQHLDd|qGPwS6Yw9%0i59@(C`Z52b>8c;1?7HB>(w)*JB}jKK z9nuYw(kUqoyMTa%lG5EJNK1osHwY>%-Mz5!@&54r3(tA(+&gp5oXP)XueSJxVLnk~ zHI2+9C(LVWc7B*|rkK{7Q0!)}$-|O=vNz>#BF-Li$#&#GQ0{7mH8gTJ+jO1G>uT zuIarLwW@6mD*vxMF$6MU!yTS;_S%1f$A&U=QiTB~6pU5QwMT4pS(kRG2RP9dYnk69 zsx7&#GQq}Lyb9BAQnIc>(fjVto1VRbO;SP8T-}|I1bDRMu~Dj2_~A{t#M8lV!x274 zZ9^oty-k`EQZN19xf!#W3EX_kUdv!<1OHetPOMv~Sk@jD-pT#wkk5*2vk?BWj&R3K z0mnBWc&ZRS&KunnwOH4LU*SK4%H5_@?17V@puMIh2IHTR8W|5=)2hLN8k{1q(an9j zsUi(e?MKX1Sv_c~bH&1R^#WaO6#bEs3+~x=i?Ar!-D!V=*8Ev~1~_b4N5_el6Un;Y z7dUE_)Wm#MOng-!?lEaQ`!ISzigj@ld+siO3Q7O-Q^}`~VfWyfGjEnu>wn4yWC)>X zt|Qz1WZy=vzYl^|Y9#Q*CU^tsBAE7kaM=C=@qsIZg8XooSNhJ<0~W}@3H?XIo9Jem z4|^V96vuyMlf4(Am4LE$62F2YZnmFJ4Kx|l9poJvVi=m+?$>>05FVk&P;8V^M<9Tw z^Wcx5-}T{MtQAIifd+tCGx3PJbGdPm*Ea^F5b|ABg*-fiuqNO8g}86ab>_j>4MK*X zFICieW|DNfKL!StPGEjrlaa}P#rEDpEvmp!ysvYIYDez@pDsOEn?{T#PCq8}V)WR( z?stR&`(}K8PJ+Z?Wny4V5o8}Ma(CnV8mNbjL+AxmZm-va_Vv?gk2S@&{E|t~U|CbA z%-VcONkL3)Sp2lXC9{o9#a0+zlHw{WHJZbA9v?DI?t2Neb{aPDAwDW1naB8^)Hxge zZZ=kb-EY+yPYQwS=$oKZS)Z9-VDgW}Ba;neyC6)ACRAde70`3~sj*67_*Vm)Y#x{G zo1OBa#2$OAE+{(?3yYvoQvipRXmO4qgb9ik@&IR8BBuyJ-F7SWR_;-o!{N7r_yACe z0R4zck^~%|ktoZNt0mj2U0&Xa6u^?ss*X3)G2a0WpZ;-0;5^En)ou7J!%dj_n!I=U zJZ-LoXQDl8&;!0V3K!=Crmf4N~HmjJ~r%h%g?iUfQ zbgQb67e}Z!FP*;oVyH*v2@oD~6sx(trTtZjYg`8Y)--`CFk$%vL3Cxceu zDAqnBw$ec~=C0`~^G?rszI-bvj#%LqBMEVHR&nWG6rhX*=Lt>das{h-M zTzGxKZVUv<9@E|a|I*?YkPENFClnd%&FCzo`T*i!P#ifDD+_Yps`7?G1u8b zLemIHe2SWV610Eecnb>H)8|!7TpNH&&M|&}0}8$`DV<3{zKkK|5xBmuL>Xn2H$-mU z621!^Y97PPSa=w|`SE2j^$!On#qdhWiUMxAr4uf*HYHjDn|t$445&@GEU?`}oYD#q95Y@c-psEl| zo2+*#l_Z84zaOzW%b@ z1iU}xz{*73M^v#?;Y}8t4fr9)M2=@jeXO<{xv_-Z)2n5G4S!tN{s$0i^*7tS&_P z0e{8oCpQ|DAx)%>FMF~HEkySK+B(B~*2fL#TFvxwd>%d+bI}fF`q}SiQg%u*^~umw z6_xa?XJb5mlUgxjd0He;eo{j5Aub0!{=?)p?_A(Z?6T^8k9ezE5)u5)3ieHxAUjt6x!I%SCNNekBNMr*^DvrUP6@8 z@ygtvRQ67EB;+iO^Ny~QOLysWwyO$Ij7*}Eukj| zbC@F~a}#TqVp%9AxSNa7Zv~K7I((ZS>f*jP9F0(~bjyT7d>Fwrl*PIEMY5 z<@!Av>zh8efmKF$HF>yrBYN8im$TdE750r_*NLyFrdNPp9|IN{8k?c|4Q%E;>wHMX z>YZ~d$yTibsqz%$j|LHBo0W8Vo26u|!xLr8$Yg;#a)%3A-_q=Qo_QCYji5OD;_{rV z0M1=REWX-1uASQOw-*K-+s|kiXR1}`f$gr68+cg;J!F7;3|8S#M-L==CawezzZ)e; z6*;IC1+=DUe0sP1o*jx!f^|ThfEd;^JbUeKd>@65kiA}*$)#Uy6Ut5?!E#Em>JxGT zmdB^*#5Unah|A_V#L5^zAZ+Y#S~StR3A+%tA=ax<2*8Q)EsE3 zjAF0z|0WBOw<^H#A`L?PqWNj;rsRW9sW*3m@;vQ+gX6z*@wZwWyZga}J|%~2@DBV$ zp^Gn8o8aYye{X?(RTK}{>w|&3PCoJ>b0Pg_E~MINWG1i%!psfUl0IkaVQn@b(fcK({~;)Y*xL(M;L2mBc^RFM>P z8I2>7&TLB9VX-u0@-1VwVsN{GW2c9sKpoUXWO@b-F`r$n!KXAGf_N;M- z?!H~~vbhUCl$@?9paZCoW%UL;VYVQZT$_)(24NN&w5hD%>3H5Fm)om-JTMNL?CCUc zSE-WBCtU1SlY$s9cyGN=G1j|?#sz^6yawVECTx@frvbkfu>t%Vi*P1-P=awrDC$+C zOPA4t&zQT`UBlz>=2~66y|m33;A4oEFBwGV4xKWwatcs5)}zp5O_J&3U6^(`uZH(S z<~Qa>7rO{-pBRm0q;GcEhClHhy2BeHvVIRghkmN%Jcgyep&8+f;FgMC73mJxIB z?PRQaomwNjjms8iY&{#oV1yUkl5u)C(@lT#=<70EPlGF6`x{z8ih_`vv@N93R;hQvGx~f;wp3a>*w(p6B3(ry&0fLgl9V9Q-%7H) z&0KO?gZT+psA^Oz4z8Vrh}dP&gPlnyW+8c~mBzriHBoElIO^eoqT zwY;*mE>=cDeauAF=@pY`VD zQ7ETMH^EJ`>}Wuv_dbnBPubdiFZ{}iKxQRN>bX2;p_|Fi7>N7jJp%SYv^!ZD1xdCPZ9C>;^V-T&0jtq+?8&8%;@V7uhE zKE6{u_6U1b&pY_RDooU~`p`ki=s=B`A%`&5%EYTfc)^-pnD>R+yms&N!ogpUhF5I>zzwm3fa&(Xmh}dVKGxV? z^|7l))9_=U9ntI_i}GL(YLu^2ckyF91_T00X4H)Lvtycupd@|Hn_}tc7G}-XUGBIM zeU)Re4nEEoJ1>BpDKG8{tfW>+;a|b<(o23Ejhsqeq>NW=;~o{S$3Lbk=&n@ZN`ZQy4|tL`7U_{#+v|a?e7Do zRwkj1#WkkiI&gI$bPMq5q2{ z4BKzpI~7wxRdnn#Dna={gcHsYU#)-Kw7A9Ok;v*AU{SSAq9Q)4$5W)pVMu+f!qyQOtbM{zS=bJEuz5!RgN++ZE(s+Fc*EF3@amN4CMvv*a4H7z({&L$3db zfHGKAfXqPonZ)V{9)9Fz%ig*7R4^vGE(xHJ@|+n+ zUim0V_%7_=Q2Sy1H~N$<0rrdBOq51m*%4tBfosBhx2DKe&$9 zFbSDs$&Je}sy0v17EG74a4Z7tclz<)8aqCx4Epsifm+qYgN&rhqO3Xo-Is-yudMUZ zojQS`Ou0=Yv%lJf-Fi?h@v2TlmF&23)IW_2G@4LJ$`}w0>T`+l=N%T5_wK)+a=2dA zKKrqA7REkv)?f>`xXQ5bDVGemy4V_cy087#6C{+c2q2Pr-w;9l24`}&CI;_2g6HX* z*kgQHY^(HfUAp_5OIFV)v3To3I~Q_0o1XKMumAq6nWI@8xYx=Hqf8Yuq{4K*Xr7k{ z5JUzj&FN$leS8{QK8lilp&c0;MxChsQ?1e}2?iQY0s9^KY@R-+dnr;%*C2+_X3IT$ zbymRs)`)%9y= zTv6x!OA7(Hhz`B0m|JT)WL!HJHY=&y9SS4_uw@y3slqs08XV)Lf*(0E6lsG#%r zoDHu}tILJJ!(MTnC!$G6c)v@?4&=NeJs1wqVAj_jB#y!gUwt{HWKUipg@O+sp6c9z zBVcz1l7;y8<2n4$A*tze2JqIxCE`3_1QX5f!Q{;kUFwt-^bC@^tG%Q3!+PkIW3x2iS%*o z=wxcXmXAAgBlMm7U+Y5*g;5!4H(+ZS(P0uL|M4y8enF9UpC{K|ljQHYeB&5Z$Q%n4 zb<$f4P|$?BW{|8wAE%^$EizHb0M?7%t?G4upzm9b&IEHSVo-kNI$^TbeX6VGaO~nnudeH=exa6T;gZ{pWa{d>p? zl|*&54PB$d5iz9oK)CG$qUB>$ zM?Pg9GB*Q}Q#6FOCOtgaex?SX* z>-fknq6PTHd6JZ+y`fV0DznN+jv*k0a&=JmK#+4WL}4g$ti$+9Q6Kn|>st8!jDyk@ z3$sxE^iT1(#(M9(cH^i}LI5z(s5+A1LO!h~bZ&anWW{6UsYnztB+Rb;ej^ZpK4XO; zEA!u-*0UcjxE>q2Z*kFt%iDF}&q~5525iOWj%Z%09Pf0TrcNfH&=0s zTRSc4q@H0jDo`F2+hMjGLda)FbX~JZ0&wn%7J2B&b|t2tJuWvL=DQGw@^lxS9}-9< z6rtm=*!G(uk}i)oR+z7?C>Yr$!O3;ONc9n4GY5n`W#dTp1RlrYnW=>uJu-NP&U6oy zuPAyxy8PY6vZCSe&;x}W@uLUitjg$!i06FdsW`vQ?tgxqNU6b%#%Inu?am8$Yh#eb zSl0_6I zA;@efLV@2axMz1CZvMtuSn)gcFE$(uLH~C<6mpzW$zoLfXNA0uqWPm`F)}<<%WawB zlvlk*13t|wes{isOtpf+9MxyUpJxzI`o=58KR5aL(S|+SI?#4y#sQ45D17o%H=)cx zG|Y_wxBI1u&+pjb{(cjI4`~^>!11Nd7C| z#`!CqIlAaA4u;s!nE)0f*dV{9dJfRxm`Q^AywIIp_j)A@36|*K(fU=Q;i>-~tioWu zM;JVR-SjjGGoz?^iroeGb3SVuUvKeUz&0_UREd@Nksc?&-Z)HmTg4rsvftf448`3k zV9h~DN#62b7tEO6YKt#}R-vn7Gs90cgXhoLmSa3UJ(d$M5;I zha&Fz{M}$nTj&UzD^^FX`0Uiyw{c3{cK#~X1$CNf3l=co%!-TWg%gg9>Znw!+GUp* zLz=#dBi}%F-tdQ;e9^Pm&Y^*&Zd<;_DD`q9fx|eUHTEmWR`8GM^|~19;QOjSJ=-i}bJXco zIhZw4BJ1hlD(6D0unvl}7Xv0MbFuB^KYY&HT^-WA*9mFGE*21}x$yr~!Qy(Vkq~)!+)sHSJSlZg4fw*FU;MLw zNen10>+ycroq4P2Zd4Z63+^cZ!xC+ zmuo@|!I10l4D=SH*v5*fva0xw)u&r4uVz z6TyXyM+7cDGIczd3$9=ULPJqLBCNOmy?>7f$ee3hvvP+Yo%la;B5h;>t@_O`?Zj-N zxACtXJvp%>LQqlh8oRWazNYE_Q(gklx)FS8hvnq{6jd?aJ?nb}ESdX$Q+*d;p#%D1 zz!4yajg}C>E6*b!g33@F;6^e9ld7=YE12K@+%`%M*nkh0Vn3Xm=J1~s#mbME|_}F9g0ZZSEWtgE1p@b^6USd6$5pe1t`>)U2xs#oB-{&JQ`J~DtXK>X| zlZorsMZpv92>5vtcBi-20}r{iZJ){q%Jc=pi3;um4y%~o)tQDtJN$SNo*e_(V#uHI zVP1$R3Vc84bpd?v%27h$zY~||Ul2$ti-qw6+WM^`d+tCU1+bI$A|QDJScB0=uKtr= zxcv0>6JFxrTR|ExBkiLgZo@Nin121&qOhBu*YxsPuAg0Y)ghZJXlU>}FAriw3!cVT zLY-o?N>k22pazjb?XgmD;C8jn3}x-r?h5Nz43wp7F9E!g$_;+3!_Cl!D2< zWPe&F6$Yu6e~``-}zsZ=ZQs@}&)uzW-%@9k zR-OajK+yXP%aE0X%s)op?0T~^d! z8T|WO9q-D)_sZw6GhA>&M(h|tj=$@XJf#~=KMA)B9$6~|$&bK^!Es~+4uV1TO@3v$nrq62PA$yEv=$UkBa$?(aeusHypI&Aoi5K3*M#|5h3r_6{w3~U0eTq`0g8)uM-$sN1gavy{ zJ)+zzor0jc5D4ppZxR}zg)J^LO}218sS8d{ixJ=YX4ooB6KK|)*mZnA3-w)!3;U9a z5VJ$ru^^SwVIZr&}z zW*+&6f&g+fcTNGEEHFeQLxV4`+9o$tFnfpO4H0D-VC|!sqYp;BBmh)N!X8S*OMYBI zcddmu`ILLVbCeD56GMhO$BZ2zNdcPCrsnlE`$_7E2SatWrThWxoZaJ$wfB@SgHUL^ z$~@m(oS>6Tp%&uUrfTN6CZL^ee>^{pEl(>3cF=Oa%;(c;!QJYx>UGu*fye(A#Bz#Y zvySS3`uRTZK;R7(z`-!uIF9ui^jCRU7>KfUL? z7R8qoYx?xkd*b)So@)TWBg^sIlqJ|aua1dTf!=HzeMiWo&d&}|;WkG?gU(|B04 z;c!4{VXt^v6PgW?^PGV4^wChRqN;ID5Z3jG{pqXB%8=fZ>>`GbUoOi}N{;PEwB#W7 zem-0G-9E3StK2EtoA>d5fmXQn?T?8kY69b< zj6IWZ?>q$x0uknK5F|UidSC}c{^CGE2nwKYuHG7fHaMb@&y1qRqL)q3#dmAtCoMUZ zjH5?O*VlX7uImzzk8}J&wndB^_%Rwq^N!#K8of=1r9E8TvrC#}q_I!2Yqqrg5gIo% z9C65APGI@fD}I0S!v%{wpFO^gQ`?7|yA}44z8Nr5F^&L>DQ1e3TLA0f!3r$!DAaY> zdXH*LJ0$$iJ6jK%*ezEkQh}T0J&wKDHkoPicV}#|1MEfVs%1;(13b1X{=Kl3&ejS| zrys|{I6|eDlmJTQm@+*h6x<;HnvLQ+_d^^RUrS9N$UGQns(6h3=oaXO78Md$u4j(TM zmY@+RfJb4-%q+0ZlOy%~zd-C1WKMm)T~%Tk!uDd3j||h1LneVz0S+eTA$yz8zC1iS)6s``wB`E`;;Db2oPBiSn$MlX{CO!+Lj%8kxf{As57r6V8RP5u{J$;X{CU0TP>=i-S4oecWScb1H3{SnR6N)#@c z6PMGZm;%V*CZRxh_1a?fQ-}=%jRfZ)A4O!E>Ji&>kpnt9iy6Yti!RhnG@18~i=1Wt z9#Z7kCEn&A$%l4okTNC;ThEAoyLqJ*J|q3csUmzBf5HDk=5KTsQuJ9u21$5pbit`` zy)EF3(2bxe#gu7JYV&1$bcvkmC*hay`j0r^r{U%fNBL)yhTao!YRLgW06; zp!W4eO1+}ZQxc;M z67?JSx;1ymr*>I7qzMQVH@-oOZvOrfEASY3(OWEb3zp!MOB6^XgE(H^2N`&ujan$Vg9~o=4uX*O#9b5=Ra0yl)l!@G^gc~1)jM&La3W! zSc~v_0SODqXSjP{HUcAL23|-N4loK-K(?<>dnD`;k3tN-emvmHO~` zBZLCc(-4-6xKJgywH@1F?F{(wJI1O98-Cx0V zUwFMktl^K*UJUiBGcr1%Qnx9`L&pN9D|)VCf6bV!!}4K^sVAg`RKUPwiN7Y&uqKF~k%8m1YNyp5#m6h9! z4RQhP=I7G#{ph=bT7YPxV7Qv-2V#PKw+Al;N14J}Z1~IhCVSRpw7e+%7^fm1C05!qvYFZJiFb?+GUY%QLl3oWE+UN6u3k`K=gw@8!Vbi z4qy(yrV`m@ysnV{i#|9cY1}RTp5(e|i^Y={**51OXug3lDx}{gRKIt^)5CgEmX(lqOTS?_sue% z(*Z<=N`usl>R8=OacUEJ%r^r*--T9Kd?2Li-OIqFzoc;Cj^-8IxEX@($!r=T0P29F zAPT?O)+f|@fhbBv5AL7M8BwIYz?R39!uiH|{_eC~QooC9{BoDUcohTeF(oR^MEnD+eI zl+y4uh;_E;8SApx?V}|c2vQhVS9GfZepSnGQOkV1#o=~noqW#r#@$1HyCuEBoS`M% zo2g^B$Ui5v5-l>TqsCo0^){efP|{MP$pT{lO1wy2VTs0i*sGp42FD|=5~dVy|EOez zBtmU%7*GH@Unr!Z6q!SWEXe8%P$g_^4c5IP77TYgg_YeoR4t;d0Y4xX74@ZM@#m>K zzEus2bRRad^)>Cw05TuUFi_C$alUb1Y0?fermIWVCo(E_POH6;mradDR1;NMLw=v9 ztbm(TsUe#h)VZ*TO@0#3HftH)9cI@x|84V-V^@Ebj+=j2s1A!5M6+l_{}HqUK`W>t z9#hD`xAWvBo-i`;g7C^3&--?B{X(yc6Xm;RdAw@7$^f%p=Vijyf0W1BKb)`_!}c!T z27hkP{|-|6+JNy2B`D2iKm4-uglO$k2BIwz%zL=^RpYSGY> zUypPdR$)U`lELZ!k-d?Ekh3ES1`CkaQ+@C8U;b&4k3bCeJUa|ZrC^KV1D5vgz^&p4 zv(TGOL4NIeC%~%$T(2o7g%1~IZqcF`wLk?VPK1Q)h}Lo6=Tjy51&5lRfrC;f%AP2K z$I$RXFz2L1TH$0bE@ zyQ&+MmzyO&z}RPxFRM_Z%Xp;;(`Z-Z)1(u=HZS`k#d4v0?sc0k2lHZy>)^0O?A_cTnYcem-*FWGo3D$Mh0$^GqC0D-I2sU6%Eh*;UaP{?Avp1ofT)*!ah#bAwC>PeS%#S+u$r=8E2^gWm*Y-?>zH}~=T zj|xukbU(D8Y?jc_u+uyLzKh$%{7#bRYhKq+Zx~51|FPX$=2u;&h)fK!z3U=H5y%K2 zO}DF?8vN;a>6jFQllqZCCr7rraf1UX>g<}8MB#p0`oV4!l^~sCOmzlmV}*#D>|1*{ zo-CLduo^dxdT*E2%ltUquyccyYSO|@hxt4YNozdKejp9ni671iT&wlp+AU>qA#oZ7 z*P=TqzcqfzwzH~LjV#5O)>FasLguYqD{Y^v_Big*Q;F~)2$r6{288)unSEcJaY5Ej z=~Pis%EZdoTp;#QWLYaxed4KvB?@G~UN7)GYv}uU+Xh@C?`2y z6Xf(ku45Q4CEYRn0z*|RO;#@bp|jS3;v3|Q?r(L+Yq4TRJHj;KP4DsNW(K8E+S9S= z)s$9oPsvJe2zL+iNV{#Dno@JQ(%pZ-hFZ2SSB64PRzY+friFgyhC6dCCh=PSlTQIM z;FmbO#4&~;O+%XR`mI7bRK1w}MaRd(eJa518zoV~pNKLFbWdlpe!g*j?=*u`d8l@xa20&njYo9WH$D{P4PCVn6m4go}ai?q<-C1H5KMqUPdXoR>}IUlb3Zyu>H1)R?4!+isI&Ub!vD z26a1kN!6r1{L6l9zxcujpQL;Nz#4o^kFRM@RQ+kTNRNd!PsD=zdJ0wXA+vPWZI3e%A zixHNnI|-dzLB>x$8y7uey-(f);&Yrjt^G|_*l*hVr3&F6_h0zP_ZVi#t9XP2j&on! z78J1bim8=c^0*k^&)NjNbU{UI*MMKFY~g!^RJdVimyn6}W2Idx@Ax`l3$bt!*GzQX ztk42Y?@!u?=#|Q6=*akFlL=(A(r8AcI->)+>yR7a9ag|!4s>rlW&cD)s z{eyDNP~K8zG)10)w;|XSdNMZ>76ALz@F-nS@vLE6cXY#Z?`~%M6+m5&M>S!u4KZow zoIZSATe8EraCfZ%{(SeMbA`1~_4gaZ#}v(;MFkp4)F_Q!-;e?N(Fk-RS%b>&o67&L zY)f4!Qp**%ATW;B-pXe~(O?M(w0 zv|{l)i;JB$L)ZJL_d#LQaahpT6G@Ji z8fr)s8K&M-w=UHGq1y$0)>PLWF@7Vdajc%89ssWf7H0iJ$#w7x?{|ti|73Ur8FS72 z^t+2PMATj{&v-=o?%USB_bSuUKL4i-p+L)3k^CG>uI3Spj35#Ga5YGa3|(y`!5vHW z#Y8A!RQTxD`fK-)VJb#(qUc2=ol;Z(=ap}YZ!V@JD~Qn&*jt3_)cOv`CKT3#EBLIOKbsCs-GOrTaMpLLG6Un(M7!Ok=2U|k$=sIZvat| zGlOIk9HLCx5{Jtg9SGCy2J{+Ku(Wwdq(u7>Px`(_l;Fg%^N@87W#g4%Ba zXYQVv#`lAC?O*jlv|^qYk{+?>qHC1ceB;xQsQ`_zMQVHiFP~fytL^j}O0ngl8iCN5 zUd&Dv=hfK&iv$bxzm9*c#6uCskjhFe{{zK1w&Z*r*4vs%$lQ16)(cFEyS`Xe2Ghq^ zSzura`07ae_f9AI-ucIaz{kxA4I80M!tBjrGD6& z9chYV&msDQc+AY-j7_`VY<^x@KDTVWzf*8G71Q6FQhz-y-k`(sthB0fJmv!IMO&t1 zvb7UceERl#?<$DD_uQ3R&71-$E7ArlE3jWBlEmZj*EO>6ap4Z(0w?i^QBWaF3xGch ze&Og$6;qAcsm4rW5QB64*-LXboW_^bV+^j!eb21Jn06?Ds>pTIoQ!Oo>8-b?|Fg{5 zaDKYp{UlT;7W`kUA)cpqSNtp&*>E4W)_ht@*TB%nDO|%r-N%OhGLnm~OLU$Kw}Uac zNraK?)nS)_e@r>R^3xY@FqWmL*Kti@e*NoAUx0YUw`w>lxY#d=P} ziBx7D4E54Jc1?O>d7BfRn`Mf10 zr@2Qd9fTTfih}yjakq1?DeIueF9w^Fcek2rFDXALxi#>lJ0?dgSTg-KGti|w0(L~@ zdEBJTH@zPDm3(x+RYomR^NWVFw_f5a_*0ki&qwc7kAAr$6D}K_N8`<|drB@YzvhAg zdG)aIe!{X68mm^4bL8Jn6tw33S+`*6JvzihFWltMN`3p`%D0X@L8?a)S6(SG%%5nY zb#>SW+V9S3$WSi^gY-?ntmnJ=V1P0nndrTQ4#7w^b2Tkra8X;;sTLy(t`7CI>HN#5 zzGbhRg7DwGohm;Vxa5xUUnWMH7Li}$lAC!-J`J&Z)of*-$E*v^XN82ap;ovtcOq^B2|j~9N`7^TVR*@7$q_^;b{{GkqHd33CG#Blb4O z5hE1sqGw5!LD07^#4ZF%Ux-tGHdXtf7*EQkBV|+Zm!I#zgpti<6&k9Db5~=G@@YFU z+Q(fv@a^Zsp_Zp=nvMKD$i1va!5`;U^Fu*ErZ*Dj+}2ai@s09pM~Lj{)&+(&4x>E+ z3*f?rp@Z9(Z4*!_R9xzs(zK+&5U0w0oBVVA1ucYu#3@0z0&pm)8MvO>y{?6d!?(5$ zzu!QXT-w2M)8^rZ|B(i(&**vUUYlEy8y#116CRpT;lsp$kLIUMMEFFhs4csHyDFwr zC9VKiX*7)2j(d48OpXmKvX(0-hU+XVanMv3bq>wBZ}|Ecqh{0M7bVQ8GOgy&X8Rnf z=vvDDkfJ>!;ZS368i7RPAKZN^<4QQ`wRSzo1SE%)sfI836ep2dg0AAogZ`2`2ePr9 zE{@fE@t1lCX)!XsSr`9TX9t+fKgiSHV<6DtR1179TC3aFbwKMEF=mDf8A<1e>bNv~7WV*r@E!~sTcW<~WI@#yk7h2+z{99$=FeBbSCgo0zq z)V$)#LLiB}%-%iUz7-$x5JE2;|FI>|uQeR*^HRuEll~_l3sx-ths2fdn!HcDk4ce> z&$Dka;@}&-DpTt!h|!HZ{#ULM^pFw55cVM1>3>eu@hsJz{6X^^ z@^MFHTw62g?S2P>WRf{WDZ9GP;mt-#{C1DSxRA;ra8x$bjL06_<242Y97WnIUnxmP zak^U)D&?Vg74Aggr|7*i<2IHo=aB~)pTefU*c)HywdZ$^?DkuCn}@h$i@0z1y)W)MpZV)Ybi^vd2J) z)awLkn8c7810=E(-=ugM*QyEj61>l5tt^&`wjfiMop?Ra0Mc@J&}cRVTI(6w<$x>b z;rzNf87IhoP#^z;i^*wy4?Wtsc&?B+X`O{#lUb^0F90QMATk?N5*_j6f-%FVZq38R z)p!5SJ*rs0hyevHK>+JO0L#fgPv!cQd5(Sa^~R$KoBKSIyfyCt2rPH3M;)?Ht}o(UXTPNao?aW!9Qb|-BC z^b_-`04II40K5)>@p<+ffPqM|lDr-28}ZNO)$IBvpDEmvzd9@eshY8Jf0AinbZi2A z3-7(Frsv0t-c?2IF?v8zNxYqJn+-DICf33_RK#Ek_MTi&aRK6yn zOi&e!f|*ytu=`{k-Jupk?TLa=ZX8FDjRRo{FNJ--FiQ$Q%1%8BU~^@7_$~d3BKk@V z@WrIS8$-Jn)mkDa=$Pf0Y(LZFlz~jm%E71a5}5#pdUPn;e>1XrGs6VLJnXc~y*&P9 znJ_1^6^ApoHfJy`#m^;|S+@@CO4tJ&fK1r%WhKz%$FkDbLB6LJph{a{c(L?9oZu7&`=}kLPZpt-O%pQ`K>w1 zSZF8X2o*=Y8cck(r2-#1Q^$N}B>jUC##F8=Q4H=P^eJEEK8zJ)9~ zVH|k7LtcgM4^_ClOjll9HpY4F5XBcVNf5@b-A=^C`%fp?n!i$K7V@!pbhBJ`Wfa;{ zq7sa$e7;)iK^!D?a+j}MjBJsKI;FXL5vu~!BayuEB0%;^hD9L$>Z@HPMrf7{3g^-+ zA&kF79k#6w^wM=2jPX`n;;*3nceeKSBFdY1s<$jKsD4(8$HZch4%O2HF^^TbGcTrCnz&g2C%{A&Ga2)v| z#i|xGw49F1_?a(m0)=x*zMGx1oGaL6Q=tvk`5yhEIECi9IOk^Qe$HfU`{3~D zb1EfxPxI%)YeFkjJ`B8|&kItpsL*h;Sv0#b@ee}pce2B#)Qy=x!4bTXY@1@ASEh^R z4p6h-ODpU;-n5*v`ShtPlh815C)irc31&$^&vJ-HtP086Ek&~szJs#!*`219L<3j zn?;g@^Z^f5;i&~HJEmeN^b)V((g7E}GjmIyDc6~6$5t0ZkUwC*x7|()y=eerU$3~q%g3tHL*p0a#U>uhyua;N=%XzE75tN zR;DwFnO!xQf{ds;$LEVDgsX6s$p3>Fjg=b`?*?2NJIajxWr#A;G z?Q1=hQF&SWY0RmJ%&aZ<{x~MlzkIuql z7!Z5MR^S~lDN3JM4$86-D|MfvAY|VO(q)~{ohYqD{LNu|L?ef#XEFM)$dQjfawhb; zF<{9}w(n`6J@5Ye9jz1o5Bzm5&ad0)=4@M?;r9WkCxN9i>NNBn^{?RM3DvS>8A-p!U?D?V1kcLNRWzW48Z0a+aG+}bvF<70N z_nR|Q)UvwoyAChe=Iky|zL-}Mi|`iVh@XA_i$hT^!BH4oVJb@Fv(ts_KqKiiCt^p5 z+)blt!Vt+K9;byU5^6{bApb-!NPS|fZBv|(U>On&s_0XWZk_urys3f;nGt7aWF*TA z8ftm%^%=?dh=xYwN&k5*-nsSG01aiMM;eOO_3*W~oOHN({P?XW{h_Ld#G`eg3Fpr@OzwYa9Faly!m zrF^fy_Y(N{^83PP00>wI?HEAmtr)zYRfs4~aOvp>Hc$^P zGy{?wfnA^X04C7s2vq+aR|-@U0D^!nuP1iYWM)cPYZRRr+25m4e-9EZppF*%A&BQ= zqlsoKVxCzCHDb?TBT2rThu9^Xc-|DE5a6}ZC38L(p$fF+Wmm68CjX=TQ}VN8G+8^J z#-odAx^*~~68`S@KNdA%*Sz93*l43zn;;ZMi;orC)%kMR@d_YN5?M0C0x1;p%D))} zXEuGJvox9i+*APsz_w)at;l>R?KVp}KLF=p!S%{vre?FilP#lb%BZ~=g6gsuV*W$Y ze@Zd!AAInEZ!Q<|I=TJWQ-=@l-?w-7E7S~-v;fHrz|Mek-ElIH z*&zjz_^8^bk}OEPUp*}DzDKM_Tngz-`7GWP7^>8fIxR6+u%Z~54J*l2in7JMX&9QG z;yp4Cc{8{h`kmu_{9@9b1zp~oU z>e?tu{yrwqNOt}c8}sBF_%q{Z{g42^!S@ z00t-n4?G_|{XH^%ZU_7TcvLad9YMcK5Wq)gY@NvPYjDx74piei;h#!zRRQZXt7Rc2 z)x|FlE5$%xqx#oMf!UWghwznhQkOLav5)dTReN-qv2%G~Q~itgR7YAJlAJnitMGvuLE@!pKp036^tM3VuDOO7coy(;AixZ~a_b<-m>*>xd}MwilT z>&d7Ixc!HJ77GYnb={jYeF@<(qntn4B|oT+9ck-~AN&>T`x(H}FdIXmC}(@{>NxG# zm!tKKM*PJD3hP*j6S=j3wRRDCa@$zi}XnOq6j_@OoK63Zg z*2%}0jL7qP>|6tImH+^yw7}oE{`%LvB7_4r007#x6IGAm_0vt}V zgF+Kt7oJg*1054DZ79GYgc+E;Z1SuP=rYx8y!r=paytlr0RrS1`I7d%hD_yv9W9cf z$O7IxyDu*u00Di5kL_79VI+UF`8%RJ);HI4%4j!>V)P z;r`rSm-E|D4*zSw@ixBCWqlp5FR$_aP2O=0X}N8(vO;;1be~pF3uFyyeA&gJc~90i#;( zkE^=6f~Jw!rjON0GZ1j934lcg#R@2zslu~%T}RhmnS26%dVc@`Pt(foi)lQ*oTeL( z#}L6E{Wz5pzVfBF=KHvm(TWKSJ2VQ}vt|$+%E3)uc)!~*z!cdk3^52G2Dj*JU9`EA z!+-;{#W*jakb`i6ZCk^5LX|hCf<3)2dz7X+UU=Mn_x`WVX47Xi4rk-oF#uQ%arkHH zIQ-b7UvHYWb8Xv{&VbG8N{R*;HRNX;2~bca!|)jp@TSkt0Mt(HQ7$oc4h7_V>83QW zH(`KHCMF#utngB_B5MWAQqg|a@>4J2)xC4aH_%zWd54kHxVRL{|1OaVE(`Jx;1*;RV%c*($KD5iSe)P8qs)?q?)a*!1!l$^yrL^Zv>TpO7g=w z_NA{zDzn6`Cxqk^JOU~h+)j%10K-N`jwS&3p2(U5FjN$oe|+DOxvydTD1{fyo z<{3VAd42krhr%ra@bPr@xc^|&r>Vj2AtdRsC7XDjftB%`haP(Pr|awMhfm{%&)czM0C4p9=2`9QLk~Ut zwVQ6b@rL9F5dLyBz}gzkLrCCwi+mHD0T<*K%#b-GFddp5P{kWZWhzh$@08#R`u4)9FQGkNF-zf+P ze?ML?nZITO44Iq%;f=fKhHF-7&+ZZJ-8+iRf3ljS{t(w6r2ZpEr*v$6PA5W$-z=)1oFy&4L zCpwqChJv`9G?yLuMHl;hkyVE=(_>b4Kl%I-^PJid~q8;?YDz|Vi4Gy#`heY5tZ zby*XT2hf8yKp4JeMpJ=8!=P~-^w~8Rip+T_j7YL4&aeraAdfNAPV_G+plsd2uXdEG zD_Kh3eBm%G6#8DVymCe?!Tc zDLmUxj&DZhKOJEH|JhBu>BehUY2V%v?K@{otGh-~>JQ9zb8}9|j!x;w(HR{(zM##M ziuwa^Ab>Kwi&Wr}vOO^3U z^oWOh;QWFAL2=0ashGR+Tf`YniP*Oc>$;| z5wlIIAb=<-nYhyYEAnb*7P5N(6I2x>()UvKRGgRDjtZi!x0Htot0?J;b*Vom><9%43z-|43v@_6yop%e_ou&wPIh#_p`bG z?O0(MVdd)5cH#8LJ?d!;1Q=B6(8GrwZ#Ungt#(Mdas38Rs`q_*iPAoiYERIHEI>er zdCrev#$N*)<+^+m4T-f*oJ^ZNXS)@3KLb$f^v7l=sr(4}9@w11iJw#hP?#;iNsymG z_PtjxQmZG(x`;;A|Bjh|eoaijH6S1eF2s8yYXL$LAj%+sngzLTL7mHp)O)(@lB5ZE z;E^eH+fUFWf`Dsix^Xc21l)DkCt_ZKi>`cw+QNKtM|K=;gn0s(Tp0B{8Es|_zwr`K zsh@iLjAy))bj&>8AWYyIsW9uM8UO&DJ~yl@-jy3fuCW1Or{L}|MtIxaUaCp|#?K** z?{qrb-hcNmzjf-HKEKC~0l=5P`_r@5;Wxbc#q_o}ymI5QYc7PkuL zjU3TGxn&RC^pZ6?_na~9J$Dil`-JXoZO&=^*fcW#W5?%od{aaG*b$E~t6-zyg|1}& zg>;DOIX06pGh+h9f)X?T1=RdUTfdBN$*d6o6z`SsgHEQ15P+|HpK0Jbb3mt%*;+VZ z{UPKGd_E8kRcp)KIKxmdEjwqQ#o!RU4j4OYq8S!-*~4Ev`F-*M;N761dNtLBzUOLz zaW8RvX1>gIIVG?$2|x~i7-!VpmH(6G$CkO~hZesWm&5-61h_Uc{|Eru_&L79fcY+% zEEnYcJlLSfEf(aO^x7qL6kU4J3bmt#9(;70{PYQ0*>yRM#{mQ!h#=tZUw$&)`@$=3 zN?jX4bby#S0pXPo-W%82?L4=2T(N-6!6>i=wiQxgRBN&?p? zUa!?b3CWq4vJK1gtNM{b1R=Wb{s+E&{sk9qEq}1*|JZpVptE@V=*|b|iKmXxYp#Fo zm#@6?ig(7sK(Q)Z(gK9Ez|9(%0cK4^(J>XTl=M{u%emjp^qIL=J(bQkN?GYgbbdkq z7%%rrp1qvitjim!@hDl5l(XzIg>}xVk)7@=5#r3otIB>hhjuCA*JVW|fsU+Aoo)S5 z3(%ZknS3I`+WD3TReVA|NaTpYe?W z1t6JVGEq^30te!EnBvr9qA~^tk%oD3UM7ys&dxMUz*IuFiyWZ|qH)~IdZuLt_PO(u zIXgDu?3Z6T-0!DZ^4}_)g2Kxoa9 zzTleu>0qWG3j?vrzroVNIzc_*Oy)@E&wEWP%VB%T@y~ky8#RA?DYZ%Yf2SkwK_Vuy zs{J7~zkIHQEB6>b{7|-2Jq+&apX2}-IkL`u#UKh1W&WT<+ne2Ch%aJRSaRab=M~Hm zXaeM-j!ic<7rYSRMsLEVHF@>S@Gup024>iAN3wtMp_%8&(7A$N_6P)k0MP&>8s)?U zkeruYGm0wx@HwH1B;|Ke6Ai>ZGvyddSrICMCq4SpXDGRW10mX6U5}Xw+0N%(~ z7CYD5s9o0+;CTU;z<`Q%TwW-4+-1z4r?|=?_(uUWcuHvgp@$y&(ym==^g=&gZ~y@5 z5x@VJ|Nc|I_~>u__JP&O=qfe?G%+VYE)l%8O5J#qd^@GCnMdhg`~ZMkqCc{O#mII~ zwaa7p4%yuy2~?~qot=vq6d>a#^}m7F5(IF{RW%t{VWckG*Fk`@uih?VMDq?Varqkw z@5>;db?WW^^W&TJzXi!(u2V@oNdEuq&B5lsE86^b?-|E&*$PR0js{!*EUNrBPj<95 z?PxkrOqg@+i^QMH0P}lm@3;N{Sjfi`H_N=^FP)|rjq3mG0N8b8oc(w-ZRS30ivTE8 z8GXUz&9xQAKgjeezt=uje=LP|p;tEDbxHV3jWPBIwOs^}0kThuA4J$XT&qKS=x}pBqgD%;o?9 z0j>?qpZ`K>;8yG+!6C4l2MxfKy6`s(AYe+1W**G}NfXe~`R6y(jOO&%Q&XbZqcmB2 z5sgMKrs>8*)OAyO@V-yQy>jj)uOr@&!m!K5fQ*wT+2M#6-}g)c_|=ly{L#n3X{9b6 zH)zkSQIyInjq1+q%jkHZUjnXOGV8Q(2^kUwPjR4`jb9HRe)7QnyYIg1G@E!{j~A>4 z04HE;d*;9M{X4$$-go}mKaYr-GXqY>Sqrd2i`5DFliTEH^XO6AaY7BW%^%)#D8V52=U3%Zwf0A*x& zKfwH3XI1~dII%(h%i~W|G;DdTqtB9mVE#A0WLFIH3(kHab6>FcA3HXS%>VdiO6;>e zP0oIEh`Z;u8mEqiZKLY`CO<>t@cce;(vVFa9xwAOseCi@PmX_>(a$SGK*sI*k~>r-CLR zfPkwE2zcoJPtl7TN9SC0eR_sbjt-zMB{ASf^Wf}AOynS?Z*7g`y(M(hDLAfy#duL? zU(5BH)`ioy@jktyqAt@5;I@^JQ+yVfPfN+M>#qN0c`W(;o_p^7@`V>&v=pbmP>vTA z02mn4`1Rj>{kvcMz;C?cpSNsN3w{8xLSQljG&v_g*EZD6lMg^l3ndb55jw2Y`UJ4^8$JaDXdP$Y3I94I)`!LW+V((|}gA0-)qD z8x>Dx#_ynlpM?4~%8c(ku}S~)V?piTNn<>Yf%$D7q#FPLAOJ~3K~(=2x9z3tuU(DV z{U(!^wofi%^}b_S>fboo(aC9w@1M^}9PhZB%;+Q7XbR@7jECDe(QWqo{kugY2cOSv_Q4FT=g z&pjTIzqsR$JHGhzQ&07t;Dva+U;sdc;hL|$b^9HE>%HG@LpWfYKtOT^oWzj8*{)Su zoEVco8FB(NF~@etp}`&!?9^twl=_D{Vf3N>UN>ME@T8fz#Pi>)1nYY~0xH5uVKcY~ zOSakNCXptA{_^{F4?SF#q3w^r^)BS^CKm(zqr1XK&t1uf1lK zRzvyT#?j{HELQFddHiEK-@yE5N##GEtK*#~RqeMawfDh~`x zB*!krD=)bC51&6Ek(cek6es|w+?OD!j`uT*s*PB9?u*lvu@s|Ap)tXLQ!&J_SP0|;-N$Jgr|GpT2w$B*E}NiaX3X#e^> z>Gy~%2oT_D^Z$$FpYs94XaLp(unAzqAYhXG0-}VT?%D<)fXS2=(@k2;wrDXrN%QFz zEoKP>G$B-Q(a|~k7EuFw_-HZ*tgHreKmY*`Qn%QqgAacu?w!3CU7w$0oGS(b14jmp zYWW^eM^lXI#oU5qLy&8d?yP6ym&@4k!*6o6y|E;n1|nc zyQJ0nEvvp4C4kT3%~D1Cy*m4~oZmmEGQI2g2L1kHPi2Qc@VpOXB{2Wn_R?#vT8+g_ z!WkQzb1C0@VrvoA{UN1qRQWHwB-|mW6QFVZ&UpEoP``rlBkiJcn;XZxLW1X#zn!KS zHcT6+mvKY$eKj`TLp}dXAb=vRt9)MoK-&c~Yu+vcE9#)nN-^0bs3`6F#M&%u*7t=j zIT!l@ngfp;OYX1Il(t*R4v519Um_vrJ%jBFu;F=x_ZJiVSxryWhP}R+Qajm|K)~ok1Pt@(Nm>N+ zKrjciDSU9>zAkD4o<24uKYx@at5;FmzKo_D_tRp&O@|JAj$YI>wD-c-rgi6X?t)T1 zRAKhzdz?yqqrM%O2D(puN?JQqAE0LYueVrUSfWsTcPi#xX{*=iem{E`vztDD$MXsRhQ?Rkp%Y3r16=>wSG{*M8qth>0kRe#g#@lrx3NXt_9%MMCM|%= zUcgYGr;w(r#UU`Z9+#l!YxL}%hb)vz6KOtgnWg{%E;D(yyK`=N1}&Y_gh9UOpOvJv zKnD}r9@7^>Zl!*fz*+id$^VxpHt2tP>?zvJMeo@*7S0JteggA<<&`TbrS5`gdplI_ zThPYVB0Bno3Vz{lw#Z?AUd!vU4^^g{<_}~09he%Z)XGtvLLdVbM=(l^pBY03wqlkF z$(MwKlQ{v%!~1wuL246yA|zS>6J@|aK?lPyZ_Te(+_QX8<%Ax;qW-vGQ-%?eWq`i8 zR?S@n;wr}8d^BKG$Ea~S9(sO}JfNItn9we3)EB z*_=h8`8$&um=gjC2pEY^KztvVe;a_n3b|&S3j4%ccF7rVyqo6ZHEOnxQ!_e2^X;w3 z*aHX%+JF!#uxD?gfg!4<3+8~81Om1YRlcWU*(Eya4 z0b@vDlT86JyC}qHLzs~P0x-$W%q>s{SA0fsNUr6|e?F%IR%S0UqSyOLzJNR;PQ=Ze zxJELaI?|jc-rSnZa?Nc(zf9BvCfO;H`;4;Wy`R9^zzGBqDnvf zKAU%RayvQs1zUe){&Sz}_or05SjfmhWC3d&)Ddui`4`#|Gbch+fDvTC;d8PW&Rs6d zzf_g3j-IEo=W+qzc`$QMu4!AA^2^eiNY0ad6_$> zV2|SvpduiVbqZ`S8bCAw>;yQ90Kg##2!{Cpz+-seNops%sU5FT8^FToIL)^=vnF7c zLBKo~)e6x8!O6B;JQ6hl4QK)$J@{F=qH(n6{8tez9Qk&vW}O^D5r?HM1(|_mC7-=i zIVG-uD$L(zfJ6x9J2EtP>2mFFm|;eLCYXOuu=l#|hOU95>pK6#AN=62jvP7it9ItB z9nTv8=;0_Ul9%VWurTj^=+MItJ^b+BUw+AjH>TPEjU?L`MJ>Q2Mg+_^PEt3TCM|%= zr8k@hgo$(t)XTETVaXZ-$B_cmrxtv$iVG>HNG(hNWjmxC076=du>n0ROJEL3rBe`) z9!7U9r!q#=DoIo%!=8HkCx^cz{qH}qMgQv2!?YoWaaGX==KoJ_-9y)1Hlb-Q*b_iN zaPCX${>1!6<=-j8Gm_95Pb^Zfb26N)U_Q4>a^O)qvmgZ&WKNBuEL`2LQ z;1M>w%P<~n#ux4OVMHO%7;O(1qk{7dQw50(GEydlJCxTInsDZ8D~OZY@@1)`semPA z@8ovmI2)XuBVTJA$5z@a#QA)E^62M^n#_B&e!pi^n%CXIz5%tHi8M;qG~rwyOmP3z zq+m5gk^~6q0qFZSGWDj(;eSnL{NdG&h~oQ6{BscmOw#u;-NBsvc$=D000FzG8Lv_^ zTBrHR4O+}jrcl9{J77V(V|2lsj;;rqcPMKDuA}V}_eBu!*ul@zhe*&d^9MluD>7zpUJFN(p~DqxciD-g>!AL7Jp!k8?n4hf^!LY) zAAdM#sQ>?R?6{|=3ErOFQMJXRG~|LA;Pe00KmFYs+u%%-%>Xgm)+Ch)4iy63>X`iY zh!(TpIOC}4Qe1G8omsrMtx^FBFfk6k4n2I@BT#tv$?YyO z{-E9u%zisd{ruUa*u@!S8^1bFgR)1N|Ddev;Jslmnma+6KRXH<9x3`+_m!cdi5h zHD+(r0jO?v)plfvJb?yH`y-`j;erA_+4G5|)%x_}Z?cui=QWZ|SQ*57_#*%TRAdCy z_pPY^UDg6HAfRXh01yz#aw;0sjP_7F-c8MDjhfLaHSJNFPfyTd`y{zw5?IX0&F8e1 z@3Vef^7sD7X!~y=CqVeT5-J3)k_*m&o7?2uoK?$pQ4_G>f;B=wRQ_s; zMTn*V^Ib_)S?0*%f~wIhHRBS$4kU5rAdX7yfG>)6v#9D%dHh-GpL3dBu-_?|vW|z= z-mfUZW$D9gJZM86GLNnA^egW*(qLhV{GcQUO&G@E%=nc@Ny2)x$yd&)oyTAM%I7Kq zDzCPh0}XL18?d2M3@U3aYFi+XmuspF$;U6vZP8Ys&+o9du!BL&>(k^U@ZK^c?@V7x zvx|P@U55Qu?LzN4cr3ZU#;GmysZRe0d`tL3S84$yBOo(<^aB`0=RfDh3JBuopaEEk zfPma6XHMKhuH8*d_#5q_cC<>fts^vRk5dz)1wzuGDY?ar*7CiNpP12Neu&1CtH|xm zngDl_9)Bc*fb(9J#wwHzaIH=@E(-K%A`&&fnPgccPIEuVHB6WKNqKNB_12!yzy8wq zrytt0YxSC#3!rVJOmM0aIEh+-Ze>i}c1zv7p+yK8?9?ep(L36!m|22{8c?;; zHs;8zJs>Oq0`djApf!)Vg*Dm^S1pr%W*-7iVE=beT9_CF=$I+f*YRr#=C3OM6n1xS zl>AxkkJ5T#{=awg9=iIXF>P*jQT0F1%sw#vX*L6h%D*D{6TC-e@8B1+*(#pGWf&kb zYa!C!i|T)oJ^c{?khdBjCaX01s=Ud<2{!4{8Z7p?wZduWA5#U<&;R z_~)!8h;j4e%%rhDNhc1Z9>Uc49!&VIZ4(1AAYaPHfS?eB>}~ z#EfG)F5#L<>*yc7ad%?=Cp+5CC3_>|kGB4h&z~~$SLRz1byoXFdw&BN|2XY$m}roJn7&y?#5*Ao7TlU}iL z(XYf6-)U#`Ayd46a_&p*whAr~3{N^CRc7~t+TB)}uQ3n96q*3o=EBj0UMJGqFO(LVC?V?=&V$B*r& z)s>5AvT^}DH|Fg}qGR(O5IYnbT2;Q+1>|5|@xC%^V(6$Z&mIuy%@bbc^$~iAdg=WE z0ORxE_`uo>=Y9Lz-}&SHcklnQ(%oO}@4@@;T|Pc%=y<*~0Eoqa>>_7Vd|F)UzVwxE zeC8kh&PV^-u*u?vYjbA6QOXO@tWIKP!1*L-0YXa6mYS}kw&U!8s0GkJaR)0Fbisp* z6_q7smShZYRZ5Tb14@r-xm8BdO|EB-;t5JXDKa3ZK+P~WymS?Thr!RY*r?+fJHGGZ#*x(m)!k@B!{6}{q?T*wn^J+x*%;wrL;6k#th&HMo*iD;kx7`nEpmd9t*GWef}(e z0SK%T1wVjhl_miUG%1wOolM#T*KEah7xVv*y*Gin<+{oP_c?X%{iio+_AF15umEFA zp0Eve3;~0|je)Q-&>09#+$3aVkxoMr2si{nyjTfIr$etMD`7#5NeCf?DFKYZ!nSNn zvNb-v_w@7z4R42-#^_qR{g{ok`K$x_@U-S^k6s#|sH410fj_O$AUi?}3;-Gd0e(DAc>(;&O7;baA%XKnS`@A8vNIs5 zrk^vQamGMx2HW22IpB0r5VpJ8YHEUYek-8N3J(wEfjLPKqiAbZAPp}pFg0-UA=Yq| zi7L7MCB|Ph00%B@(vKf|k}j5n{QSH4(RZ>RBcNc>`NBCJ*!EAIfDlgdgN25esnKLy;3vhX6wUl4>3Gb5UNb_oGiC+wCUg`qL&Z-DtILlkmDUYfQ*C+S}vGT5ffx?C% z%b=LRa4@)?Sj4JYmsbLexHVF2sCHKfQ0{kNzLNOb1T`HM)qk36Z5VbiEe&=C2-FFJ zMuqWbAVBiBsTeWZu@NAo>>!s>dObzZK!1L$&dUch6B2|=w5N- z3tx8Yt8RW>Oq01tMKdZhK>Wm90I|~6VxeY$pkDZ1Z(3@DtLmS15Bm3Wd4Fa4!eG!j znwdMaqdq6d6`bc#1y@@NsPgU?re9S4{5i0>MgREd6PfvAP6Fp>Wt5r!3$GfblD*SX zvX>dZB=+gD7Q&>{rO<1at3&*_#II!hbLLnY8(&?A#aE!xSpbQQrTzu0|AlC4J^))8 zamP`UvAV2;u9(dJn3$RNIePz|eTs8MglhPwJ8td@e_{X_9z)e`r47a(I+z5yg6(x^ z){%85=h5^A>k!vMrT%Y>`k%zyaq zoAD%N@yn)wVgg{*{|MCno)ZDF>VI4k_S6~x4}V9=EZ~YcAmtlC)CwMSO)>M$=P_g8 zCGwN&$VGF&{5*AGPUp_vM{6t3qshuu<*l96Com>Tw8tS?HgpJV{^mNeBP*sCJ8=xJ zuIG|jJ3Vw>-3cFq_tz&P1BV%44-Tym=X&k_@E`u+zkT3=2Y%zJQvb)#!G|B}Kl^Fe zo-qwTL3_>)zML)py8gkUf6}V2d16L0z_)+PyWSgB{>=#OaK#KTnUGtZkeiGtj5#E* zBj0wJF_sj&Im9TVP%n`%&df%3Vv^?%yn&gLuB4w0)OQq;$qG0YAh0JciLRxEQ)WQ4 zMMJ1yb`m5|a$4U8PO007^zZ4w<|h64(Z}f`m?x;%*(VLrdtSRi&)-|r{>j_F*!Wuo z0vKW!z$u4cKfoG7Rh<1e_-(!-O%V@$#7u&H1ia1`&UFxoo&JFNcLdIV+`1u2!U_*p zC;$wPd*y|!vdZ#1U8y8{xgQ2FCxx(_ejy+kdiD^ms3l`l><`3hN8$@sIRjRWHU);D z3LVqmAO;7?sUbP%K}{@Lh|BbowmB%O!`cSYhnhD-RMz|w5#*L!B5BTZF)8_U>64=b zLaN@EH*g4KiJw^g??L@v&)qiB> zegqPJ&Gc)=!{&fV-jCXc)sgrZ5NUD^2GJ|!O)gxRQ9D0OqsdEXW%n)AoqvG3Zj+8Y z@&S4={b^de>ZWwxtc@Hn2l#=GB@3=hm30HWknvl}8Op+Qkl;!DFB}wasve8u*&lq% z@@wYbTLPEClFG{zRGd70`uIKf-2F#8|MJ##x8D4^b`j%Vqn#_80b;R?Hkt$$izNAnVj^(KDBP8-d_heDpu!S|Gp0HK zT9i5Io5-Z79I*rl2onlQIH4a@%GDbh&r>|kc15busFOAe!;hhl-qWbbf5(ldLz`Rl zV@C_~ClYlNtNkPMzhO_4lKjj#roS*#)&NL?olpUrfT};GdHk2(%aL_VB(mlK5BUL7 zN#NR}+iTcnX8fv^;5N3wmiaYIY=@buaxp{(>@eMTx}`8Exc~68hR$D}7=6xLJ(&kI zBK5|rv;yh6i|fJZUx(Mpyww$Nc^iBmwmFDa%fWnc0CH0VK%;Y|DG?{QzWF(_#$g=@ z(lif;pj~FFCEhxC#(JC(1cC z35-*lGQ({dWfw-ArSryx6dlmbFOVN!o1z2S`C00^DV;lgAFZ#xfW|BPps)0~LbY*l zalBx_jc-8BGpg_X$P3s3bCUqhYJT>ae+}rg{RRYL`!0tDpneLr=MVni!#{W5efRxF zz|hdA;B)Z6{~RU&lS@QVx2s4bGJjH0$=U?W?2l*v>u>(<2fzJ2-}GLN2H=n!2YCUS zl?in#6QW6U25hK}{s7L?f;zz3nnsipS4iD(Qf4W568xx8<=dg7PJy#oSd{bOqyuyV*CVM0m1qG`*d`{hzUv@gKLOIvG6D7UB9jyQ1UGg3P? zrnhLyeXF=~s}<2*)F80r*n>^3tYJ(l#gbb2y{p?*tz&I`U6_b}#y%&S4ng^;expO8XpJ2fR#&VG(1_8wEOI%3D~@g8eL{yOq2p2p-2z#(EV+|kNPW-u2n z&S)_^OwIU4THSpMg>w(ktlgx;2Y!KWe8r!m^{Zc5emNSD`WYlw(Hf?2QO#71ZT-~- z0QBz9Nrp5PwT?_F+Qw(?6(= z$5pchqVh!uh=X>=$M5;*>C>l=?pj}c(J0#eIWyp>k%$048Izl2Ux02pCu$bi51@0j zNH^*v%atqXb{(swUC!07R6?1qFhFjlNSgt^vvb^_4|$<8WfB8-!fA~J)p3SA$-8Yc z7#eT?x=8uD_in!b- zZHZg-J`{B$3LYrw;XOme@RjkWdj=c#Zvj9}Y2YOa;eiBi`ItJ^~cPOc}vyoljl$EI8>Qa~!6@ z235T}e?pro;T;6g;XVQoVrviBR@q8|8Bqpb%1KAnzjul8H<9@#C*)!hh-Lr;0Rb~n zl}43tKtcd8*zlb;ye8gfmB?LNK!B6B6Q__aG-)N|d>`j8OldJaM5FPI*&NW_PqXP3 z9o+x#>1D6{PFlbEW*slCR+v$cppgIoAOJ~3K~xI*Xof~ia%O-YPABwF;Z{|40tSP9 z6IAgLAWbhVBNXHcoS|3HZ`HNEpI9I|D2FMfl516!>q-BFYJalKzgL17{xY<2<~uwOfC6*Kz`qd{Xjb({ zRpcnC{2LmLJRRQLrhoM4F*=W-ex%<1-yE6$?j{%UDa?P~Y8c%h^RFEDm|XT_XszV# z;GM9)v!^zR>4Lqvle!;9o=PcYN%E6I5zF7?s7R2h4g3?Ny$(ip8Mm%b%TC)+_|gtP zK}p51%Nmqi!PXO6J{!8n+YVho(pxYe>&M}gbX^MO1G^Z0mXNA20&0)0(zia&W9-z(HTeykxr8L-b0Sr#U&0&(CK;q@@1MpNS*|auNkl)c>Bn z{zn60fJ0Qa>ML`uNlAo~IUqH;OXh%BS0FEhuB_FLypOp(qEEmDYR1=*YxYn(J44-K zN~ceLns%+fh$gF7WpG}Z1I!>|D7Uly<_7l7STCEzJpM2aIu(ZO`P{Zz^|aG=8P&hs z#tpXl_kaHne)j$c?*DDpWImOjXDSiU=L7(*WGl{kptRFTiUA?~*XeHvhL~ZcT4{HeN?;D|#QaAMjhcpzY;DmGA3jFsK=OBm(XNiO+W-1J zUaR+^>c806!;s|P8&j0+2LJ%UrEsO%a7k>oO(NvpgaoFi1t)6#RsaeY9U@8j+XCaq zHdCdEF&&Sha_{`mK_xDi;h`0c8B$fUn7o5-{|Yw4kgs5?H1Y%8G1Qm<#1MYKyD&F< z=Yc^0-xvUm*jv^wfY*qtvj2_P?%!ZmN$V?sbO*x$g>h7qltV@X?~{UsJZHVc`Dfph z@>fCwn^LK?NdO?{D*^j|!#)6`Z2M1s0BrlmkiTUBU}(SxKtL+_AN>LHCzSA{sFjF* zP>oX%;71t*ET(5@(QebJ6Q7}7>o1{|)qRzUWyxP;#1(K;04Fo43i%wGPScW(bvv^||BfUI>KmV7M@ zaccJ&vhX=4c}@!{V7&-r!(qC zO;XvVMeIXz4s=Ep%#X_IEe{2ENTwu|7d9pVEHo3USK&FtzekBF7#nrg@;jsA;%?w% zD2%YYW2e8Y_K%K#M>ev6i^8>W`nzCKh%;>`L~*w$98JY=nYH{KimkO)I^|;&=^;_%Mt4 zot6pk=qQOAFzgTly}D_b>(jLz`WctePOxS9Sb`>8!Yq{~26C721)$2#-?#790TBHR za=}L51Yi}=XU^&T&tQUQQ5E!M`mQLTA&L+a6y-+iyc5+lWD=4@K#_r_92imM@6``r zksXku^YLOlrzX|zpXVC>qnMg^K_Qmv3 z>j!j@NQCPC1V9P(7mQFNS67pr*RNBb7#d1EWbU*Rnukd_eA4VLuT(&E`0(LR-}R|a z+yU*()S z56TZKf{BaAfxVwS{-f&u(alZzhlh^P*{JD&PL98elK;2fzCl-Su)|+hF@G)SvorH| z)uP*(Lm|H7Ut0URY7_#dU4<0Cp##-^aR6+kG@bQdlaJfQ?~QH*X%J9K>5>vQN~A+V zP#E2%APpN0(jeX4U4jw@jWmLw#0LaMHw@VJ-SflqC)~UD+OF$5=e!S~50MbPvZKp| z35Ph+!X0|&7XGXuIA*tGn!-D$^x(sR8(gAPhTn#0ZHOq|Os?M(`d3Jm(rbwoJ>q@p zzp+VF9cDhi|KT%p1v~h>vo!?NBn*+7JYe}(=RfkC?uB0?@+puth21wnoa{e8)$M?5 zkV8^PD*b^snFqKIj$8UHtfOLSR;af`rH@4EfaCMtgu=%tpUA3g{bT-E(OS8EYUUo+ zR0m~fl6zU4rjXr}4*Ti*)?KSg2!G3){JwSAuv zh{YxS8NY}bDIKwz>OzVDgSqv&7g7Wk;PpNJ?;Ja_jv7`Q2e#ilQtzm22(7YOo5IOC zo5!N6iJM<{+dNNhp9tI-OVm)aEs#Z`y!Jcsz3wNL96mhTL`6cZHs-$SZE}`eXDu~J zqI~8xoDyxb4Kd)b{JLbvtUN04ZB3Hf?eS_;$Gu128$9Hvm=LLg8xgHa0{I&^^X)}5 z(G=;&F3^9}nx>@t_n&nk#97+#vYHn}Za_}%!<^LIo>IpO#b$C-2bQ9Ev491?C!Lmi znCwTU$uj2I=5XGRWJzIQUN9*+zJXFv3Frk1Xd&dV=W(NtGpwppABSs&NR<1unU4ef zn@d?B&kS)OO5MWS>D2q*>>EPMqqc9?erbw`z7KaAnzRj0c_p+Dfma`OHPh5J1D`J8 zgST>ts!d075CceZ@F8k*awfCyvT^Fr1!j8Vdf)B6f0Q?OK4_bS+TkUe$?O)$RIhSO z&w1Ty%|*QE&AQJ(@6-0SiqGZ@-K*H1)!PAa2OSv7tFV0e`YkOXC>2B z#k?II$Rl=Xt;!O6ya0iQk-z)}m~YFMQ|*B{A2)f`v0mvI?zfZ~rxbLey(RDM(U0$s zAVFM<7Fvv~+l8hst& zJ{og+r~qQ^deqh@HP~?IAoWGqpl>7RzEMs4l3Hz!XU+O=E6x&jWvuOc_4%RWi%_Bm zcYmqi*HjqQvM$|)?X~Zd`n=HTO%uFgt-Rmz0lrnA^HT|}PMbD|>3XcKFp779EJt^R ze#@_WIiG`6HrYa<8u*3}K?dIaO0)!#t|~$(YgFm{P0YvNWW>Ohu0Z`m9jS=tx1~dO znO6npV6s3(XoM`fd{ZF-XDd1Rq^<+kb@iCVxm}3!W86=swog(5e=*;zVm6Ju{~q2m z|1`&gga>9Y?FD@;4zYEpPfj-w{NA*u%i7K1PezC2pJ#ie2ja^k&<_T; zF|#0mn2wt7626XK4lvwqLoOL?`%aW=@504>%#_;0)9;EbbTe=iv=aR%FJ41wYIRK( za-LFw7{&Yc7CdWus?bigKcIws$Fej{Rk!5#S%f_PHl6Xg{E#*n5eou=?I|==-ae&^ zJT=+MetCcpk)YYqO>Wc3!wWX81@PZBgpiTG(+*7~U9=_q^O$9gnvpRJ=&45_7}Jw! z9;w!}zi0=PKJ#%D5v$Bi55I3~m(=Dc0^v$-J!Wi%j!Ik_0=Vnz4t`$!D`B%&;23T} zucUDiGJdWlz5K-1Fu?CaQ{t0q`G*c|QFu`Zzc7LC?@X8aa@PCTKqkBRfaF(eV0&1w z9>56X-6&0S;9GnqrhF#4H#s-P;Fq!|auJ2GwZ3>T@x>$NEC(E?CbpjYnf8cm#W-Arw_^ER`Ic%r z?F9W|!Ga4KxWIhla?~xWj@cF(M}8Yf?6CdB8%cOCxf{ zt#LSo?RA_^Ox(A-<s)Bb(UrLDjz>mL#+2*k>20$zZ<_p@OZlS zFXaH>4}MkD&6D|zPt0}XlCS~Ex#_D1i5!a(I$NMRBDJ0_p<8?}0wpZXna8I!ZIU4y zPpiZAfIaHv$eCVKyz;^<%CgsicAlnVYn=PkOd@VK?UMy=EO~JwbnBeW;cE z=@^IOZ(TDYlheZSR%L4t$Xwm*{`XR~-crrnmpR(P^wdqc_Oq=cte$r}l{-td9wq7R z!6HS<98iWkJryJQ&hm?NnW5~}MPKELo{ynp67MCvBlo83ZmvifIy*XrG5c7w2j!$2vc-~NCqRaUe-Ptz5{zaTtX^ALhHgdc0U6&su z|0jbK?poLQ37Ia8o#}|cdqT`-k4SwWU5ouqo(zIEHEh^3ah@^6t`h4T|K)BT#aE%s zzuJdr77k_F*&k|h_X(V+4YC_yc{@6hL|5!3yz!fbLr$yRm3^2)7vxe8MZUaLW$QLW zSNE#GRGm>ST&m~@HaPbNElR!;`lRvdWf%2J>{E;KD(N=CS`24vVHXiXMDQA~2L9rS zQq-qCdCxl^Ywv44+xTB|--$i@4|`~nt6L}*|9)CIjc zYeILpSuj4c(g9428qSS1ITpq~`=6O80-ep6HODvZ`_86jp#~B}5$*+Sc*``h=4~LM zHVGjPOEU>j?{Dq1gI0-Lx0#big=KpUUD?LJt_-N5Hbmy>Ujh6mC?FO}n)MqsM+7m! z2VNkXWVl@Iq8$u#KFQ(wnHg{_=>izDYU|$YwSR>KpqouwM4nUq+CyzQTZ!*$L920* z^G^8QKjJFwD3wDK_(5j~lBM^MZB>-HQIC{FtGP2_>CXq{A{NQb=gq0c%Ec#h+@d98 z*+^O5(U1%=O*g@J&qXtpOWr-oN`CkC;Xk3o8X4Pw!7vJZ<`}d3)|AQai_N_CbMebc2k*mg4}YU8U9Vsf1*2aa9>E5m5q`X{Qsa|(Rga=W z@SwHr7k@K|-yfXNfp_Vzq>0Fc@KxNl`@kRcfsk;duWMC1ghoY>I?JvMzE)oA?{Z`N zf{$sx)Iy3Ocmdi#+WWEy)8)NfUPEPzxoCD~Uy{0B`7zb2@i}fHWFoPUwor|tE!ES? zKZcFAnS$}P6<^D@RG}XxBGYUcgar22|K9MXJhJxI@=9K$;&UFSu@UxH33{QgQtUO? zo@ln3lJqU=YVN5%b?g?xU+1NT7QhwHp0;0wde}GD0#fl5k@)J&9JinX3xEHvG+4qc zd!{Vkerxp|O}pwlTi54;^$l&_2P=sWedk^Fae;pTO|HeKnR{=Hy(HTX{LuX) zx9om9+YO&FU8X1x$H39=z&&#pEP-?sInLkb?Us#9G=Znw8TI>cY0h=YDTG}8pHC(B zyUD?_mkmC^BMeoaSU;u(LGRiq-fPcA-m>y9*L;V4*ZRO~&1qkqTI7|=i?9WQ^;rVs z7qu2Mt{M7O1~ozk);-?j>FBuYB99<`h=O<~%HO`lZI3iC@Qv4vl`fYO-k0M7>e$@Z z<{B4cB=9M#21wN0OOo7T?{woE4e$N3QX_Wqio`JE(^9KqGetaU{Fd|QQ;owve4R@o zx|_8bSMu|El8~g1X@){$u$!pR8@64q#RvXQ1R10SiY;MMuTHIl)n4qg_=(1i?Xer} zm(S!u!LYLe%9vnJJ-23_!;Jadvpa2u+a?bLaZUyQjV|#Py8^x8t^+k7=t7ebhE4I1?|Sv&i^Hw(IIIBR{;I|;G3DF!ysMa;l}#^~XqPEbkM3&2 z!}`DC_ouk`YmsfRFmdXje@fSc^lmO{pHFmOT$pL5&2$V{zvukRLdzu(rXKf_isxs4 zbjTI@eE#TqxotbjWV37OK8Q~YZhzN5(DlXZz_s+{bX4B%YHzpBHfg+F)h~8|a?F?d zZCveA|Flh#e8^fNiH=~|rmaLBaB$;U@S5RK z;zdj;P6NpkO3aImNyypE<}$Wxm-lame`>S~=idM*jOn7t>mr${9YbEjE1#*4B3;aw~;nny3aP4ucvmv;-H z#bQJ7HC>5+|8E(`pLp!k^ZS%}kdckr^|I)QO1PTazZ& z4KO?r%3XB#d~gA``AM!Jx)=D1Y>B386_vk=stzZj3i-5Nlcc+`-IYc9iJ5tfGk=x| z7)zRzVdZH;k)1Kv3y&8*6UP{sKUF1WlXJpWLb$?QBhgRF@amH_<*X$62_`q{dgPwZ*xwVxM47VtCS`bQrdIRifpRvGDYXQ$+bwyk^?&IXkHqObWxyo4!# z?A{F(2eUn9mxLDoN&9L*bXx-2`KLQo&->@yGWZ#F3-lMh74KHPR#f2e82}z6HilKn zUKTI<)pYk>F&c+1n9;PXvRzD4O<4p|()N>IJ^32-<+cr!!SXB-6nAnT2ApJ++8~A>BOL z3pIAs4%Tm$#r^hXTH1kdycb|i+lyo3SUBOiYx9TT7nX-omcuQ=p%1?bv0x>ReNLYi zpS~k#;EE@U5$(%byh|H}$lc}V>mb>m-Ot7ZWu0Nmo>-krvO_rw|Fx}NI6P+YQS#i$^7zr89gzEn|Mj4@4If#qGU4_ zsJ;G0gT$6OL`m>oE?vel!*7nQs^kNNy#x`uJ(YMo&>A;JzYqFuqv3A|Vvlp%gWITR@ZTbxNz;Fq{Sn3Ix)zgt=K%syldKJ-Bve75z^$W<66TYFEd4c)N<L5i!LRhNRLE~^GvSk$+>N%6BJWQh74CJJc?Jo6|P z{!0Pu+Ksz8mDGPgNIlmk>*oU8cGbOtWMj}U3D8o&a=}T#Lpa1nBO znUo@8dde=zdTKjV+7;ba{Dr-}ANSaGCO_qefp`v0{boL0^6u9mSXOic|${ zFh9z#`OLc4X}C~siubln>B8#ysxg3o#Cea8pbQF&?o&F;JWEE}5=&gFd^QH>%Sx3W z9B4ZmH#~$askR=FwaNEDiKv3Y+=HfTomx6r9^#2GAf78`b#3m(5}X?m7DJG4dg#f| zI?|@@Vp0Di%@_VK%7TZgahQYYmi$h z(?w)&`kZD-MJOmW1|FuDonBFIvu9&%RUEd(Z&HY^W~YB^4dcVu=P|3dxFuz`Cj~W0 zd&ba?)1P&icsLc`(Y1;QJ0SkhO;W9iMh)}gZ%b~ies{yWCw-Cff=~m}mj5*inDPZL z`Khj85=Y#UvT1@~VSgjC`2M!wyXq;i?+n^i00e3p9Rh-FSMP^|h)lR#0D(QJ#40(* z%s>xuXybuI4T)c27C)d`QL`%Z8TJx@lA>9v(d_(Ke-F6JI3L}^R9P%FXf_?SK+yaA zHbKSAgf^;IIsg6C#ZsvEH<@LpjHAf^rdT50I?x5{5k7$06&fOl!E4UQ$z|(YesiCV2VJAg^XW^JwF2nn)u3T%cKcFKk730Nz2t;mCDg<1C7}oyY94#Zjv4jEqSzUA zjUAscZ9i0GrC9SCnQ$c>9^AQ>YU|2#NF+Rd%=z4!$}RLEw_yTId6`lttmLuh(v*SG z)Ww_Nw(YVis^z=5O?ZexDSPm-m8@)`iy8wVHSS%WHMlq)HAGG1=T9TWe{c1**N=qI zm%pM^kC_(P;6DD3esk|5f6UYHwZ*B=YqlI5qbl-pf~y)ESBe>rcmFF37F_vWx2wiZ zn6c>?i&unh5M|DqTt(njTU38gRgf>L-=74!90uAl-M;5&cYyDUL`-@Q}klwBG#YT8M#gWXR?|^c16ez-JYT^vF~K+tdZ`ErC44D8JibMy>hM zZ>1gJokbP7l}RiEp5GklvuGo;w&6-DXQ!P)obhZwff59w38DL%@X5@O(P`RyW@w>Ozc-#u)bkY)79D^qlyw}e;WqsGV(4)eANh@b= zkQagOe(LVu_%4mohPbOtRf&=;mCU>PL9}W-Rj&<1^?prGd7yH=dR(xxxWhr;m+gt9 zH};Xwq&h37@ex~W_WOiHk7CX&$vwGgpR*3$EyR``Nefuuinl4K1rc7+>@x4JCo#yY zJDC!Z(RPr1Tb5mAzx&tWr#ysD%Eg-VSet!ap*e;;F9`IhhYfSU5=5TD_<4tQ3f?&j zxDZRM2v!EYs7y7R!iORfWXMasbCo#H>^*c|`aC@~K;|VI{8SA4-$5Z4{O8f6_VBJ@ zYMs-V;Vu2NDd|B!`Ma)2Gg@RtymR7Sr-t@ZU0ZwGts-wUwDs5ukFwsotYZ2ZJ7`nhHdL^UryB{8epR9k0GJ$REv#NBgW86 zsHi{LzPt364IGIpxC+bl2pFi3MX7P+VkX3ZECz940pD?cYtVJ1^<5WF6BvAx2VG%r zP#v7?55=}r!VS?$xx?2sZwp1u-;5)JZ?AZ_CgT%(5^VCYzP-Wh2Y-*fPiDd<3SO77 zVwd~x7?PEws{d+Uw&~+oRX#T+6i@etNY+z}#T(5d4-MSc5PfuRo@0Jb<2&M3jAMn<@ULx$ z-EJOt;|$U83uv)C9k51g{Ew;tTXiG+6pIg*-k+4&BPRCp%>FoZ7T$_hpHtW1rZ5tb zq3}z$noc1AgMTDX2LfEjry5N02g*zT$e|S9&chw?KR%AjFW|nJqVxLtP2=WHeaK}5 zQVFWqyeQ14P_~3lEp3;7h<1D8|0i9bhTPEl?R>2it9*zv^Xw)M^%@QFCzagXZ6~ZU zdu6Ug$mJlm$mOqr5^i|+NkpJi=wK8G0_edyPHsI$J)udr(> zbT;s?Jo-Q#b50;-Y(`0A5c_q@Q`gry9Gm9F^HE*tNhVU!nf2G~(s zl}vg;^bbrla(d^}3uo8M>ZYVh5BS-GrPg()GlSe`Xkqu~TkMWK$5oTis~_3p9WXDFU)Bs+t=ZikC9Hy^nH-+^ zC53uI2;v5ijXzLH%wbvZHuNlXzAyAWlWRB3=$2uhy`PBSR}=GF#ECLh%&)J~XwDa& zfS)%aYS8Sb=tFd-|VzVF4&J?hQ-{bvu+ld0LE zXF%Bv@VA6m?f2y>ouJcl%}Wl4-FTy4jeiezu48u?85R2Sx2|i>=@0VB-W6;g7t$gFyNTA z<*CmO&X&^l(m(xv{8?$(@SpDB^knFH(k<#s1Stc3DV;rfsSm7~k@4v6o{~N>5&t!(&bCCC!`) z6AcSz&Xn33E3hNAcviOdjS;TFB zk%*E6+djmz)z|eFqXx3gqajw@@QfQ5Y7Q+pC%_?oYkKqJWB+5OWFSlc?Ere53z)qq zc}`HLLhXsRP#e;DPAyVC9iiCIW8Upu@F3uLBW3yI#b7pSs`3ZBW^ZA`;hwpH4PU{vL)^95z*e0u|6Bxr^d(>yV`^=S;@PT{$ z$$!}cd~`<}o0O7b4-nipEeddIV*KnXgNPQx z&x6LL0vn)TjCN$fM8}zdNI^Sqc!|zEBFsmD^#fslY;4n?AIg-75_#_$lK!*AKc#Ak zZ0IH5FBiJ|e?M>M3)?;=q6LTLdBXUc2Cvt`YAex zzPgoh9r!&!Wdv>~R&mgP8$8!I*b1~I?>Cg;t@JES$@K;${Nh#czx2rb5Td_Z_%>iw zr`+17fSCd4e`0v#cG+X5A+Bs@(SKYAnr}<_uL=`KY{A4C1&f`WrFH;s2~*+6&ezoY zuJ!x9j??F_I3m1U@1DfNU&|*?sgdrdesq8bSPDs=`J$gje&~tL*<)GviWN*3uCiz` z@X5Yn{D|TA-1(}tIel4}rNFe@=h1Y^{s)f<$21Z17GZDx+1FZulUS=%Rty?(~ELzO|Opq%Ka zFRk}HW1*G@p~;mivxz`1t`RWnF|LDdj>`z#Q`Goy$v0U(P!^ zdoElSNklODx|O?RO~V}x_q|xe&KCSG9%f4mN`0U;91RUfu0b&_5A+zH+iXFcS~{^B zsduk$kZP3E>qxD+byuFnS8h9QoeeX)!`$}5?D{C8lsmj=C6#Zc>X?<~)N0}`zv*?y zUlZO?8>1Z9>4`n)yY0HEl|jS9P|9~9p0%zwIbSJjwS<F-9oH zGu))J^Lb`X_B{DPw=r#Q2LGBw4fe;UH;<$9C4q<>?pT`lGlF%KtoUvsj`ZYwmQ|p( zgXJZEZiIdOhmU_r7;*e>eJ!H#!Xy(dNSi8}ss`(0h4CRE=i)^++$Y@qFsS=o$?K2($3>37VgUuyk2>_O2j^VnT5o*}zo;0Z9l!HZ z>MzHJF4sRL(hIJ;A~VTnwOtNIQt1%Ps-ed++E==|S#DB?lDXWjr8*lP$Z6%MTwIqB z_LICU{(#z}w6B;0v7Xj+8l)-I5o+~Y8N zUy_0Wd4AYjwcm!sVhFY&q)oc`XDi;JO#D5Dax0FYti}0sI&IwrAHjOf)TNViui=2S`UnaIE}#vbI+c zboyhR9d!#iUO@$|T=JmA+vF>?fcX}$mK}cbOe`NG^>d*WEJzF^LtiC-OrLznmP14+ zae>k;W4O1j+u11`Jpa1y^dN3P>m7K!a`~~crAq(Xb(MMSa5bq|=CQX%P*$}Ut2|`f zMxUByaB{((XJ69@qRT&x^bjjCB|dL_An&?yH+%H#z|3uj-@`&3UsUX_Y|CK_Ru;lz z@u!{U&_o1B2JIZvsnD2wisbmJ#GKw$Pz5fu_vhat==V z@nu!c_FEdR4Sm6*{`EnoyYq>l#f-;7-0k#kk{QwP z>v^^S;uQR^hZ@(_BFpFjJ-&Q-o zfh4RU;ioF}%Ma(2jBpU%iO0LUjUd1k`~u+M(uVQ@MSE=t)2zo~wWU0k&vTc(oCjGR zPfrE)YCB98mY}KrYB%;?Tu7Lj@|XX8_Ku9;y-2Yh3u13rXVwlV>ZN}uu?bRvoK3=S zj)MOyWkFSo=*0SmvBP5M44N=zGKPL2uuZ(RmpHdw9EpI;v@cMB6Ke1rrh# zd{v&NWDVGy4u{=J!qAC-KR<0S`=LU1(#n<(s=QBs#)Vc>SDxF#$Q z&6hqko7yz_pSo0ShEL$f*9?NDHu6{|{GIL=Cy45-J@ckY=??%H)7psEcIcuh3cs=k zK=Jtf2?io2igxEDQ*~)eYUq%o3x6vN&y$L45TC~5nGTUaq3yVFm^cZ|{-d+Zq{TZj zV#n6qLPdnJfuI8LoQxVurUyVP4@|WC<2x$u;n$_P@Z3i?Pvps|Q^|W$^=yr;yx2&e zFPT1BT7`zU_3?X?+lWh8xg;0aL=+|3TCqVw?$#i8f$;6Xtus?OiKD{m1JgzjW9sKq zkoJas-P7#hP-`tDxS8&+sAj5HZwY(qj@k}~BLLh-*cU&0gfAO>GnWSckIe(y{pz3d z15m%WTyV*wwMBv)uE`+XpH;>7WymnE8%w)${P9&W^qms`jejmP2$v9gi`lq0P}U2% z+R>LKd;XqO!n4Lo$hi9Y z>&Q3RtwoAR2F@xxtH7GKpW@Gj8OS|Lc2N@-9(FND9OA871z-F1;A>vH+mufzcU@}a zIPZapvJ2>e=_Wk7?gu7Y&O3Rcjh`M6Z$!U3_#l6@_T`e{oHZN+dRgDbw3VN6%q{Lf zJIh|Z$=(;3H|E*^rT{1;a#!y;2dh8crw;;>CrfrA`1?>x`fzE7;aS+NGACP})HobU z#*?amC(&C(3kPCJclu?TUTz8KgSov$G>?tRlIL$+w+pYhuy;-b_-%EdwQYP60ue?W z!Ui|#fI++^JeG<-ZS#X#Q=$DxFJ9zVqQjB}-2B@8i^!N8e!lBZouO+~0QUGu*C0LeWn%vxDE2epE--)O(i7Ic2p2LpiZs3IE2Bo@KHE z7L&F1BCt*UR|z}+O{*n6=t6fi`u)6+dUF+K$m-ak{ns^P)V;y4Bt1npzT2t-^55xK z0>F?NG`Wge!hi5zNE##7ao_2g`wXxBb(}L67aGEN+G1u?F&RDR;1<*>=5+pCtkvIy z<_2H6O<{1W%6*M_X_`V1wHJQraZnZJBUnES-FPFlVBfF&I0k zRpe|z^1e}~&Ta|~Ens_UpZbndw$_|!pB)V7sV@R4R!v$N!(X#fg+40I`{%5EfqtoP z+p#=Zqo2C7)|o>GWrx%T zKdK&LAmi@j5&5HY3*$B`d9IgTc!21*#2Y>kT|&$ZN@oZ!Ztv{GR*}5Y6SsJT zlY%NI3(BGo`{LXKFHC0q?CL%7MTpMZgy^rY(Be-*i+ssTi@clv!dHWR@6zDs%J53E zZ^6QN+l9RcGVA!#&^f&u-f|*JB;Fu~7H+Z(=L=fdyj6Q#=tji%3PA!L$E(vh_Vl_s z#zeDUS9shEdidPW5y?&QaFBS*`TL*RKicfBjcUM=!gHcU`MNAF{ine#9 z>dG4DO06wUZ3BZzHGNVokRAb-897VYAMFz_B8#zkNm%97}kn8a7h%& zyTfPj5>PR)*md0I=qgq5l+@s3kx*?xUte&1=6hYL85SP~GZTv8u6}fNE)zJrTV%{%U z`J8=OT0L-?Uke~itH_P}FOTFSYM<6%Iw?O*IMz6mL}*JnUJdzSQ}D~^>io1#$b+dX zn3~dhO8v#`N=-YqkOuE*T~$xN+BO%lv6XpQh}w9?m*ukTbApDSHHO@t*d#rOK6#tN zbeN46DB!&MUP%lLf6JU!$}H1b1*b`0TskB`pMa7Z-oB%_{up{zc%64;gc%q>C?yJ{ z56d<4m$^(7$ou}HZSVYxSz1tAHlbazy-K19_=r*cH)((#zA8tTtS}71vfyCql#|AI z1A=dFZSQJN#MMto`~0w+vfW+z^lJFozez@C3ofGE`x5#(Tg@tpg} zfh6^*mE(*>gOuB{Izkh1*+fXu0`}P<9;Wdjq6}km#J|}B(dzKk+!?THUy6t8j)aV^ zQesXk&D;J%tU(C+x{lX2gP|rc2te;m-JX6OhzE0if zd5>|9{g@Hw(MIgR*Km)`n$s{XEVS5|uMWt{(6%4!F z74Eq}2?wpm{pYIv!{OOz4Yq980>bj z2@}q2^Z-JH;^E zD;QEEM+m3f@grf3ev-eNB^vJk2o;f~G6R{Ql<;S&?ui>ed)xp`o57Qj*Ar(=-T7gm z_VB``d$ndQsnZ9(vGbxoe!b^7f3X#o-3JDZ-~kInSwotx0e!fcl>iAM$pfz zBbPiSNubw27>Jf)>Ov7pv;<77M3b*xQ+hMYOc{|YFaV=8@FkdtwB9^?xt;qVLK46~ z7+xAb+5?D9CGinCP1U^r#NLC7 zIEJW!`@v8_bSn?-4m&T|XgPSEsK1#BWP~Lr*RU(Dqd5NE&!+Hpn-_9p7<8e{snfxUG)lF5{KyA=cSD86 z$__#XuQi-#9-qPg3bMq~s7icsOb5lO(1vBN$&;iActO?2Fh<*t=l|Pm-lf$fz~gjO zw`xlpy(&s2tI0uyaYiXhj(Cj;SAA82D_8V|5BJ0mo&A%WuU|!0n;hrbK?e~n-2D^x z?8jzB>3B#GMJL8LzQ-IFK1bn_vqfWH)T)H)d;Y|p=R13T090u(hN;-(bB}R$&8668 zOx;)O5y<305de(84!|R5QL!u}vRvzTZ@jdbs{vhmXN)Wav+drI7I(j(pG}?1G(>?S zbhu79cKs6Qcaok1~h9Z)+C*>yf zgtBire~FpuiJNgR#HY%v{ix>M=~pf+UQnYJ$wo{P>?DVB%uNhWNLx^fz^w!RL(Yw) zCG}o?#{7|+ERcCmxt&Tr&4BwRfDwcjcTmrJA9L+?iLJ3I3s=9|7cWV62rvAy)Al%? zAkwJ9+o)zB;bHsI>4}rutw>%4Of2N4rW0q7ciUg-$yEeov5(J8s&TFX{nSgfG|>d( z(i*tZ#ynk4UE}?&zUTaVwW3won2jU&2g-tHFg-855x9*?W0%vT&~X8jZzS~JfO7lI zpGZ)J$2>v1^T5D5A1$goc8nKYlnl_He^@#f1S+Jvt7>gDll<{R4y-+6DGrvNJC35)BW ze~JhKiHUvjC%i#ahA1hste4m#a6A;Xq&7F zH7|iq3>v$C$}Cr42E}NFl6&9kVg?9|L_;p9hB3hJeSNN@jO@T<+`4pV0)+|+FXgOTK_dScwU|`TQ9s)ps6dLEz<&nNK7n#_xEr>wK$iLlviz_r!2td26 zYW?&pcLaU8)FvR*zW)y>Dq2gfhF`T2I?w75y*|xIf^kXF`{SUod5vyT7dZ@!A?? zs7F*=R`xhju9Y;;YVc`CpU!Tn7rv=q&j)8}%Q9<})cM?=@~-h2fis^#@LEflvS!8& z-R~h^A@r(Cm_{;aQ25;X55<{EAmjx$A^PaSHgGXWkuS?cO`YrVBdV`;G2Dy*C3Krk z2rk18M%?NTTodhM8bS&+x}Qf;B-ZYKx1Pgz3cza1L(@A;dhp${orQmWC8UU%Md=)S zu=f+UkFY+rkq|H%gYZW{9G;G(e)U9;EFBdd;@u7He?Lzb`N z+926eTw>UEKBU7Sdp5?_CVz0xMZyABc`_J4Zd-vp-D58aSJUO%DxC6B;nP-Lfb}SO zT%Yzhy%pH1kGe^Z42#Il5;3we*Yc1yP93JvP%&OH!fzLdsp}nEscya zb4pPa-#o7!<>y-X_}gYxg9Rbj7SBohM2F~iSY>gmJQ6;23F|BO|EhQknQ#{G z73o-f%*r;j2!R+_bSs@qQ>6fqC26z-5PSD_Z++*TXeUTdZuLQaJe?Id*eL1}%-{IGg-c6&%fPZA} zK}fPvTAXylpLWia*_VP$nspGYM)B_HFRd2oTi<=A0b<6nQaI8ha$R}IQQ>IDHmTkt zC(7dd3&l-$XJ0b?tc;t-B$+e^Nj|52KmIuEcHxdri3~q;^Og3q;)>8m7m4)gtdD%; zM0#u?&${IV7_Eq1D?xU=d;8S3HG9dnO{_e=8<*^@Hu?@s*X!+fa|KLXsM1DVPDSB2yq(k)R-H`y3+_ec>>;!*cXyr+Z-N@On7f=jeC)4L43|7ET~nSh{%B znq+{ZKw}S+{1<{3$2K7bkE})iF5a?GI~ZBY zCKl9f4Vp%+`h|U*A|aEX z96%3dg!&yDtId_#OM1t)nP-`f^bTCufbXPPN@W4|bqcb~V%p@oBza@Om9#`e`(`aH z)?pl7Y;|+G`&3gc=djeX7<_guA-D}Q_13Cc67IR>*%3uEkX$w{a{V;$JTmLI|0g_Z z>R|AM>-*|C|2ce>S`TvVXP4Ld0p}^vNQ%ZlO|h}Tr77!xYOOMRR|E?C%L8-MhsGS; zj=^{T{GQzgH^hzVR(PWs?z26s%?F}49~+YcCq90oB)<(Mdk^L4WEI5$WU5ZKH$=q?JaDyX*v%tP&uAtsGY87-#p7n3PK zg>`uf=Jru$hI*!xciVPtnkivN+_!6&NjURN(0Tt8igCvLuVc?%6OKHDxpDafs*3mu zlfGOaBHn^Rw_vLOAs%rIZF+ruU^Ul+778V}*!NJJ_sE979>wOIu?BOb!W|@NXwpF_ zZTwH^9cQmlQ174JnmLGrDiX)R&7d@zdu+k`#BBbXRskC1l|&!+N+;n4y%!Ljk&@$J8>o|xXH0?6kI24;KcHU>)$6ww^ORp& z)WzUfVI`QWbi$%4nlhcFja?`s-I|OnM{#5sD5g+94N_Sc^j|aDH~9RKa1U~e0p`0= zTL3Xz)-Ij@E1@$UA|;7C8Mr3Heiu#e1{j$9JuAj)5FPepJ{8t>3jC~XF}NaiKEu*j z;^DWDS;4q)5SJT^nye7*vFGh*PTmXrSitqy3Mp50Unrt8V`hZL1?5LT`ab}jKw`hL z&0hVFc_hz3%om;48E=B`z#yw8P!)kZ-F=|VKvDQ}b z<7?U!`WHmvSNne_ACdeQwhZtf0DugDnqver1Cso0K{F8BALskE8;;IK5U}V{q9Es* z1U`-&KSDC!As=r}1~`m$^2o!|5t3X2(SUbslxm$qp-joJZqpfSvUNUE*~E(w9R z>Ukqc!a2J?4X1= z*n?Ma-Dj~Gv3~f8_IZ0)Q%z6{s*xssI68AQJ8p424RC z9i9G4`z65-d;K#2DEpiX0R0xE*v~S2*sJYd7=NeIzr_D{!8rcaz)#Ep1Beyhb9k_= zsG}yIdT!g5Rr~fRD6IZgt#u|Q*X{>Mz9U)q;L~!tUS`DjT_pTaB>Di-K1lv0;g1L| ztN{R~pZdD(#Q87;4NvS)6Clw>s=?q?%?!5UoVaGAp>q)g%v2K)O%q3s9id~79-=qB z@vSLhz!eYKEbQd`El)o2#Nqe<>J>6t)Bu2VpPB= z{q<=-KKS(GM~@%A>-YZHhs~{h&wKgvM(bCtk)I^SAG24TJn%5>=(R?oy1l|QQg4YL(Cc3R zreuC~WkEc4{MbYP@4xvMKlD$2+SmPVFzVC*swoX1Yy7=UNnr>a9laHTF>i_tr zFTU|Qdiy(XO9eJ&Tbne!v`N#gDb1(M{2^br5lJwtFBr*H2{G8Wl=oW1B#gz0Em-WJ z#FD3V%EQHI7=0Kx2BZkVpGfc(0qki5RJ~(7ye}hI!1c!7XlXNmAtto-eh2`gn@2^u9!>nriUai_T$ICx`lDg#jCFgLfCA(S*L`m8vwqUithQOiZ zpO`5#RR#g^H;n`HjWcob%-kd&dm*s%1<^d^W+#fSP_s4^CK_y*TxA*<(r%!ssrFfD zJm&YO9`m<(3;Izj^~UXy0#(BNbNl(7+77(_cToNFiwG2~pI-qr9#0Ff`zlNOJ~o^Y zHE!N$Z!}kj0d~C#pL$>Aj|wOlq*zVQu*9n!003N~g?y?`no^=?_iF7NrU4X8j6dcc zkZa1rS@VFYfZLLN6srcNOsEUKj}wzskq@aOPoFt9r!(8JZp#Wa&4{*V)Bo$->Bs;1 zY_`2$b0G<>41@FvH9}D6%xD6>z!3m(i(u!O*hZi4Glo@KMnZG?KM-#%wy9dTp5l_9 zAyQv}wMV65r!PclV2$?>HKh1v_qyD=!g^ep$RRluE!r@1)JEbOx)2ugMYp}VJsXdF zQ)&vFdF1{B_rL14FI%jvuDGiCm zK1X!*NcNM@~h=T zGY3Wgg&F`2e>0(doHY;B{K6!vqCZvmtvb1Re#1ED3S;y{U1Z3C31PXeD~z`8KYSkn zG0Oae@jC@A*6|OW7mLb2L;R)8-vBa*8}Hb|zc7;d!g~Fq)1LxVoK5|~N_`b{{(0|Y zUewNlx>@Z~e2J9Q#^vA3Q)7EdAEhuG5$oYLMsHbDRI!< z$R`s3jnWxuh>KJ#_@aJ|6peBl?!W+qlyyJ`7}#6NPn<43Cu&)}ubzW}tP=YPc-UbLTR;&+4Gu3UlWOVqSrCXp zBd+H}Pp0V<9}VZ=s?WvL(Y`xkX`HUU7wA2t(^WeNdh1c!rdkGYa1 z6HO5ew$1f+R%X=XS*wOm3#w`3jElg9^O_Eto)OYC26hnkBw!ykOIH8I8V`Mjje5u+ zfSv4Wpbv&wbsqL!LWmIr@L!|#tHYQjzCZM9jkK!vN1p%{AWA)n;0kET6no?wdhN^h z(f!A#bnk)VKi$^=T3dgQSX|i}{-S~cpAP_F5mXScZfx=A>sTZqWzSAsuXsMGY{v3q zn)|#gka4Sq!7zPZY7SRv*?g? zLOAlx*v+1N#aDjgbaCO>N;kVe3r_{9=LOpoR2>TnjapA#7Xg5m$tmqB%-<#EuRx_u zsyNN^6@ZD^Dtvvo6(F&{E4q%_#&1bmz)sU6W&CVL)*`WkSdYUjzq2z#2DsJ)P*G*` z@A%pw3Em;%2hqRQ0uTTa>234E4&FKFbgsaPHl8lKv8tcM&c!4QeLSq624?Z|AWi$) z+aF@(9lS~p00g@>k_1ZGZk99vAv5LBl=%}GsLvV}sQ_7lIM!e|Qgyci05WQRarEmI z_#r9p+G{s6C&RcjaZHDv{%xSS!=ygE1o}o=&lE6`-Se+YcfDT zRX~siw368LFE&lU=MDf+FdVi6ke;m-150|AU%)U%@bW+IQ z5qFeJE15X69a-vK$eOnZ16&lqT}WlLDXIcOXvl})LvW#qMASu1z{yAU-+S%LZn|x< zeTo*_XOil3(Rdn-JauDF?ZQ)N%O^2^uc1Aq`NI4&iH+IY^TKO0Vd)%!$)GH5mX?I^ z0V0Qi@*q*m8k1hq_-{v6y(m%<{1#8EI?|rk9>%nJwjhe&2DoS77StLA(uImz1}4*} z21O9CBl8wQPjVNYu|29XaEOmr(6`zO`vL8Y@%XP|`jh(H=VUoUp?=LX@ zOiIUHRzb&SbSD2lOR*vMX~#}%q^3IbW2o{K3`+jqs{MO)3I@7To>ob)Cfu*6{@Dz$ z=v4A=J67x3%!fTRgpb&&2oHC5nzI3O)Y>BB~)iA zQjkF~S~Vqjtai_L!~FWzpQG=;)1Sn;4%CEL_PN63pf;dCmfXc%7`FRs1=3D{ol1fV zM5vfUa}c>t5dgj!(a~ck|1)<&SNB7ZX$#Jt+HXh~@IwRS;frDW905Sc)P%{5v6B^6 z8l2K(v)W|G2w4&{V9vPuH>MGQ84a8_cXCYI(IA0=Z`DmLgN=ra=h2nW1RCAC8_ z=4HEnW}zqd-*L}%x4!MR$=;K+*gi|`^a8cB5q0wsb&H0&#VDBsLg-}LF#uqDemc+ z8QS@42^%H#`r73Z_;S&FDc>i&DIc#A1TC44%Ls)LjL;LmDqtau(`k5LX8h{$pH$`z z*(`sKN_DHM#b%5%^Qeb0{;uIG06yb*#xYDxw73K?Gv)WPj(=#P098L%^&6;H;FhTU z#rz}08PwPq?pJyIFF5sYsGJxFB;5XnU=K0h09X*FWI=$L4^E#Zqz1JKFgcXX1=R`# z1P)e1hhP_}Ax1fL0)Et4vPUNn@5(-`5S~Z;`gNGGl$r+T#?lcr5a4!5=20jK+y$-E zAm)-vC?UcGKTT%-2>^^~|IsJ@y}XNvgLbs-e5xiw#qr(HHD4s#=Kuf(@KSB9r^+iy zX7^=O1w?ih4Go=R#$Qid6!1w1+Tb&+FbSM71U9UP><{R;K7WWnG^zr;mzCy9bK-?3 z_kZ%i#ny#$qusCAyE;8Z-TWej#TJEbM$|2mFF^j3SsPd}xyS@t7)4i{0I8_p;$q1r zfE24+9F=O1ZMz@DUx1wiSzDl*1C^9;*)eKXK%m`XdNC-~L>5Y{7Olqvhit%Kz<>o% zZPt!~7B!+kr&cC(D6GeR7z}{)Be=i;@eji{sZpd5&OTvO#%ZPI#(~sd+0D@;z-m}b zk&8gUHqV*1aoz`VYzoNnzoFq3rV?OwI4!DVygNiNc&SW?dHx}#Z_zT?lD_KvSWOo* zPF>k=E9TFt|9NHq7pFf7`(rIaJ=V2~e}_5Y037K|lzx|^K%QKEzM8BohdA~Hsa&ER ziZK=Qr=WAxtas9kdO7mJX%r8F18{T;rtMU{J);(!zhJ_uGyqs`Tz@0v%`kec${6%m zVBwKU@8HBx5D>Ef#)Lo3XhJ8>Ui$Fq^B3>yOY#BS5R|H!>+0&I&?lG0i~o~upO+J$ z*nYzxZ)Z|pu9cx3+yWU8*rWCJm=&`^aAvuvK#}QxuCbnu`s&$%MR0Z|5HhKDJ@qI_ zCqr<-Dx~wBqQl_!=5%)IzTf=g8(#One*I|QEwsA0NYqX#gax@I^>;<$R{$WS82UyT zzc1?`kS|(*F6G4T3c5yTA7J>2S*x?40SZhU<<&wlD_F3A(s#%$7e?8MNgyBVNSv6V zZ|(10kKv;|RJ94UVFu?}2tg!8GcnMQz%eizmgLD*zu|rdVs9qekSRcg#=*I)(j2z} zvRWY!sFVGmr@WD{ZO#CGzJgop3sdb{?M$3fT_oJ>d9I5g`J8Z>XivuBRG*1?{%uYI zbOdCu(g5>EJ08JfnSG*~x~rwfQns3zKgRoGnqQWR`MrAs1LmIoF&J1H0C&)4VaHDA zI-b|>s{SWX`Fr*YDRYF6JDB)EA7#eUfPGBbRpr?42?wUXt9|SX(UNi>FnEl%&|spB zLNP~mPR&fvMJ7#i0s}3^{Of}Q72gwK`c(dMX1^wd{l)OVdk-CYKf5&r=p+<=i0u2@ zm#nTI8sjgb?ehWv$2%ljB0V)VM^Fj^|=(=t`ozEY?`?v1A?#us|H~WD9|C0i)lD=PmMRQ|k=%)bi*HvfUK2A`Br zgG3R0gZR|Q9UM#|{tgwU)wrpSo&>6W$LY2;cey%pqPB?d!pH)F25A$Jxiizps0R!9 zsn;)`ji~EDE5zE1=mVXl|J+x;%kwE{2Nw-x{;N_yXlhyr0tb7of-kmpWz~PHC( z(CG`?A3JpX+1!F>>6r#-8gj`M!>~nhQ zR6@8Z1%px;;K;?qLCtvV{bcN$aT925t)-0@zUgK++MuS1=_|HUI^d-KCr!1d+5nyN z#PQXXC1k0`52X+FFRF!E;(~K%zvE8z>{VMi`S3`Br03wfUV)9Rxe$Jb-vNWMm#E~5 z7}5xeJ*H8$gEw$Vuvf4|VZ~2mNXo43Q(X0c9ccqd_^9@;Gv#@S>nACTJN6Fp;yWWn zYkquQFjd&!l`?;WqxFPl;=+04jP{{vp!~3yC`wzoy-?Aw0Z)H4Q`FBl5-Aqz=~TVn z4l@5>)&AfF7YuW|yj;Q*O6IxA%7+r_@l*#Pe$Z}CMNVAFuV?_YL&f7i zs{W(RKdSymleO@Bci#VJ&RzQd+IzE}OOoVD%-kdH@@=_i?R!;sHM^VarZ|E?NDu~) z27+D$NPwUx{R2Ty0;C810!eRrkpN);4Mk~Y$Qdr0nVuFY4W~)=zE^d3b=SURRqo5T z-zCC@aCb91<`MVH%${N~E9-jV%X@D`+_#OMuwEIx*hmChk&sN=pgx@~019q^ZaENas7Fic z-DH**h(v)FNrG6ic6Q=#;H*0#PuS0tnzLcGZI>RP4U3{K&E)_9AOJ~3K~#Cu939T) zmw)nS-#`80-~G+Wxz9i2wmwIrFpqA4)H{Iy3|c8UsL;3MmPD;@sS7#imUT)%w9tG@ zRqG&;hFb64=Wg4!-@$!Y%@2>MpAXEwkz@{l{a0Q1Fkj_mmL8+^ z +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⪼``RRG8r#nOV!C&&`tM7Jj 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 qdr=n~)ID88{GZ<+^yGSf#r`L{;1xWTI{x}SK Date: Fri, 27 May 2022 01:32:47 +0100 Subject: [PATCH 35/47] chore(op): need check trade on 0x000 address --- packages/web3-constants/evm/token.json | 2 +- packages/web3-providers/src/zerion/format.ts | 3 +-- packages/web3-shared/evm/assets/chains.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 36ce981404d9..a6b4d1d6b3b0 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -1390,7 +1390,7 @@ "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", "xDai": "0x0000000000000000000000000000000000000000", - "Optimism": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "Optimism": "0x0000000000000000000000000000000000000000", "Optimism_Kovan": "0x0000000000000000000000000000000000000000", "Optimism_Goerli": "0x0000000000000000000000000000000000000000", "Avalanche": "0x0000000000000000000000000000000000000000", diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index 266c2b085d1f..0b3cf92e4e25 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -56,8 +56,7 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => - ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'ONE', 'OETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'ONE'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 7399b3db98f8..e3524795c62e 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -309,7 +309,7 @@ "features": [], "nativeCurrency": { "name": "Ether", - "symbol": "OETH", + "symbol": "ETH", "decimals": 18 }, "infoURL": "https://Optimistic.etherscan.io/", From cb7b21a858d428807f8017911bb9a3fd2abf8ebf Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 1 Jun 2022 21:05:22 +0100 Subject: [PATCH 36/47] chore(optimism): revert comment changes --- .i18n-codegen.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.i18n-codegen.json b/.i18n-codegen.json index 2da603920852..361f2619c2ff 100644 --- a/.i18n-codegen.json +++ b/.i18n-codegen.json @@ -222,18 +222,6 @@ "trans": "Translate" } }, - { - "input": "./packages/mask/src/plugins/RedPacket/locales/en-US.json", - "output": "./packages/mask/src/plugins/RedPacket/locales/i18n_generated", - "parser": { "type": "i18next", "contextSeparator": "$", "pluralSeparator": "_" }, - "generator": { - "type": "i18next/react-hooks", - "hooks": "useI18N", - "namespace": "com.maskbook.red_packet", - "trans": "Translate", - "sourceMap": "inline" - } - }, { "input": "./packages/mask/src/plugins/Tips/locales/en-US.json", "output": "./packages/mask/src/plugins/Tips/locales/i18n_generated", From 390e132fe84897575ef706e170902a976580d02d Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 2 Jun 2022 17:27:45 +0100 Subject: [PATCH 37/47] chore(optmism): i18n-codegen fix --- .i18n-codegen.json | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/.i18n-codegen.json b/.i18n-codegen.json index 361f2619c2ff..831ba5bd6430 100644 --- a/.i18n-codegen.json +++ b/.i18n-codegen.json @@ -265,30 +265,6 @@ "namespace": "com.maskbook.gitcoin", "trans": "Translate" } - }, - { - "input": "./packages/mask/src/plugins/Trader/locales/en-US.json", - "output": "./packages/mask/src/plugins/Trader/locales/i18n_generated", - "parser": { "type": "i18next", "contextSeparator": "$", "pluralSeparator": "_" }, - "generator": { - "type": "i18next/react-hooks", - "hooks": "useI18N", - "namespace": "com.maskbook.trader", - "trans": "Translate", - "sourceMap": "inline" - } - }, - { - "input": "./packages/mask/src/plugins/Gitcoin/locales/en-US.json", - "output": "./packages/mask/src/plugins/Gitcoin/locales/i18n_generated", - "parser": { "type": "i18next", "contextSeparator": "$", "pluralSeparator": "_" }, - "generator": { - "type": "i18next/react-hooks", - "hooks": "useI18N", - "namespace": "com.maskbook.gitcoin", - "trans": "Translate", - "sourceMap": "inline" - } } ] } From 38cfde0164a8317d960549603e02b4ac4cfe7551 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 21 Jun 2022 12:27:08 +0000 Subject: [PATCH 38/47] chore(optimism): fixed review --- packages/mask/shared/flags.ts | 2 +- .../SNSAdaptor/RedPacketInHistoryList.tsx | 4 ++-- packages/mask/src/plugins/Trader/constants/0x.ts | 3 +-- packages/mask/src/plugins/UnlockProtocol/base.ts | 2 +- .../mask/src/plugins/Wallet/services/account.ts | 2 +- packages/web3-constants/evm/explorer.json | 6 +++--- packages/web3-constants/evm/mask-box.json | 2 +- packages/web3-constants/evm/rpc.json | 2 +- packages/web3-constants/evm/token-list.json | 9 ++++----- packages/web3-constants/evm/zerion.json | 2 +- packages/web3-shared/evm/constants/chains.json | 15 +++++++-------- 11 files changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/mask/shared/flags.ts b/packages/mask/shared/flags.ts index e08aaf0b6e59..aa8eccecf6af 100644 --- a/packages/mask/shared/flags.ts +++ b/packages/mask/shared/flags.ts @@ -30,7 +30,7 @@ export const Flags = { polygon_enabled: true, arbitrum_enabled: true, xdai_enabled: true, - Optimism_enabled: true, + optimism_enabled: true, avalanche_enabled: true, fantom_enabled: true, celo_enabled: true, diff --git a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx index cb26c09c0646..aa9815bc87e3 100644 --- a/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx +++ b/packages/mask/src/plugins/RedPacket/SNSAdaptor/RedPacketInHistoryList.tsx @@ -248,7 +248,7 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { {t.history_total_amount({ amount: formatBalance(history.total, historyToken?.decimals, 6), - symbol: historyToken?.symbol!, + symbol: historyToken?.symbol, })} @@ -328,7 +328,7 @@ export function RedPacketInHistoryList(props: RedPacketInHistoryListProps) { historyToken?.decimals, 6, ), - symbol: historyToken?.symbol!, + symbol: historyToken?.symbol, }} /> diff --git a/packages/mask/src/plugins/Trader/constants/0x.ts b/packages/mask/src/plugins/Trader/constants/0x.ts index 6c1c218e1456..e8bb3312e04f 100644 --- a/packages/mask/src/plugins/Trader/constants/0x.ts +++ b/packages/mask/src/plugins/Trader/constants/0x.ts @@ -6,7 +6,7 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Polygon]: 'https://polygon.api.0x.org/', [NetworkType.Arbitrum]: 'https://arbitrum.api.0x.org/', [NetworkType.xDai]: 'https://xdai.api.0x.org/', - [NetworkType.Optimism]: 'https://Optimism.api.0x.org/', + [NetworkType.Optimism]: 'https://optimism.api.0x.org/', [NetworkType.Avalanche]: 'https://avalanche.api.0x.org/', [NetworkType.Celo]: 'https://celo.api.0x.org/', [NetworkType.Fantom]: 'https://fantom.api.0x.org/', @@ -14,7 +14,6 @@ export const ZRX_BASE_URL: Record = { [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', - [NetworkType.Optimism]: '', [NetworkType.Harmony]: '', [NetworkType.Conflux]: '', } diff --git a/packages/mask/src/plugins/UnlockProtocol/base.ts b/packages/mask/src/plugins/UnlockProtocol/base.ts index 027ffe12e571..4754dec47b1a 100644 --- a/packages/mask/src/plugins/UnlockProtocol/base.ts +++ b/packages/mask/src/plugins/UnlockProtocol/base.ts @@ -14,7 +14,7 @@ export const base: Plugin.Shared.Definition = { target: 'insider', web3: { [NetworkPluginID.PLUGIN_EVM]: { - supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby, ChainId.Optimism], + supportedChainIds: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, [NetworkPluginID.PLUGIN_SOLANA]: { supportedChainIds: [] }, diff --git a/packages/mask/src/plugins/Wallet/services/account.ts b/packages/mask/src/plugins/Wallet/services/account.ts index 60447878e502..67670fbf88e0 100644 --- a/packages/mask/src/plugins/Wallet/services/account.ts +++ b/packages/mask/src/plugins/Wallet/services/account.ts @@ -64,7 +64,7 @@ export async function getSupportedNetworks() { Flags.polygon_enabled ? NetworkType.Polygon : undefined, Flags.arbitrum_enabled ? NetworkType.Arbitrum : undefined, Flags.xdai_enabled ? NetworkType.xDai : undefined, - Flags.Optimism_enabled ? NetworkType.Optimism : undefined, + Flags.optimism_enabled ? NetworkType.Optimism : undefined, Flags.celo_enabled ? NetworkType.Celo : undefined, Flags.fantom_enabled ? NetworkType.Fantom : undefined, Flags.avalanche_enabled ? NetworkType.Avalanche : undefined, diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 257fc3acf475..3dd782754f6e 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -38,9 +38,9 @@ "Arbitrum": "https://api.arbiscan.io/api", "Arbitrum_Rinkeby": "", "xDai": "https://blockscout.com/xdai/mainnet/api", - "Optimism": "https://api-Optimism.etherscan.io/api", - "Optimism_Kovan": "https://kovan-Optimism.etherscan.io", - "Optimism_Goerli": "https://goerli-Optimism.etherscan.io", + "Optimism": "https://api-optimistic.etherscan.io/api", + "Optimism_Kovan": "https://kovan-optimistic.etherscan.io", + "Optimism_Goerli": "https://goerli-optimistic.etherscan.io", "Avalanche": "https://api.snowtrace.io/api", "Avalanche_Fuji": "https://api-testnet.snowtrace.io/api", "Celo": "https://explorer.celo.org/api", diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index 00151738ec1a..5ee57e0038e7 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -38,7 +38,7 @@ "Arbitrum": 0, "Arbitrum_Rinkeby": 0, "xDai": 0, - "Optimism": 2283229, + "Optimism": 1272779, "Optimism_Kovan": 0, "Optimism_Goerli": 0, "Avalanche": 8351767, diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index 962b8e5efbfa..382719aaf616 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -90,7 +90,7 @@ "Arbitrum": [0, 0, 0, 0, 0], "Arbitrum_Rinkeby": [0, 0, 0, 0, 0], "xDai": [0, 0, 0, 0, 0], - "Optimism": [0, 1, 2, 3, 4], + "Optimism": [0, 1, 2, 2], "Optimism_Kovan": [0, 0, 0, 0], "Optimism_Goerli": [0, 0, 0, 0], "Avalanche": [0, 0, 0, 0, 0], diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index f69f7464c535..65a741276c2c 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -12,11 +12,7 @@ "Arbitrum": ["https://tokens.r2d2.to/latest/42161/tokens.json"], "Arbitrum_Rinkeby": ["https://tokens.r2d2.to/latest/421611/tokens.json"], "xDai": ["https://tokens.r2d2.to/latest/100/tokens.json"], - "Optimism": [ - "https://static.optimism.io/optimism.tokenlist.json", - "https://tokens.r2d2.to/latest/10/tokens.json", - "https://token-list.sushi.com" - ], + "Optimism": ["https://tokens.r2d2.to/latest/10/tokens.json"], "Optimism_Kovan": [], "Optimism_Goerli": [], "Avalanche": ["https://tokens.r2d2.to/latest/43114/tokens.json"], @@ -42,6 +38,9 @@ "Arbitrum": [], "Arbitrum_Rinkeby": [], "xDai": [], + "Optimism": [], + "Optimism_Kovan": [], + "Optimism_Goerli": [], "Avalanche": [], "Avalanche_Fuji": [], "Celo": [], diff --git a/packages/web3-constants/evm/zerion.json b/packages/web3-constants/evm/zerion.json index c337166a5abc..106a9bce00e3 100644 --- a/packages/web3-constants/evm/zerion.json +++ b/packages/web3-constants/evm/zerion.json @@ -12,7 +12,7 @@ "Arbitrum": "arbitrum-assets", "Arbitrum_Rinkeby": "", "xDai": "xdai-assets", - "Optimism": "Optimism-assets", + "Optimism": "optimism-assets", "Optimism_Kovan": "", "Optimism_Goerli": "", "Avalanche": "avalanche-assets", diff --git a/packages/web3-shared/evm/constants/chains.json b/packages/web3-shared/evm/constants/chains.json index 3259349d4361..7f812e61b91c 100644 --- a/packages/web3-shared/evm/constants/chains.json +++ b/packages/web3-shared/evm/constants/chains.json @@ -322,7 +322,7 @@ }, { "chainId": 10, - "name": "Optimism Ethereum", + "name": "Optimism", "chain": "Optimism", "network": "mainnet", "features": [], @@ -343,8 +343,8 @@ }, { "chainId": 69, - "name": "Optimism Ethereum Testnet Kovan", - "chain": "KOR", + "name": "Optimism Testnet Kovan", + "chain": "Optimism", "network": "testnet", "rpc": ["https://kovan.optimism.io/"], "faucets": [], @@ -361,8 +361,8 @@ }, { "chainId": 420, - "name": "Optimism Ethereum Testnet Goerli", - "chain": "Goerli", + "name": "Optimism Testnet Goerli", + "chain": "Optimism", "network": "testnet", "rpc": ["https://goerli.optimism.io/"], "faucets": [], @@ -926,7 +926,7 @@ { "chainId": 69, "type": "Optimistic", - "name": "OPT", + "name": "Optimism", "network": "kovan", "shortName": "okov", "features": [], @@ -1436,8 +1436,7 @@ }, { "chainId": 420, - "type": "Optimistic", - "name": "OPT", + "name": "Optimism", "network": "goerli", "shortName": "ogor", "features": [], From 63ae742df6f115f0c3decd5bc15b1fcbadc89452 Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 5 Jul 2022 21:42:34 +0000 Subject: [PATCH 39/47] chore(op): fixed chain type optimism and logo token url --- packages/web3-shared/evm/constants/chains.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/web3-shared/evm/constants/chains.json b/packages/web3-shared/evm/constants/chains.json index 7f812e61b91c..c7c4a17c4512 100644 --- a/packages/web3-shared/evm/constants/chains.json +++ b/packages/web3-shared/evm/constants/chains.json @@ -323,6 +323,7 @@ { "chainId": 10, "name": "Optimism", + "type": "Optimism", "chain": "Optimism", "network": "mainnet", "features": [], @@ -330,14 +331,15 @@ "chainId": 10, "name": "Ether", "symbol": "ETH", - "decimals": 18 + "decimals": 18, + "logoURI": "https://logo.chainbit.xyz/eth" }, - "infoURL": "https://Optimistic.etherscan.io/", + "infoURL": "https://optimistic.etherscan.io/", "shortName": "op", "explorers": [ { "name": "optimisc", - "url": "https://Optimistic.etherscan.io/" + "url": "https://optimistic.etherscan.io/" } ] }, From befe600f2f1521e7400eebbe81e4839b650263ad Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Tue, 26 Jul 2022 14:47:35 +0800 Subject: [PATCH 40/47] fix: incorrect network type --- packages/web3-providers/src/rabby/helpers.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-providers/src/rabby/helpers.tsx b/packages/web3-providers/src/rabby/helpers.tsx index 22146649a6a3..9c3231b9cb84 100644 --- a/packages/web3-providers/src/rabby/helpers.tsx +++ b/packages/web3-providers/src/rabby/helpers.tsx @@ -80,7 +80,7 @@ export const resolveNetworkOnRabby = createLookupTableResolver Date: Tue, 26 Jul 2022 21:59:46 +0800 Subject: [PATCH 41/47] fix: bugfix --- .../dashboard/src/pages/Wallets/hooks/useGasConfig.ts | 2 +- packages/mask/src/plugins/Approval/SNSAdaptor/pipes.ts | 2 +- packages/mask/src/plugins/Trader/apis/trader/index.ts | 8 +------- packages/web3-constants/evm/ethereum.json | 2 +- packages/web3-shared/evm/constants/chains.json | 6 +++--- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/dashboard/src/pages/Wallets/hooks/useGasConfig.ts b/packages/dashboard/src/pages/Wallets/hooks/useGasConfig.ts index 4b28631e388c..30284cb131b7 100644 --- a/packages/dashboard/src/pages/Wallets/hooks/useGasConfig.ts +++ b/packages/dashboard/src/pages/Wallets/hooks/useGasConfig.ts @@ -75,7 +75,7 @@ export const useGasConfig = (gasLimit: number, minGasLimit: number) => { maxFeePerGas: toHex(new BigNumber(maxFee).integerValue().toFixed()), maxPriorityFeePerGas: toHex(new BigNumber(priorityFee).integerValue().toFixed()), } - : { gas: gasLimit_, gasPrice: new BigNumber(gasPrice).toNumber() } + : { gas: gasLimit_, gasPrice: toHex(formatGweiToWei(gasPrice).toString()) } }, [is1559Supported, gasLimit_, maxFee, priorityFee, gasPrice, chainId]) return { diff --git a/packages/mask/src/plugins/Approval/SNSAdaptor/pipes.ts b/packages/mask/src/plugins/Approval/SNSAdaptor/pipes.ts index 4945c64fcee4..a109aad46905 100644 --- a/packages/mask/src/plugins/Approval/SNSAdaptor/pipes.ts +++ b/packages/mask/src/plugins/Approval/SNSAdaptor/pipes.ts @@ -15,7 +15,7 @@ export const resolveNetworkOnRabby = createLookupTableResolver Date: Tue, 26 Jul 2022 22:56:44 +0800 Subject: [PATCH 42/47] fix: remove useless dex --- cspell.json | 2 - .../src/plugins/Trader/apis/trader/index.ts | 16 +- .../plugins/Trader/constants/elkfinance.ts | 37 -- .../src/plugins/Trader/constants/index.ts | 2 - .../src/plugins/Trader/constants/zipswap.ts | 15 - packages/mask/src/plugins/Trader/pipes.ts | 2 - .../Trader/trader/useAllTradeComputed.ts | 391 ++++++++---------- .../Trader/trader/useGetTradeContext.ts | 30 -- .../plugins/Trader/trader/useTradeCallback.ts | 4 - .../mask/src/plugins/Trader/types/trader.ts | 2 - packages/public-api/src/web.ts | 2 - packages/web3-constants/evm/trader.json | 208 ---------- .../evm/constants/getContractOwnerDomain.ts | 3 - packages/web3-shared/evm/constants/tokens.ts | 2 - 14 files changed, 182 insertions(+), 534 deletions(-) delete mode 100644 packages/mask/src/plugins/Trader/constants/elkfinance.ts delete mode 100644 packages/mask/src/plugins/Trader/constants/zipswap.ts diff --git a/cspell.json b/cspell.json index 6af2d8074744..20dc6c439758 100644 --- a/cspell.json +++ b/cspell.json @@ -71,7 +71,6 @@ "dklen", "dompurify", "ecsign", - "elkfinance", "endregion", "enhanceable", "entitlee", @@ -253,7 +252,6 @@ "xdai", "xlarge", "zerion", - "zipswap", "zora", "zubin" ], diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 7219687dd2ea..6e14ed5a9247 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -17,7 +17,6 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.BANCOR, TradeProvider.OPENOCEAN, TradeProvider.MDEX, - TradeProvider.ELKFINANCE, ] case NetworkType.Polygon: return [ @@ -28,7 +27,6 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.ZRX, TradeProvider.OPENOCEAN, TradeProvider.TRISOLARIS, - TradeProvider.ELKFINANCE, ] case NetworkType.Binance: return [ @@ -38,20 +36,13 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.ZRX, TradeProvider.OPENOCEAN, TradeProvider.MDEX, - TradeProvider.ELKFINANCE, ] case NetworkType.Arbitrum: - return [TradeProvider.UNISWAP_V3, TradeProvider.OPENOCEAN, TradeProvider.ELKFINANCE, TradeProvider.DODO] + return [TradeProvider.UNISWAP_V3, TradeProvider.OPENOCEAN, TradeProvider.DODO] case NetworkType.xDai: - return [TradeProvider.SUSHISWAP, TradeProvider.ELKFINANCE, TradeProvider.OPENOCEAN] + return [TradeProvider.SUSHISWAP, TradeProvider.OPENOCEAN] case NetworkType.Avalanche: - return [ - TradeProvider.SUSHISWAP, - TradeProvider.ELKFINANCE, - TradeProvider.OPENOCEAN, - TradeProvider.TRADERJOE, - TradeProvider.PANGOLIN, - ] + return [TradeProvider.SUSHISWAP, TradeProvider.OPENOCEAN, TradeProvider.TRADERJOE, TradeProvider.PANGOLIN] case NetworkType.Celo: return [TradeProvider.SUSHISWAP] case NetworkType.Fantom: @@ -66,7 +57,6 @@ export async function getAvailableTraderProviders(chainId: ChainId) { TradeProvider.VENOMSWAP, TradeProvider.OPENSWAP, TradeProvider.DEFIKINGDOMS, - TradeProvider.ELKFINANCE, ] case NetworkType.Boba: case NetworkType.Fuse: diff --git a/packages/mask/src/plugins/Trader/constants/elkfinance.ts b/packages/mask/src/plugins/Trader/constants/elkfinance.ts deleted file mode 100644 index 9ee7af670586..000000000000 --- a/packages/mask/src/plugins/Trader/constants/elkfinance.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - ChainId, - DAI, - RUNE, - USDC, - USDT, - fUSDT, - WBTC, - WNATIVE, - WNATIVE_ONLY, - NFTX, - STETH, - BUSD, - BTCB, - ELK, -} from '@masknet/web3-shared-evm' - -import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' - -/** - * Some tokens can only be swapped via certain pairs, - * so we override the list of bases that are considered for these tokens. - */ -export const ELKFINANCE_CUSTOM_BASES: ERC20TokenCustomizedBase = {} - -export const ELKFINANCE_BASE_AGAINST_TOKENS: ERC20AgainstToken = { - ...WNATIVE_ONLY, - [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC, RUNE, NFTX, STETH, ELK].map((x) => x[ChainId.Mainnet]), - [ChainId.Matic]: [WNATIVE, USDC, WBTC, DAI, USDT, ELK].map((x) => x[ChainId.Matic]), - [ChainId.BSC]: [WNATIVE, DAI, BUSD, USDC, USDT, BTCB, ELK].map((x) => x[ChainId.BSC]), - [ChainId.xDai]: [WNATIVE, USDC, USDT, WBTC, ELK].map((x) => x[ChainId.xDai]), - [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC, ELK].map((x) => x[ChainId.Fantom]), - [ChainId.Avalanche]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Avalanche]), - [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Harmony]), - [ChainId.Optimism]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Optimism]), - [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ELK].map((x) => x[ChainId.Arbitrum]), -} diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index d5ed1b289856..ce097d0795d9 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -17,6 +17,4 @@ export * from './venomswap' export * from './openswap' export * from './mdex' export * from './defikingdoms' -export * from './elkfinance' -export * from './zipswap' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/zipswap.ts b/packages/mask/src/plugins/Trader/constants/zipswap.ts deleted file mode 100644 index 4856aa4a6f82..000000000000 --- a/packages/mask/src/plugins/Trader/constants/zipswap.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ChainId, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY, ZIP } from '@masknet/web3-shared-evm' - -import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' - -/** - * Some tokens can only be swapped via certain pairs, - * so we override the list of bases that are considered for these tokens. - */ -export const ZIPSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} - -export const ZIPSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { - ...WNATIVE_ONLY, - [ChainId.Optimism]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Optimism]), - [ChainId.Arbitrum]: [WNATIVE, DAI, USDC, WBTC, USDT, ZIP].map((x) => x[ChainId.Arbitrum]), -} diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 95e1aab560d7..b67468570926 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -46,8 +46,6 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index 41abfe932d10..5d1e7ee7a934 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -2,31 +2,14 @@ import { EMPTY_LIST } from '@masknet/shared-base' import { FungibleToken, multipliedBy, pow10 } from '@masknet/web3-shared-base' import { useTrade as useNativeTokenTrade } from './native/useTrade' import { useTradeComputed as useNativeTokenTradeComputed } from './native/useTradeComputed' -import { SwapOOData, TagType, TradeInfo, TradeStrategy } from '../types' +import { TagType, TradeInfo, TradeStrategy } from '../types' import { useV3Trade as useUniswapV3Trade } from './uniswap/useTrade' import { useTradeComputed as useUniswapTradeComputed } from './uniswap/useTradeComputed' import { useTradeGasLimit as useUniswapTradeGasLimit } from './uniswap/useTradeGasLimit' -import { useUniswapV2Like } from './uniswap/useUniswapV2Like' -import { useTrade as useZrxTrade } from './0x/useTrade' -import { useTradeComputed as useZrxTradeComputed } from './0x/useTradeComputed' -import { useTradeGasLimit as useZrxTradeGasLimit } from './0x/useTradeGasLimit' -import { useTrade as useBalancerTrade } from './balancer/useTrade' -import { useTradeComputed as useBalancerTradeComputed } from './balancer/useTradeComputed' -import { useTradeGasLimit as useBalancerTradeGasLimit } from './balancer/useTradeGasLimit' -import { useTrade as useDODOTrade } from './dodo/useTrade' -import { useTradeComputed as useDODOTradeComputed } from './dodo/useTradeComputed' -import { useTradeGasLimit as useDODOTradeGasLimit } from './dodo/useTradeGasLimit' -import { useTrade as useBancorTrade } from './bancor/useTrade' -import { useTradeComputed as useBancorTradeComputed } from './bancor/useTradeComputed' -import { useTradeGasLimit as useBancorTradeGasLimit } from './bancor/useTradeGasLimit' -import { useTradeComputed as useOpenOceanTradeComputed } from './openocean/useTradeComputed' -import { useTrade as useOpenOceanTrade } from './openocean/useTrade' -import { useTradeGasLimit as useOpenOceanTradeGasLimit } from './openocean/useTradeGasLimit' import { TradeProvider } from '@masknet/public-api' import { useAvailableTraderProviders } from '../trending/useAvailableTraderProviders' import { useNativeTradeGasLimit } from './useNativeTradeGasLimit' import { TargetChainIdContext } from '@masknet/plugin-infra/web3-evm' -import type { TradeComputed } from '../types' import type { ChainId, SchemaType } from '@masknet/web3-shared-evm' export function useAllTradeComputed( @@ -54,34 +37,34 @@ export function useAllTradeComputed( ) const nativeTradeGasLimit = useNativeTradeGasLimit(nativeToken, targetChainId) - - // uniswap-v2 - const { - trader_: uniswapV2_, - trader: uniswapV2, - traderEstimateGas: uniswapV2EstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.UNISWAP_V2, inputAmount_, inputToken, outputToken) - - // sushi swap - const { - trader_: sushiSwap_, - trader: sushiSwap, - traderEstimateGas: sushiSwapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.SUSHISWAP, inputAmount_, inputToken, outputToken) - - // quick swap - const { - trader_: quickSwap_, - trader: quickSwap, - traderEstimateGas: quickSwapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.QUICKSWAP, inputAmount_, inputToken, outputToken) - - // pancake swap - const { - trader_: pancakeSwap_, - trader: pancakeSwap, - traderEstimateGas: pancakeSwapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.PANCAKESWAP, inputAmount_, inputToken, outputToken) + // + // // uniswap-v2 + // const { + // trader_: uniswapV2_, + // trader: uniswapV2, + // traderEstimateGas: uniswapV2EstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.UNISWAP_V2, inputAmount_, inputToken, outputToken) + // + // // sushi swap + // const { + // trader_: sushiSwap_, + // trader: sushiSwap, + // traderEstimateGas: sushiSwapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.SUSHISWAP, inputAmount_, inputToken, outputToken) + // + // // quick swap + // const { + // trader_: quickSwap_, + // trader: quickSwap, + // traderEstimateGas: quickSwapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.QUICKSWAP, inputAmount_, inputToken, outputToken) + // + // // pancake swap + // const { + // trader_: pancakeSwap_, + // trader: pancakeSwap, + // traderEstimateGas: pancakeSwapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.PANCAKESWAP, inputAmount_, inputToken, outputToken) // uniswap-v3 like providers const uniswapV3_ = useUniswapV3Trade( @@ -93,175 +76,159 @@ export function useAllTradeComputed( ) const uniswapV3 = useUniswapTradeComputed(uniswapV3_.value, inputToken, outputToken, temporarySlippage) const uniswapV3SwapEstimateGas = useUniswapTradeGasLimit(uniswapV3, TradeProvider.UNISWAP_V3) - - // zrx - const zrx_ = useZrxTrade( - TradeStrategy.ExactIn, - inputAmount_, - '0', - tradeProviders.some((x) => x === TradeProvider.ZRX) ? inputToken : undefined, - tradeProviders.some((x) => x === TradeProvider.ZRX) ? outputToken : undefined, - ) - const zrx = useZrxTradeComputed(zrx_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - const zrxSwapEstimateGas = useZrxTradeGasLimit(zrx) - - // balancer - const balancer_ = useBalancerTrade( - TradeStrategy.ExactIn, - inputAmount_, - '0', - tradeProviders.some((x) => x === TradeProvider.BALANCER) ? inputToken : undefined, - tradeProviders.some((x) => x === TradeProvider.BALANCER) ? outputToken : undefined, - ) - const balancer = useBalancerTradeComputed( - balancer_.value ?? null, - TradeStrategy.ExactIn, - inputAmount_, - '0', - inputToken, - outputToken, - ) - const balancerSwapEstimateGas = useBalancerTradeGasLimit(balancer) - - // dodo - const dodo_ = useDODOTrade( - TradeStrategy.ExactIn, - inputAmount_, - '0', - tradeProviders.some((x) => x === TradeProvider.DODO) ? inputToken : undefined, - tradeProviders.some((x) => x === TradeProvider.DODO) ? outputToken : undefined, - temporarySlippage, - ) - const dodo = useDODOTradeComputed(dodo_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - const dodoSwapEstimateGas = useDODOTradeGasLimit(dodo) - - // bancor - const bancor_ = useBancorTrade( - TradeStrategy.ExactIn, - inputAmount_, - '0', - tradeProviders.some((x) => x === TradeProvider.BANCOR) ? inputToken : undefined, - tradeProviders.some((x) => x === TradeProvider.BANCOR) ? outputToken : undefined, - temporarySlippage, - ) - const bancor = useBancorTradeComputed(bancor_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - const bancorSwapEstimateGas = useBancorTradeGasLimit(bancor) - - // traderjoe - const { - trader_: traderJoe_, - trader: traderJoe, - traderEstimateGas: traderJoeEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.TRADERJOE, inputAmount_, inputToken, outputToken) - - // pangolindex - const { - trader_: pangolindex_, - trader: pangolindex, - traderEstimateGas: pangolinEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.PANGOLIN, inputAmount_, inputToken, outputToken) - - // openocean - const openocean_ = useOpenOceanTrade( - TradeStrategy.ExactIn, - inputAmount_, - '0', - inputToken, - outputToken, - temporarySlippage, - ) - const openocean = useOpenOceanTradeComputed( - openocean_.value ?? null, - TradeStrategy.ExactIn, - inputToken, - outputToken, - ) - const openoceanSwapEstimateGas = useOpenOceanTradeGasLimit(openocean as TradeComputed | null) - - // trisolaris - const { - trader_: trisolaris_, - trader: trisolaris, - traderEstimateGas: trisolarisEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.TRISOLARIS, inputAmount_, inputToken, outputToken) - - // WannaSwap - const { - trader_: wannaswap_, - trader: wannaswap, - traderEstimateGas: wannaSwapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) - - // Juggler Red - const { - trader_: jugglerred_, - trader: jugglerred, - traderEstimateGas: jugglerredEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.JUGGLERRED, inputAmount_, inputToken, outputToken) - - // Venom Swap - const { - trader_: venomswap_, - trader: venomswap, - traderEstimateGas: venomswapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.VENOMSWAP, inputAmount_, inputToken, outputToken) - - // Open Swap - const { - trader_: openswap_, - trader: openswap, - traderEstimateGas: openswapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) - - // Defi Kingdoms - const { - trader_: defikingdoms_, - trader: defikingdoms, - traderEstimateGas: defikingdomsEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.DEFIKINGDOMS, inputAmount_, inputToken, outputToken) - - // Mdex - const { - trader_: mdex_, - trader: mdex, - traderEstimateGas: mdexEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.MDEX, inputAmount_, inputToken, outputToken) - - // Elk Finance - const { - trader_: elkfinance_, - trader: elkfinance, - traderEstimateGas: elkfinanceEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.ELKFINANCE, inputAmount_, inputToken, outputToken) - - // ZipSwap - const { - trader_: zipswap_, - trader: zipswap, - traderEstimateGas: zipswapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.ZIPSWAP, inputAmount_, inputToken, outputToken) + // + // // zrx + // const zrx_ = useZrxTrade( + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // tradeProviders.some((x) => x === TradeProvider.ZRX) ? inputToken : undefined, + // tradeProviders.some((x) => x === TradeProvider.ZRX) ? outputToken : undefined, + // ) + // const zrx = useZrxTradeComputed(zrx_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + // const zrxSwapEstimateGas = useZrxTradeGasLimit(zrx) + // + // // balancer + // const balancer_ = useBalancerTrade( + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // tradeProviders.some((x) => x === TradeProvider.BALANCER) ? inputToken : undefined, + // tradeProviders.some((x) => x === TradeProvider.BALANCER) ? outputToken : undefined, + // ) + // const balancer = useBalancerTradeComputed( + // balancer_.value ?? null, + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // inputToken, + // outputToken, + // ) + // const balancerSwapEstimateGas = useBalancerTradeGasLimit(balancer) + // + // // dodo + // const dodo_ = useDODOTrade( + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // tradeProviders.some((x) => x === TradeProvider.DODO) ? inputToken : undefined, + // tradeProviders.some((x) => x === TradeProvider.DODO) ? outputToken : undefined, + // temporarySlippage, + // ) + // const dodo = useDODOTradeComputed(dodo_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + // const dodoSwapEstimateGas = useDODOTradeGasLimit(dodo) + // + // // bancor + // const bancor_ = useBancorTrade( + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // tradeProviders.some((x) => x === TradeProvider.BANCOR) ? inputToken : undefined, + // tradeProviders.some((x) => x === TradeProvider.BANCOR) ? outputToken : undefined, + // temporarySlippage, + // ) + // const bancor = useBancorTradeComputed(bancor_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + // const bancorSwapEstimateGas = useBancorTradeGasLimit(bancor) + // + // // traderjoe + // const { + // trader_: traderJoe_, + // trader: traderJoe, + // traderEstimateGas: traderJoeEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.TRADERJOE, inputAmount_, inputToken, outputToken) + // + // // pangolindex + // const { + // trader_: pangolindex_, + // trader: pangolindex, + // traderEstimateGas: pangolinEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.PANGOLIN, inputAmount_, inputToken, outputToken) + // + // // openocean + // const openocean_ = useOpenOceanTrade( + // TradeStrategy.ExactIn, + // inputAmount_, + // '0', + // inputToken, + // outputToken, + // temporarySlippage, + // ) + // const openocean = useOpenOceanTradeComputed( + // openocean_.value ?? null, + // TradeStrategy.ExactIn, + // inputToken, + // outputToken, + // ) + // const openoceanSwapEstimateGas = useOpenOceanTradeGasLimit(openocean as TradeComputed | null) + // + // // trisolaris + // const { + // trader_: trisolaris_, + // trader: trisolaris, + // traderEstimateGas: trisolarisEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.TRISOLARIS, inputAmount_, inputToken, outputToken) + // + // // WannaSwap + // const { + // trader_: wannaswap_, + // trader: wannaswap, + // traderEstimateGas: wannaSwapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) + // + // // Juggler Red + // const { + // trader_: jugglerred_, + // trader: jugglerred, + // traderEstimateGas: jugglerredEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.JUGGLERRED, inputAmount_, inputToken, outputToken) + // + // // Venom Swap + // const { + // trader_: venomswap_, + // trader: venomswap, + // traderEstimateGas: venomswapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.VENOMSWAP, inputAmount_, inputToken, outputToken) + // + // // Open Swap + // const { + // trader_: openswap_, + // trader: openswap, + // traderEstimateGas: openswapEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) + // + // // Defi Kingdoms + // const { + // trader_: defikingdoms_, + // trader: defikingdoms, + // traderEstimateGas: defikingdomsEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.DEFIKINGDOMS, inputAmount_, inputToken, outputToken) + // + // // Mdex + // const { + // trader_: mdex_, + // trader: mdex, + // traderEstimateGas: mdexEstimateGas, + // } = useUniswapV2Like(tradeProviders, TradeProvider.MDEX, inputAmount_, inputToken, outputToken) const allTradeResult = [ - { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, - { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, - { provider: TradeProvider.QUICKSWAP, ...quickSwap_, value: quickSwap, gas: quickSwapEstimateGas }, - { provider: TradeProvider.PANCAKESWAP, ...pancakeSwap_, value: pancakeSwap, gas: pancakeSwapEstimateGas }, + // { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, + // { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, + // { provider: TradeProvider.QUICKSWAP, ...quickSwap_, value: quickSwap, gas: quickSwapEstimateGas }, + // { provider: TradeProvider.PANCAKESWAP, ...pancakeSwap_, value: pancakeSwap, gas: pancakeSwapEstimateGas }, { provider: TradeProvider.UNISWAP_V3, ...uniswapV3_, value: uniswapV3, gas: uniswapV3SwapEstimateGas }, - { provider: TradeProvider.ZRX, ...zrx_, value: zrx, gas: zrxSwapEstimateGas }, - { provider: TradeProvider.BALANCER, ...balancer_, value: balancer, gas: balancerSwapEstimateGas }, - { provider: TradeProvider.DODO, ...dodo_, value: dodo, gas: dodoSwapEstimateGas }, - { provider: TradeProvider.BANCOR, ...bancor_, value: bancor, gas: bancorSwapEstimateGas }, - { provider: TradeProvider.TRADERJOE, ...traderJoe_, value: traderJoe, gas: traderJoeEstimateGas }, - { provider: TradeProvider.PANGOLIN, ...pangolindex_, value: pangolindex, gas: pangolinEstimateGas }, - { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, - { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, - { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, - { provider: TradeProvider.JUGGLERRED, ...jugglerred_, value: jugglerred, gas: jugglerredEstimateGas }, - { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, - { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, - { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, - { provider: TradeProvider.ELKFINANCE, ...elkfinance_, value: elkfinance, gas: elkfinanceEstimateGas }, - { provider: TradeProvider.ZIPSWAP, ...zipswap_, value: zipswap, gas: zipswapEstimateGas }, + // { provider: TradeProvider.ZRX, ...zrx_, value: zrx, gas: zrxSwapEstimateGas }, + // { provider: TradeProvider.BALANCER, ...balancer_, value: balancer, gas: balancerSwapEstimateGas }, + // { provider: TradeProvider.DODO, ...dodo_, value: dodo, gas: dodoSwapEstimateGas }, + // { provider: TradeProvider.BANCOR, ...bancor_, value: bancor, gas: bancorSwapEstimateGas }, + // { provider: TradeProvider.TRADERJOE, ...traderJoe_, value: traderJoe, gas: traderJoeEstimateGas }, + // { provider: TradeProvider.PANGOLIN, ...pangolindex_, value: pangolindex, gas: pangolinEstimateGas }, + // { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, + // { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, + // { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, + // { provider: TradeProvider.JUGGLERRED, ...jugglerred_, value: jugglerred, gas: jugglerredEstimateGas }, + // { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, + // { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, + // { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index d9bfb7a208f4..749776516d06 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -29,10 +29,6 @@ import { JUGGLERRED_CUSTOM_BASES, DEFIKINGDOMS_BASE_AGAINST_TOKENS, DEFIKINGDOMS_CUSTOM_BASES, - ELKFINANCE_BASE_AGAINST_TOKENS, - ELKFINANCE_CUSTOM_BASES, - ZIPSWAP_BASE_AGAINST_TOKENS, - ZIPSWAP_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from '@masknet/plugin-infra/web3-evm' @@ -224,32 +220,6 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: DEFIKINGDOMS_CUSTOM_BASES, } - case TradeProvider.ELKFINANCE: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.ELKFINANCE_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.ELKFINANCE_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_ROUTER_ADDRESS, - SPENDER_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.ELKFINANCE_FACTORY_ADDRESS, - AGAINST_TOKENS: ELKFINANCE_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: ELKFINANCE_CUSTOM_BASES, - } - case TradeProvider.ZIPSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.ZIPSWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.ZIPSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_ROUTER_ADDRESS, - SPENDER_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.ZIPSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: ZIPSWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: ZIPSWAP_CUSTOM_BASES, - } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index 30ceba399c77..c7b7f982f483 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -110,10 +110,6 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.DEFIKINGDOMS: return uniswapV2Like - case TradeProvider.ELKFINANCE: - return uniswapV2Like - case TradeProvider.ZIPSWAP: - return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index 1ab1e23d6c15..8d4b34d47429 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -76,8 +76,6 @@ export enum ZrxTradePool { VenomSwap = 'VenomSwap', OpenSwap = 'OpenSwap', DefiKingdoms = 'DefiKingdoms', - ELkFinance = 'ElkFinance', - ZipSwap = 'ZipSwap', } export interface TradeComputed { diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 453e4859e38b..361a830d4b01 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -198,8 +198,6 @@ export enum TradeProvider { OPENSWAP = 17, DEFIKINGDOMS = 18, JUGGLERRED = 19, - ELKFINANCE = 20, - ZIPSWAP = 21, } /** Supported language settings */ diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 0380646d37af..bb953b21b2e8 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1740,213 +1740,5 @@ "Conflux": "", "Harmony": "0xf1c21a825f13eff153022ddea53156462dd79972b6f88adf06f79ca8b042c3c1", "Harmony_Test": "" - }, - "ELKFINANCE_ROUTER_ADDRESS": { - "Mainnet": "0xb5e9F6C58f548CeE53257304e287b23757eFFCA1", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "0xA63B831264183D755756ca9AE5190fF5183d65D6", - "BSCT": "", - "Matic": "0xf38a7A7Ac2D745E2204c13F824c00139DF831FFf", - "Mumbai": "", - "Arbitrum": "0x0A2e5A3Dc2f74E5Bfaf0Bf90685A5A899f379Cb0", - "Arbitrum_Rinkeby": "", - "xDai": "0xe5759714998e8B50A33c7333C04C2d02e5dcE77f", - "Optimism": "0xeadE97aFC8f79A8E5Ba85d57C4a4E629b1160C6A", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "0x9E4AAbd2B3E60Ee1322E94307d0776F2c8e6CFbb", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "0x4D2cf285a519261F30b4d9c2c344Baf260d65Fa2", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "0xbeA02dc919B08b5aE2158a8fBC60D4DA5640737B", - "Harmony_Test": "" - }, - "ELKFINANCE_FACTORY_ADDRESS": { - "Mainnet": "0x6511eBA915fC1b94b2364289CCa2b27AE5898d80", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "0x31aFfd875e9f68cd6Cd12Cee8943566c9A4bBA13", - "BSCT": "", - "Matic": "0xE3BD06c7ac7E1CeB17BdD2E5BA83E40D1515AF2a", - "Mumbai": "", - "Arbitrum": "0xA59B2044EAFD15ee4deF138D410d764c9023E1F0", - "Arbitrum_Rinkeby": "", - "xDai": "0xCB018587dA9590A18f49fFE2b85314c33aF3Ad3B", - "Optimism": "0xedfad3a0F42A8920B011bb0332aDe632e552d846", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "0x091d35d7F63487909C863001ddCA481c6De47091", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "0x7Ba73c99e6f01a37f3e33854c8F544BbbadD3420", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "0xCdde1AbfF5Ae3Cbfbdb55c1e866Ac56380e18720", - "Harmony_Test": "" - }, - "ELKFINANCE_THEGRAPH": { - "Mainnet": "", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "", - "BSCT": "", - "Matic": "", - "Mumbai": "", - "Arbitrum": "", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimism": "", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "", - "Harmony_Test": "" - }, - "ELKFINANCE_INIT_CODE_HASH": { - "Mainnet": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "BSCT": "", - "Matic": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Mumbai": "", - "Arbitrum": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Arbitrum_Rinkeby": "", - "xDai": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Optimism": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "0x84845e7ccb283dec564acfcd3d9287a491dec6d675705545a2ab8be22ad78f31", - "Harmony_Test": "" - }, - "ZIPSWAP_ROUTER_ADDRESS": { - "Mainnet": "", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "", - "BSCT": "", - "Matic": "", - "Mumbai": "", - "Arbitrum": "0x4D70D768f5E1e6a7062973aFB0c7FBDa9bBb42b3", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimism": "0xE6Df0BB08e5A97b40B21950a0A51b94c4DbA0Ff6", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "", - "Harmony_Test": "" - }, - "ZIPSWAP_FACTORY_ADDRESS": { - "Mainnet": "", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "", - "BSCT": "", - "Matic": "", - "Mumbai": "", - "Arbitrum": "0x9e343Bea27a12B23523ad88333a1B0f68cc1F05E", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimism": "0x8BCeDD62DD46F1A76F8A1633d4f5B76e0CDa521E", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "", - "Harmony_Test": "" - }, - "ZIPSWAP_THEGRAPH": { - "Mainnet": "", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "", - "BSCT": "", - "Matic": "", - "Mumbai": "", - "Arbitrum": "", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimism": "", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "", - "Harmony_Test": "" - }, - "ZIPSWAP_INIT_CODE_HASH": { - "Mainnet": "", - "Ropsten": "", - "Rinkeby": "", - "Kovan": "", - "Gorli": "", - "BSC": "", - "BSCT": "", - "Matic": "", - "Mumbai": "", - "Arbitrum": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", - "Arbitrum_Rinkeby": "", - "xDai": "", - "Optimism": "0x1a76b7e7272f6187014e23f04d1b2e543eed2fd1f76481149008cc6eacb05c22", - "Optimism_Kovan": "", - "Optimism_Goerli": "", - "Avalanche": "", - "Avalanche_Fuji": "", - "Celo": "", - "Fantom": "", - "Aurora": "", - "Aurora_Testnet": "", - "Conflux": "", - "Harmony": "", - "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts index 48d0e5bbe170..b38f5de4fe91 100644 --- a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts +++ b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts @@ -50,9 +50,6 @@ const domainAddressMap: Record = { 'WANNASWAP_ROUTER_ADDRESS', 'WANNASWAP_FACTORY_ADDRESS', ]), - 'legacy.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), - 'app.elk.finance': collect(Trader, ['ELKFINANCE_ROUTER_ADDRESS', 'ELKFINANCE_FACTORY_ADDRESS']), - 'zipswap.fi': collect(Trader, ['ZIPSWAP_ROUTER_ADDRESS', 'ZIPSWAP_FACTORY_ADDRESS']), 'www.trisolaris.io': collect(Trader, ['TRISOLARIS_ROUTER_ADDRESS', 'TRISOLARIS_FACTORY_ADDRESS']), 'mdex.com': collect(Trader, ['MDEX_ROUTER_ADDRESS', 'MDEX_FACTORY_ADDRESS']), 'aave.com': collect(Aave, ['AAVE_LENDING_POOL_ADDRESSES_PROVIDER_CONTRACT_ADDRESS']), diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index 9b13182eb0e2..1dbbc255c2d5 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -56,8 +56,6 @@ export const PNG = createERC20Tokens('PNG_ADDRESS', 'Pangolin', 'PNG', 18) export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'Viper', 'VIPER', 18) export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX', 18) export const JEWEL = createERC20Tokens('JEWEL_ADDRESS', 'Jewels', 'JEWEL', 18) -export const ELK = createERC20Tokens('ELK_ADDRESS', 'Elk finance', 'ELK', 18) -export const ZIP = createERC20Tokens('ZIP_ADDRESS', 'ZipSwap', 'ZIP', 18) export const OP = createERC20Tokens('OP_ADDRESS', 'Optimism', 'OP', 18) export const WNATIVE = createERC20Tokens( From 3fbecd8bdfebbea73cdefe6db6903bbc4f00697c Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Tue, 26 Jul 2022 22:50:55 +0800 Subject: [PATCH 43/47] fix: uniswap v3 on op network --- .../src/plugins/Trader/constants/uniswap.ts | 4 +-- .../Trader/trader/uniswap/useV3SwapPools.ts | 4 +-- .../plugins/Trader/trader/useTradeCallback.ts | 2 +- packages/web3-constants/evm/ethereum.json | 6 ++--- packages/web3-constants/evm/trader.json | 26 +++++++++---------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index 239ec3cfff6d..cc56793a6219 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -1,4 +1,4 @@ -import { ChainId, AMPL, DAI, USDC, USDT, WBTC, OP, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' +import { ChainId, AMPL, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' import { Percent } from '@uniswap/sdk-core' import JSBI from 'jsbi' import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' @@ -20,7 +20,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), - [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC, OP].map((x) => x[ChainId.Optimism]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism]), } export const MAX_HOP = 3 diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useV3SwapPools.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useV3SwapPools.ts index 059f68186f7b..8d16aedbebf7 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useV3SwapPools.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useV3SwapPools.ts @@ -1,9 +1,9 @@ +import { useMemo } from 'react' import type { Currency, Token } from '@uniswap/sdk-core' import { FeeAmount, Pool } from '@uniswap/v3-sdk' -import { useMemo } from 'react' +import { TradeProvider } from '@masknet/public-api' import { useAllCurrencyCombinations } from './useAllCommonPairs' import { PoolState, usePools } from './usePools' -import { TradeProvider } from '@masknet/public-api' /** * Returns all the existing pools that should be considered for swapping between an input currency and an output currency diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index c7b7f982f483..f5283ef459ae 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -1,3 +1,4 @@ +import { noop } from 'lodash-unified' import type { Trade as V2Trade } from '@uniswap/v2-sdk' import type { Trade as V3Trade } from '@uniswap/v3-sdk' import type { Currency, TradeType } from '@uniswap/sdk-core' @@ -24,7 +25,6 @@ import { isNativeTokenWrapper } from '../helpers' import { useGetTradeContext } from './useGetTradeContext' import { TargetChainIdContext } from '@masknet/plugin-infra/web3-evm' import type { GasOptionConfig } from '@masknet/web3-shared-evm' -import { noop } from 'lodash-unified' import type { AsyncFnReturn } from 'react-use/lib/useAsyncFn' export function useTradeCallback( diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 57e5fa336213..d974e40a1b9c 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -38,9 +38,9 @@ "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", - "Optimism": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", - "Optimism_Kovan": "0x2DC0E2aa608532Da689e89e237dF582B783E552C", - "Optimism_Goerli": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", + "Optimism": "0x1F98415757620B543A52E61c46B32eB19261F984", + "Optimism_Kovan": "0x1F98415757620B543A52E61c46B32eB19261F984", + "Optimism_Goerli": "0x1F98415757620B543A52E61c46B32eB19261F984", "Avalanche": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche_Fuji": "", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index bb953b21b2e8..121a6c952dba 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -116,12 +116,12 @@ "Arbitrum": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Arbitrum_Rinkeby": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "xDai": "", - "Optimism": "", - "Optimism_Kovan": "", - "Optimism_Goerli": "", + "Optimism": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "Optimism_Kovan": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "Optimism_Goerli": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Avalanche": "", "Avalanche_Fuji": "", - "Celo": "", + "Celo": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Fantom": "", "Aurora": "", "Aurora_Testnet": "", @@ -142,12 +142,12 @@ "Arbitrum": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Arbitrum_Rinkeby": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "xDai": "", - "Optimism": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f", + "Optimism": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Optimism_Kovan": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Optimism_Goerli": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Avalanche": "", "Avalanche_Fuji": "", - "Celo": "", + "Celo": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Fantom": "", "Aurora": "", "Aurora_Testnet": "", @@ -168,12 +168,12 @@ "Arbitrum": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Arbitrum_Rinkeby": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "xDai": "", - "Optimism": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", - "Optimism_Kovan": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", - "Optimism_Goerli": "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", + "Optimism": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "Optimism_Kovan": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "Optimism_Goerli": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Avalanche": "", "Avalanche_Fuji": "", - "Celo": "", + "Celo": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Fantom": "", "Aurora": "", "Aurora_Testnet": "", @@ -199,7 +199,7 @@ "Optimism_Goerli": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Avalanche": "", "Avalanche_Fuji": "", - "Celo": "", + "Celo": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Fantom": "", "Aurora": "", "Aurora_Testnet": "", @@ -220,12 +220,12 @@ "Arbitrum": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Arbitrum_Rinkeby": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "xDai": "", - "Optimism": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", + "Optimism": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Optimism_Kovan": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Optimism_Goerli": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Avalanche": "", "Avalanche_Fuji": "", - "Celo": "", + "Celo": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", "Fantom": "", "Aurora": "", "Aurora_Testnet": "", From c844bcd58483cf10c6437e930fd846df59b7fecf Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Tue, 26 Jul 2022 23:12:19 +0800 Subject: [PATCH 44/47] revert: add op to base against tokens --- packages/mask/src/plugins/Trader/constants/uniswap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mask/src/plugins/Trader/constants/uniswap.ts b/packages/mask/src/plugins/Trader/constants/uniswap.ts index cc56793a6219..06a069a390cb 100644 --- a/packages/mask/src/plugins/Trader/constants/uniswap.ts +++ b/packages/mask/src/plugins/Trader/constants/uniswap.ts @@ -1,4 +1,4 @@ -import { ChainId, AMPL, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' +import { ChainId, AMPL, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY, OP } from '@masknet/web3-shared-evm' import { Percent } from '@uniswap/sdk-core' import JSBI from 'jsbi' import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' @@ -20,7 +20,7 @@ export const UNISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, [ChainId.Mainnet]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Mainnet]), [ChainId.Matic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Matic]), - [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism]), + [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC, OP].map((x) => x[ChainId.Optimism]), } export const MAX_HOP = 3 From 7628600ba8bb6754ee20b43a9607f032df00ed0e Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Tue, 26 Jul 2022 23:29:21 +0800 Subject: [PATCH 45/47] fix: remove jugglerred network --- cspell.json | 1 - .../src/plugins/Trader/constants/index.ts | 1 - .../plugins/Trader/constants/jugglerred.ts | 14 - packages/mask/src/plugins/Trader/pipes.ts | 1 - .../Trader/trader/useAllTradeComputed.ts | 367 +++++++++--------- .../Trader/trader/useGetTradeContext.ts | 15 - .../plugins/Trader/trader/useTradeCallback.ts | 2 - .../mask/src/plugins/Trader/types/trader.ts | 1 - packages/public-api/src/web.ts | 1 - 9 files changed, 188 insertions(+), 215 deletions(-) delete mode 100644 packages/mask/src/plugins/Trader/constants/jugglerred.ts diff --git a/cspell.json b/cspell.json index 468b9227df4c..9f0895719d6e 100644 --- a/cspell.json +++ b/cspell.json @@ -107,7 +107,6 @@ "ittr", "jsbi", "jsonml", - "jugglerred", "juicebox", "kdfparams", "keccak", diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index ce097d0795d9..07cf8b525b40 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -12,7 +12,6 @@ export * from './traderjoe' export * from './pangolindex' export * from './wannaswap' export * from './trisolaris' -export * from './jugglerred' export * from './venomswap' export * from './openswap' export * from './mdex' diff --git a/packages/mask/src/plugins/Trader/constants/jugglerred.ts b/packages/mask/src/plugins/Trader/constants/jugglerred.ts deleted file mode 100644 index 271bab0c101e..000000000000 --- a/packages/mask/src/plugins/Trader/constants/jugglerred.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ChainId, DAI, USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' -import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' - -/** - * Some tokens can only be swapped via certain pairs, - * so we override the list of bases that are considered for these tokens. - */ -export const JUGGLERRED_CUSTOM_BASES: ERC20TokenCustomizedBase = {} - -export const JUGGLERRED_BASE_AGAINST_TOKENS: ERC20AgainstToken = { - ...WNATIVE_ONLY, - [ChainId.Optimism]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism]), - [ChainId.Optimism_Kovan]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimism_Kovan]), -} diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index b67468570926..0d0289fb7d19 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -41,7 +41,6 @@ export const resolveTradeProviderName = createLookupTableResolver x === TradeProvider.ZRX) ? inputToken : undefined, - // tradeProviders.some((x) => x === TradeProvider.ZRX) ? outputToken : undefined, - // ) - // const zrx = useZrxTradeComputed(zrx_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - // const zrxSwapEstimateGas = useZrxTradeGasLimit(zrx) - // - // // balancer - // const balancer_ = useBalancerTrade( - // TradeStrategy.ExactIn, - // inputAmount_, - // '0', - // tradeProviders.some((x) => x === TradeProvider.BALANCER) ? inputToken : undefined, - // tradeProviders.some((x) => x === TradeProvider.BALANCER) ? outputToken : undefined, - // ) - // const balancer = useBalancerTradeComputed( - // balancer_.value ?? null, - // TradeStrategy.ExactIn, - // inputAmount_, - // '0', - // inputToken, - // outputToken, - // ) - // const balancerSwapEstimateGas = useBalancerTradeGasLimit(balancer) - // - // // dodo - // const dodo_ = useDODOTrade( - // TradeStrategy.ExactIn, - // inputAmount_, - // '0', - // tradeProviders.some((x) => x === TradeProvider.DODO) ? inputToken : undefined, - // tradeProviders.some((x) => x === TradeProvider.DODO) ? outputToken : undefined, - // temporarySlippage, - // ) - // const dodo = useDODOTradeComputed(dodo_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - // const dodoSwapEstimateGas = useDODOTradeGasLimit(dodo) - // - // // bancor - // const bancor_ = useBancorTrade( - // TradeStrategy.ExactIn, - // inputAmount_, - // '0', - // tradeProviders.some((x) => x === TradeProvider.BANCOR) ? inputToken : undefined, - // tradeProviders.some((x) => x === TradeProvider.BANCOR) ? outputToken : undefined, - // temporarySlippage, - // ) - // const bancor = useBancorTradeComputed(bancor_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) - // const bancorSwapEstimateGas = useBancorTradeGasLimit(bancor) - // - // // traderjoe - // const { - // trader_: traderJoe_, - // trader: traderJoe, - // traderEstimateGas: traderJoeEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.TRADERJOE, inputAmount_, inputToken, outputToken) - // - // // pangolindex - // const { - // trader_: pangolindex_, - // trader: pangolindex, - // traderEstimateGas: pangolinEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.PANGOLIN, inputAmount_, inputToken, outputToken) - // - // // openocean - // const openocean_ = useOpenOceanTrade( - // TradeStrategy.ExactIn, - // inputAmount_, - // '0', - // inputToken, - // outputToken, - // temporarySlippage, - // ) - // const openocean = useOpenOceanTradeComputed( - // openocean_.value ?? null, - // TradeStrategy.ExactIn, - // inputToken, - // outputToken, - // ) - // const openoceanSwapEstimateGas = useOpenOceanTradeGasLimit(openocean as TradeComputed | null) - // - // // trisolaris - // const { - // trader_: trisolaris_, - // trader: trisolaris, - // traderEstimateGas: trisolarisEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.TRISOLARIS, inputAmount_, inputToken, outputToken) - // - // // WannaSwap - // const { - // trader_: wannaswap_, - // trader: wannaswap, - // traderEstimateGas: wannaSwapEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) - // - // // Juggler Red - // const { - // trader_: jugglerred_, - // trader: jugglerred, - // traderEstimateGas: jugglerredEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.JUGGLERRED, inputAmount_, inputToken, outputToken) - // - // // Venom Swap - // const { - // trader_: venomswap_, - // trader: venomswap, - // traderEstimateGas: venomswapEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.VENOMSWAP, inputAmount_, inputToken, outputToken) - // - // // Open Swap - // const { - // trader_: openswap_, - // trader: openswap, - // traderEstimateGas: openswapEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) - // - // // Defi Kingdoms - // const { - // trader_: defikingdoms_, - // trader: defikingdoms, - // traderEstimateGas: defikingdomsEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.DEFIKINGDOMS, inputAmount_, inputToken, outputToken) - // - // // Mdex - // const { - // trader_: mdex_, - // trader: mdex, - // traderEstimateGas: mdexEstimateGas, - // } = useUniswapV2Like(tradeProviders, TradeProvider.MDEX, inputAmount_, inputToken, outputToken) + + // zrx + const zrx_ = useZrxTrade( + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.ZRX) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.ZRX) ? outputToken : undefined, + ) + const zrx = useZrxTradeComputed(zrx_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + const zrxSwapEstimateGas = useZrxTradeGasLimit(zrx) + + // balancer + const balancer_ = useBalancerTrade( + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.BALANCER) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.BALANCER) ? outputToken : undefined, + ) + const balancer = useBalancerTradeComputed( + balancer_.value ?? null, + TradeStrategy.ExactIn, + inputAmount_, + '0', + inputToken, + outputToken, + ) + const balancerSwapEstimateGas = useBalancerTradeGasLimit(balancer) + + // dodo + const dodo_ = useDODOTrade( + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.DODO) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.DODO) ? outputToken : undefined, + temporarySlippage, + ) + const dodo = useDODOTradeComputed(dodo_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + const dodoSwapEstimateGas = useDODOTradeGasLimit(dodo) + + // bancor + const bancor_ = useBancorTrade( + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.BANCOR) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.BANCOR) ? outputToken : undefined, + temporarySlippage, + ) + const bancor = useBancorTradeComputed(bancor_.value ?? null, TradeStrategy.ExactIn, inputToken, outputToken) + const bancorSwapEstimateGas = useBancorTradeGasLimit(bancor) + + // traderjoe + const { + trader_: traderJoe_, + trader: traderJoe, + traderEstimateGas: traderJoeEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.TRADERJOE, inputAmount_, inputToken, outputToken) + + // pangolindex + const { + trader_: pangolindex_, + trader: pangolindex, + traderEstimateGas: pangolinEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.PANGOLIN, inputAmount_, inputToken, outputToken) + + // openocean + const openocean_ = useOpenOceanTrade( + TradeStrategy.ExactIn, + inputAmount_, + '0', + inputToken, + outputToken, + temporarySlippage, + ) + const openocean = useOpenOceanTradeComputed( + openocean_.value ?? null, + TradeStrategy.ExactIn, + inputToken, + outputToken, + ) + const openoceanSwapEstimateGas = useOpenOceanTradeGasLimit(openocean as TradeComputed | null) + + // trisolaris + const { + trader_: trisolaris_, + trader: trisolaris, + traderEstimateGas: trisolarisEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.TRISOLARIS, inputAmount_, inputToken, outputToken) + + // WannaSwap + const { + trader_: wannaswap_, + trader: wannaswap, + traderEstimateGas: wannaSwapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) + + // Venom Swap + const { + trader_: venomswap_, + trader: venomswap, + traderEstimateGas: venomswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.VENOMSWAP, inputAmount_, inputToken, outputToken) + + // Open Swap + const { + trader_: openswap_, + trader: openswap, + traderEstimateGas: openswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) + + // Defi Kingdoms + const { + trader_: defikingdoms_, + trader: defikingdoms, + traderEstimateGas: defikingdomsEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.DEFIKINGDOMS, inputAmount_, inputToken, outputToken) + + // Mdex + const { + trader_: mdex_, + trader: mdex, + traderEstimateGas: mdexEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.MDEX, inputAmount_, inputToken, outputToken) const allTradeResult = [ - // { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, - // { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, - // { provider: TradeProvider.QUICKSWAP, ...quickSwap_, value: quickSwap, gas: quickSwapEstimateGas }, - // { provider: TradeProvider.PANCAKESWAP, ...pancakeSwap_, value: pancakeSwap, gas: pancakeSwapEstimateGas }, + { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, + { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, + { provider: TradeProvider.QUICKSWAP, ...quickSwap_, value: quickSwap, gas: quickSwapEstimateGas }, + { provider: TradeProvider.PANCAKESWAP, ...pancakeSwap_, value: pancakeSwap, gas: pancakeSwapEstimateGas }, { provider: TradeProvider.UNISWAP_V3, ...uniswapV3_, value: uniswapV3, gas: uniswapV3SwapEstimateGas }, - // { provider: TradeProvider.ZRX, ...zrx_, value: zrx, gas: zrxSwapEstimateGas }, - // { provider: TradeProvider.BALANCER, ...balancer_, value: balancer, gas: balancerSwapEstimateGas }, - // { provider: TradeProvider.DODO, ...dodo_, value: dodo, gas: dodoSwapEstimateGas }, - // { provider: TradeProvider.BANCOR, ...bancor_, value: bancor, gas: bancorSwapEstimateGas }, - // { provider: TradeProvider.TRADERJOE, ...traderJoe_, value: traderJoe, gas: traderJoeEstimateGas }, - // { provider: TradeProvider.PANGOLIN, ...pangolindex_, value: pangolindex, gas: pangolinEstimateGas }, - // { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, - // { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, - // { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, - // { provider: TradeProvider.JUGGLERRED, ...jugglerred_, value: jugglerred, gas: jugglerredEstimateGas }, - // { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, - // { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, - // { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, + { provider: TradeProvider.ZRX, ...zrx_, value: zrx, gas: zrxSwapEstimateGas }, + { provider: TradeProvider.BALANCER, ...balancer_, value: balancer, gas: balancerSwapEstimateGas }, + { provider: TradeProvider.DODO, ...dodo_, value: dodo, gas: dodoSwapEstimateGas }, + { provider: TradeProvider.BANCOR, ...bancor_, value: bancor, gas: bancorSwapEstimateGas }, + { provider: TradeProvider.TRADERJOE, ...traderJoe_, value: traderJoe, gas: traderJoeEstimateGas }, + { provider: TradeProvider.PANGOLIN, ...pangolindex_, value: pangolindex, gas: pangolinEstimateGas }, + { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, + { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, + { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, + { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, + { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, + { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 749776516d06..30f1a7dd6e98 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -25,8 +25,6 @@ import { OPENSWAP_CUSTOM_BASES, MDEX_BASE_AGAINST_TOKENS, MDEX_CUSTOM_BASES, - JUGGLERRED_BASE_AGAINST_TOKENS, - JUGGLERRED_CUSTOM_BASES, DEFIKINGDOMS_BASE_AGAINST_TOKENS, DEFIKINGDOMS_CUSTOM_BASES, } from '../constants' @@ -155,19 +153,6 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: TRISOLARIS_CUSTOM_BASES, } - case TradeProvider.JUGGLERRED: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.JUGGLERRED_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.JUGGLERRED_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_ROUTER_ADDRESS, - SPENDER_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.JUGGLERRED_FACTORY_ADDRESS, - AGAINST_TOKENS: JUGGLERRED_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: JUGGLERRED_CUSTOM_BASES, - } case TradeProvider.MDEX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index f5283ef459ae..677cace10a95 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -100,8 +100,6 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.TRISOLARIS: return uniswapV2Like - case TradeProvider.JUGGLERRED: - return uniswapV2Like case TradeProvider.VENOMSWAP: return uniswapV2Like case TradeProvider.OPENSWAP: diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index 8d4b34d47429..a1e1f9f24a74 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -71,7 +71,6 @@ export enum ZrxTradePool { PangolinDex = 'PangolinDex', Trisolaris = 'Trisolaris', WannaSwap = 'WannaSwap', - JugglerRed = 'JugglerRed', Mdex = 'Mdex', VenomSwap = 'VenomSwap', OpenSwap = 'OpenSwap', diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 361a830d4b01..973465f3d0a3 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -197,7 +197,6 @@ export enum TradeProvider { VENOMSWAP = 16, OPENSWAP = 17, DEFIKINGDOMS = 18, - JUGGLERRED = 19, } /** Supported language settings */ From ea95a8defa1076056376ad3e07b02985cb6ec111 Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Wed, 27 Jul 2022 17:26:46 +0800 Subject: [PATCH 46/47] fix: add op support at ito --- packages/mask/src/plugins/ITO/base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mask/src/plugins/ITO/base.ts b/packages/mask/src/plugins/ITO/base.ts index 467fecb826fe..a73a4ece7d78 100644 --- a/packages/mask/src/plugins/ITO/base.ts +++ b/packages/mask/src/plugins/ITO/base.ts @@ -29,6 +29,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Avalanche, ChainId.Fantom, ChainId.Harmony, + ChainId.Optimism, ], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, From b93c6438a4080f4a4528c52b17e9410358759135 Mon Sep 17 00:00:00 2001 From: nuanyang233 Date: Wed, 3 Aug 2022 18:32:57 +0800 Subject: [PATCH 47/47] chore: linter error --- packages/web3-shared/evm/constants/descriptors.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/web3-shared/evm/constants/descriptors.ts b/packages/web3-shared/evm/constants/descriptors.ts index 04fb58b60495..a4fdc9fee761 100644 --- a/packages/web3-shared/evm/constants/descriptors.ts +++ b/packages/web3-shared/evm/constants/descriptors.ts @@ -256,6 +256,7 @@ export const NETWORK_DESCRIPTORS: Array> icon: new URL('../assets/optimism.png', import.meta.url), iconColor: 'rgb(232, 65, 66)', isMainnet: true, + averageBlockDelay: 15, }, ] export const PROVIDER_DESCRIPTORS: Array> = [