From 9dcfdfbae9475542dd4cc0aebe701294a6920ced Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 27 Dec 2021 00:40:31 +0000 Subject: [PATCH 01/32] feat(layer2): add integration Boba Network --- cspell.json | 114 ++++++------ .../Labs/components/SwapSettingDialog.tsx | 12 ++ packages/dashboard/src/pages/Settings/api.ts | 5 + .../components/Shared/MiniNetworkSelector.tsx | 2 +- .../background-script/SettingsService.ts | 3 + .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 9 +- .../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/sushiswap.ts | 1 + .../src/plugins/Trader/constants/trader.ts | 1 + packages/maskbook/src/plugins/Trader/pipes.ts | 11 ++ .../maskbook/src/plugins/Trader/services.ts | 9 + .../maskbook/src/plugins/Trader/settings.ts | 9 + .../src/plugins/Trader/trader/0x/useTrade.ts | 2 + .../trending/useCurrentTradeProvider.ts | 4 + .../src/plugins/Trader/types/trader.ts | 1 + .../src/plugins/UnlockProtocol/base.ts | 9 +- .../src/plugins/UnlockProtocol/constants.ts | 1 + .../src/plugins/Wallet/apis/debank.ts | 1 + .../src/plugins/Wallet/pipes/index.ts | 2 + .../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 | 2 + .../src/UI/components/NetworkIcon/index.tsx | 1 + .../NetworkIcon/wallet-network-icon/boba.png | Bin 0 -> 26311 bytes packages/web3-constants/compile-constants.ts | 2 + packages/web3-constants/evm/airdrop.json | 4 +- packages/web3-constants/evm/chain.json | 8 +- packages/web3-constants/evm/dhedge.json | 8 +- packages/web3-constants/evm/ethereum.json | 22 ++- packages/web3-constants/evm/gitcoin.json | 16 +- .../web3-constants/evm/good-ghosting.json | 8 +- packages/web3-constants/evm/ito.json | 28 ++- packages/web3-constants/evm/lbp.json | 4 +- packages/web3-constants/evm/mask-box.json | 20 ++- .../web3-constants/evm/nft-red-packet.json | 8 +- packages/web3-constants/evm/opensea-api.json | 12 +- packages/web3-constants/evm/pooltogether.json | 8 +- packages/web3-constants/evm/red-packet.json | 20 ++- packages/web3-constants/evm/rpc.json | 8 +- .../evm/space-station-galaxy.json | 8 +- .../evm/token-asset-base-url.json | 4 +- packages/web3-constants/evm/token.json | 164 +++++++++++++----- packages/web3-constants/evm/trader.json | 160 +++++++++++++---- packages/web3-constants/evm/trending.json | 12 +- packages/web3-shared/evm/assets/chains.json | 26 +++ .../evm/assets/coingecko-asset-platforms.json | 6 + .../evm/assets/coingecko-coin-list.json | 6 + packages/web3-shared/evm/pipes/index.ts | 4 + packages/web3-shared/evm/types/index.ts | 5 + .../web3-shared/evm/utils/chainDetailed.ts | 2 + 57 files changed, 613 insertions(+), 184 deletions(-) create mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png diff --git a/cspell.json b/cspell.json index 79225a9b37b1..2f7da0d401b8 100644 --- a/cspell.json +++ b/cspell.json @@ -1,52 +1,17 @@ { "dictionaries": ["typescript", "node", "html", "css", "fonts"], "words": [ - "AMPL", - "Adai", - "Amountstate", - "Ampleforth", - "ARETH", - "Bolivarian", - "Bouvet", - "Burkina", - "CAIP", - "Caicos", - "Checksummed", - "Cunha", - "Cura", - "DHEDGE", - "Darussalam", - "ECID", - "Eustatius", - "Exchangetoken", - "Faso", - "Futuna", - "IDBP", - "IHDR", - "Kitts", - "Leste", - "Maarten", - "Marino", - "Maskbook", - "Mastdon", - "Mayen", - "Merkle", - "Mutex", - "Plurinational", - "Polkadot", - "Pooltogether", - "Rhonin", - "Rica", - "Sint", - "Tokelau", - "Transak", - "Vcent", - "Viet", "aave", + "Adai", "addrs", + "Amountstate", "ampl", + "AMPL", + "Ampleforth", "anchorme", + "apikey", "arbitrum", + "ARETH", "arweave", "bgcolor", "bignumber", @@ -55,9 +20,17 @@ "blockie", "blockies", "bluebar", + "Boba", + "Bolivarian", + "Bouvet", "builtins", + "Burkina", + "Caicos", + "CAIP", "canonify", "cashtag", + "Checksummed", + "Choudhary", "cipherparams", "ciphertext", "clearfix", @@ -67,8 +40,12 @@ "consolas", "contenteditable", "cooldown", + "counterparty", "crwdne", + "Cunha", + "Cura", "d'Ivoire", + "Darussalam", "datas", "debank", "denorm", @@ -76,21 +53,27 @@ "deserialization", "destory", "dfyn", + "DHEDGE", "dimensiondev", "dklen", "dompurify", + "ECID", "ecsign", "elec", "encryptedmsg", "endregion", "ethersproject", + "Eustatius", "everytime", + "Exchangetoken", + "Faso", "fbid", "filelist", "fileservice", "formating", "fullfilled", "furucombo", + "Futuna", "gasnow", "geckoview", "gltf", @@ -99,7 +82,9 @@ "hashmasks", "holoflows", "iconbar", + "IDBP", "ifclaimed", + "IHDR", "imagebitmap", "immer", "importmap", @@ -108,27 +93,39 @@ "ipfs", "ipfsurl", "ittr", + "jailbroken", "jsbi", "jsonml", "kdfparams", "keccak", + "Kitts", "kred", "labelledby", "languagedetector", "lemy", + "Leste", "linkedin", "linkswap", "locationchange", "lowercased", + "Maarten", + "macbinary", + "majeure", + "Marino", + "Maskbook", "maskbookjsonrpc", "maskface", "masknet", "masknetwork", "masknightly", "masktext", + "Mastdon", + "Mayen", + "Merkle", "messagepack", "metas", "millify", + "misoperation", "monofont", "monospace", "mooniswap", @@ -138,9 +135,14 @@ "mskc", "multicall", "multihop", + "Mutex", "newsfeed", + "NFTRSS", + "nftscan", "nowallet", "nums", + "ONGSWAP", + "oolongswap", "opensea", "overridable", "overscan", @@ -150,6 +152,9 @@ "perma", "pid", "pids", + "Plurinational", + "Polkadot", + "Pooltogether", "popper", "popperjs", "porportion", @@ -158,7 +163,6 @@ "promi", "proxied", "pushstate", - "unstyled", "pvtsutils", "qrcode", "quickswap", @@ -168,6 +172,8 @@ "redpacket", "replacestate", "repost", + "Rhonin", + "Rica", "rindexed", "rpid", "rpids", @@ -176,6 +182,8 @@ "scroller", "secp", "shink", + "Sint", + "solana", "steelblue", "steganographic", "steganography", @@ -184,6 +192,7 @@ "superrare", "sushiswap", "swappable", + "Swither", "tabindex", "tablist", "testid", @@ -191,6 +200,9 @@ "thegraph", "timelock", "timelocked", + "Tokelau", + "tokenid", + "Transak", "twimg", "txid", "typechain", @@ -199,9 +211,12 @@ "unencrypted", "unreviewed", "unstake", + "unstyled", "untrusted", "urlcat", "usermenu", + "Vcent", + "Viet", "viewbox", "visualcompletion", "walletconnect", @@ -215,20 +230,7 @@ "xlarge", "xlink", "zerion", - "Zubin", - "Choudhary", - "macbinary", - "Choudhary", - "counterparty", - "jailbroken", - "misoperation", - "majeure", - "Swither", - "nftscan", - "apikey", - "tokenid", - "NFTRSS", - "solana" + "Zubin" ], "ignoreWords": [ "cryptopunks", diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 62099f1d293a..343c344229f2 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, + useBobaNetworkTradeProvider, } from '../../Settings/api' import SettingItem from './SettingItem' @@ -47,6 +48,11 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) const xDaiOptions = [{ label: 'SushiSwap', value: TradeProvider.SUSHISWAP }] + const bobaOptions = [ + { label: 'SushiSwap', value: TradeProvider.SUSHISWAP }, + { label: 'OolongSwap', value: TradeProvider.OOlONGSWAP }, + ] + const t = useDashboardI18N() const items = [ @@ -80,6 +86,12 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) options: xDaiOptions, onChange: (value: any) => Services.Settings.setxDaiNetworkTradeProvider(+value), }, + { + legend: t.labs_settings_swap_network({ network: 'Boba' }), + value: useBobaNetworkTradeProvider(), + options: bobaOptions, + onChange: (value: any) => Services.Settings.setBobaNetworkTradeProvider(+value), + }, ] return ( diff --git a/packages/dashboard/src/pages/Settings/api.ts b/packages/dashboard/src/pages/Settings/api.ts index ccc70b2202cb..38d3c68c143d 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 [useBobaNetworkTradeProvider] = createGlobalState( + Services.Settings.getBobaNetworkTradeProvider, + Messages.events.xdaiNetworkTradeProviderSettings.on, +) + const BASE_RUL = 'https://vaalh28dbi.execute-api.ap-east-1.amazonaws.com/api' interface BackupBaseRequest { diff --git a/packages/dashboard/stories/components/Shared/MiniNetworkSelector.tsx b/packages/dashboard/stories/components/Shared/MiniNetworkSelector.tsx index 2c710a3a9d54..496c69146c38 100644 --- a/packages/dashboard/stories/components/Shared/MiniNetworkSelector.tsx +++ b/packages/dashboard/stories/components/Shared/MiniNetworkSelector.tsx @@ -10,7 +10,7 @@ export default meta({ export const MiniNetworkSelector = of({ args: { selectedChainId: 1, - networks: [NetworkType.Ethereum, NetworkType.Binance, NetworkType.Polygon, NetworkType.xDai], + networks: [NetworkType.Ethereum, NetworkType.Binance, NetworkType.Polygon, NetworkType.xDai, NetworkType.Boba], onSelect: () => {}, hideAllNetworkButton: false, disabledNonCurrentNetwork: false, diff --git a/packages/maskbook/src/extension/background-script/SettingsService.ts b/packages/maskbook/src/extension/background-script/SettingsService.ts index 8fa6888fba50..64496a3b97c9 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, + bobaNetworkTradeProviderSettings, } from '../../plugins/Trader/settings' import { queryMyPersonas } from './IdentityService' import { @@ -70,6 +71,8 @@ export const [getArbitrumNetworkTradeProvider, setArbitrumNetworkTradeProvider] ) export const [getxDaiNetworkTradeProvider, setxDaiNetworkTradeProvider] = create(xdaiNetworkTradeProviderSettings) +export const [getBobaNetworkTradeProvider, setBobaNetworkTradeProvider] = create(bobaNetworkTradeProviderSettings) + 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..dd9aad9ba9db 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.Boba].includes( + currentChainId, + ) ? currentChainId : ChainId.Mainnet, ) @@ -352,8 +354,11 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { createTabItem('Polygon/Matic', ChainId.Matic), createTabItem('Arbitrum', ChainId.Arbitrum), createTabItem('xDai', ChainId.xDai), + createTabItem('Boba', ChainId.Boba), ], - 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.Boba].indexOf( + chainId, + ), classes, hasOnlyOneChild: true, } diff --git a/packages/maskbook/src/plugins/RedPacket/base.ts b/packages/maskbook/src/plugins/RedPacket/base.ts index be212cf0834d..2519d910aadd 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.Boba, + ], }, }, } diff --git a/packages/maskbook/src/plugins/Trader/apis/trader/index.ts b/packages/maskbook/src/plugins/Trader/apis/trader/index.ts index b9ba608d5120..f4eb51f0cf7b 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.Boba: + return [TradeProvider.SUSHISWAP, TradeProvider.OOlONGSWAP] 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..1edf42d81ac0 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, + boba: NetworkType.Boba, }, [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, + '288': NetworkType.Boba, }, [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..acc1a079b121 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.Boba]: 'https://boba.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..629e76db3207 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.Boba]: 'boba', } diff --git a/packages/maskbook/src/plugins/Trader/constants/sushiswap.ts b/packages/maskbook/src/plugins/Trader/constants/sushiswap.ts index b6981063f81d..ff8dbb05b794 100644 --- a/packages/maskbook/src/plugins/Trader/constants/sushiswap.ts +++ b/packages/maskbook/src/plugins/Trader/constants/sushiswap.ts @@ -15,4 +15,5 @@ export const SUSHISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Matic]: [WNATIVE, USDC, WBTC, DAI, USDT].map((x) => x[ChainId.Matic]), [ChainId.BSC]: [WNATIVE, DAI, BUSD, USDC, USDT, BTCB].map((x) => x[ChainId.BSC]), [ChainId.xDai]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.xDai]), + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.Boba]), } diff --git a/packages/maskbook/src/plugins/Trader/constants/trader.ts b/packages/maskbook/src/plugins/Trader/constants/trader.ts index 90933745a6c0..0f9655914cd2 100644 --- a/packages/maskbook/src/plugins/Trader/constants/trader.ts +++ b/packages/maskbook/src/plugins/Trader/constants/trader.ts @@ -60,6 +60,7 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Arbitrum]: [WNATIVE[ChainId.Arbitrum]], [ChainId.Arbitrum_Rinkeby]: [WNATIVE[ChainId.Arbitrum_Rinkeby]], [ChainId.xDai]: [WNATIVE[ChainId.xDai]], + [ChainId.Boba]: [WNATIVE[ChainId.Boba]], } 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..b01534482be4 100644 --- a/packages/maskbook/src/plugins/Trader/pipes.ts +++ b/packages/maskbook/src/plugins/Trader/pipes.ts @@ -56,6 +56,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) @@ -80,6 +81,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://aribitrum.api.0x.org/' case NetworkType.xDai: return 'https://xdai.api.0x.org/' + case NetworkType.Boba: + return 'https://boba.api.0x.org/' default: safeUnreachable(networkType) return '' @@ -98,6 +101,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://app.dodoex.io' case TradeProvider.BANCOR: return 'https://app.bancor.network/eth/swap' + case TradeProvider.OOlONGSWAP: + return 'https://oolongswap.com/' default: unreachable(tradeProvider) } @@ -134,6 +139,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.Boba: + return `https://analytics-boba.sushi.com/pairs/${address}` default: safeUnreachable(networkType) return '' @@ -149,6 +156,9 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri case TradeProvider.BANCOR: // TODO - Bancor analytics should be available with V3 return `` + case TradeProvider.OOlONGSWAP: + // TODO - Bancor analytics should be available with V3 + return `` default: unreachable(tradeProvider) } @@ -238,6 +248,7 @@ export const resolveZrxTradePoolName = createLookupTableResolver { if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP break + case NetworkType.Boba: + currentTradeProviderSettings.value = TradeProvider.SUSHISWAP + 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.Boba: + bobaNetworkTradeProviderSettings.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..4dfb5a7bd616 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 bobaNetworkTradeProviderSettings = createGlobalSettings( + `${PLUGIN_IDENTIFIER}+boba+tradeProvider`, + TradeProvider.SUSHISWAP, + { primary: () => '' }, +) + //#region trade provider general settings export interface TradeProviderSettings { pools: ZrxTradePool[] @@ -92,6 +98,7 @@ const pancakeswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER} const balancerSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+balancer`, '') const dodoSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+dodo`, '') const bancorSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+bancor`, '') +const oolongswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+oolongswap`, '') /** * The general settings of specific tarde provider @@ -118,6 +125,8 @@ export function getCurrentTradeProviderGeneralSettings(tradeProvider: TradeProvi return dodoSettings case TradeProvider.BANCOR: return bancorSettings + case TradeProvider.OOlONGSWAP: + return oolongswapSettings default: unreachable(tradeProvider) } diff --git a/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts b/packages/maskbook/src/plugins/Trader/trader/0x/useTrade.ts index d35c8afb4992..96eec357a929 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.Boba: + 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..72f93d0582f9 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, + bobaNetworkTradeProviderSettings, } 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 bobaNetworkTradeProvider = useValueRef(bobaNetworkTradeProviderSettings) 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.Boba: + return bobaNetworkTradeProvider default: unreachable(networkType) } diff --git a/packages/maskbook/src/plugins/Trader/types/trader.ts b/packages/maskbook/src/plugins/Trader/types/trader.ts index e6853ce3ecde..856bb8e7a2c3 100644 --- a/packages/maskbook/src/plugins/Trader/types/trader.ts +++ b/packages/maskbook/src/plugins/Trader/types/trader.ts @@ -66,6 +66,7 @@ export enum ZrxTradePool { UniswapV3 = 'Uniswap_V3', WaultSwap = 'WaultSwap', xSigma = 'xSigma', + OolongSwap = 'OolongSwap', } export interface TradeComputed { diff --git a/packages/maskbook/src/plugins/UnlockProtocol/base.ts b/packages/maskbook/src/plugins/UnlockProtocol/base.ts index 84e4f26d6a7b..b55b7a2aad3e 100644 --- a/packages/maskbook/src/plugins/UnlockProtocol/base.ts +++ b/packages/maskbook/src/plugins/UnlockProtocol/base.ts @@ -13,7 +13,14 @@ export const base: Plugin.Shared.Definition = { networks: { type: 'opt-out', networks: {} }, target: 'stable', web3: { - operatingSupportedChains: [ChainId.Mainnet, ChainId.xDai, ChainId.Matic, ChainId.Rinkeby], + operatingSupportedChains: [ + ChainId.Mainnet, + ChainId.xDai, + ChainId.Matic, + ChainId.Rinkeby, + ChainId.Boba, + ChainId.Boba_Rinkeby, + ], }, }, } diff --git a/packages/maskbook/src/plugins/UnlockProtocol/constants.ts b/packages/maskbook/src/plugins/UnlockProtocol/constants.ts index a91ebaa9346f..f3530c9ec2fe 100644 --- a/packages/maskbook/src/plugins/UnlockProtocol/constants.ts +++ b/packages/maskbook/src/plugins/UnlockProtocol/constants.ts @@ -12,6 +12,7 @@ export const graphEndpointKeyVal = { [ChainId.Rinkeby]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/unlock-rinkeby', [ChainId.xDai]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/xdai', [ChainId.Matic]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/polygon', + [ChainId.Boba]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/boba', } export const keyServerEndpoint = 'https://unlock.r2d2.to/' diff --git a/packages/maskbook/src/plugins/Wallet/apis/debank.ts b/packages/maskbook/src/plugins/Wallet/apis/debank.ts index 0f92b3262246..f2ff581ab748 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.Boba]: 'bob', } 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..ba47cebf3664 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -48,6 +48,7 @@ export const resolveZerionAssetsScopeName = 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.Boba]: new URL('./wallet-network-icon/boba.png', import.meta.url).toString(), } export function NetworkIcon(props: NetworkIconProps) { diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png new file mode 100644 index 0000000000000000000000000000000000000000..adc63452fa65ba2e5341d810428bbeacb2cd51a6 GIT binary patch literal 26311 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 DHcphG literal 0 HcmV?d00001 diff --git a/packages/web3-constants/compile-constants.ts b/packages/web3-constants/compile-constants.ts index e212fab9c60f..0645a0340679 100644 --- a/packages/web3-constants/compile-constants.ts +++ b/packages/web3-constants/compile-constants.ts @@ -52,6 +52,8 @@ compileConstants(path.join(__dirname, 'evm'), [ 'Arbitrum', 'Arbitrum_Rinkeby', 'xDai', + 'Boba', + 'Boba_Rinkeby', ]) 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..48f805f19cbd 100644 --- a/packages/web3-constants/evm/airdrop.json +++ b/packages/web3-constants/evm/airdrop.json @@ -11,6 +11,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/chain.json b/packages/web3-constants/evm/chain.json index 770b0df1a336..b488b78fd94a 100644 --- a/packages/web3-constants/evm/chain.json +++ b/packages/web3-constants/evm/chain.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "EXPLORER_API_KEY": { "Mainnet": "99IX9MBZKG8FYQUECXDNDPATGVDDH6JCWW", @@ -25,6 +27,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/dhedge.json b/packages/web3-constants/evm/dhedge.json index 629305125d65..0f5f03996c35 100644 --- a/packages/web3-constants/evm/dhedge.json +++ b/packages/web3-constants/evm/dhedge.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "API_URL": { "Mainnet": "https://api-v2.dhedge.org/graphql", @@ -25,6 +27,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 1bd8c554e8ff..bd69357985b0 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -24,7 +24,11 @@ "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"], + "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/tokens.json"], + "Boba_Rinkeby": [ + "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/28/tokens.json" + ] }, "BALANCE_CHECKER_ADDRESS": { "Mainnet": "0xb1F8e55c7f64D203C1400B9D8555d050F94aDF39", @@ -38,7 +42,9 @@ "Mumbai": "0xFEd05EE9b7DdbAb97Abc55e27EF95C7c14688Aad", "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", - "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186" + "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", + "Boba": "", + "Boba_Rinkeby": "" }, "MULTICALL_ADDRESS": { "Mainnet": "0x1F98415757620B543A52E61c46B32eB19261F984", @@ -52,7 +58,9 @@ "Mumbai": "", "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", - "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B" + "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", + "Boba": "0xfb91c019D9F12A0f9c23B4762fa64A34F8daDb4A", + "Boba_Rinkeby": "0xE7d92C97168CaB02fF6550Ebf1b2Cc5D58f17321" }, "ENS_REGISTRAR_ADDRESS": { "Mainnet": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", @@ -66,7 +74,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "ENS_REVERSE_RECORDS_ADDRESS": { "Mainnet": "0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C", @@ -80,6 +90,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index 68a2058fd096..441ef093dba6 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BULK_CHECKOUT_ADDRESS": { "Mainnet": "0x7d655c57f71464B6f83811C55D84009Cd9f5221C", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "GITCOIN_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -39,7 +43,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "GITCOIN_TIP_PERCENTAGE": { "Mainnet": 5, @@ -53,6 +59,8 @@ "Mumbai": 5, "Arbitrum": 0, "Arbitrum_Rinkeby": 0, - "xDai": 0 + "xDai": 0, + "Boba": 0, + "Boba_Rinkeby": 0 } } diff --git a/packages/web3-constants/evm/good-ghosting.json b/packages/web3-constants/evm/good-ghosting.json index 758b65734b01..38a59c44dea9 100644 --- a/packages/web3-constants/evm/good-ghosting.json +++ b/packages/web3-constants/evm/good-ghosting.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "GOOD_GHOSTING_INCENTIVES_CONTRACT_ADDRESS": { "Mainnet": "", @@ -25,6 +27,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 4d75bc6a5565..3eccd88ee587 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MASK_ITO_CONTRACT_ADDRESS": { "Mainnet": "0x86812da3A623ab9606976078588b80C315E55FA3", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "ITO2_CONTRACT_ADDRESS": { "Mainnet": "0xc2CFbF22d6Dc87D0eE18d38d73733524c109Ff46", @@ -39,7 +43,9 @@ "Mumbai": "", "Arbitrum": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", - "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c" + "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", + "Boba": "", + "Boba_Rinkeby": "" }, "ITO2_CONTRACT_CREATION_BLOCK_HEIGHT": { "Mainnet": 12766513, @@ -53,7 +59,9 @@ "Mumbai": 0, "Arbitrum": 102022, "Arbitrum_Rinkeby": 708696, - "xDai": 17865755 + "xDai": 17865755, + "Boba": 0, + "Boba_Rinkeby": 0 }, "DEFAULT_QUALIFICATION_ADDRESS": { "Mainnet": "0x81b6ae377e360dcad63611846a2516f4ba8c88ac", @@ -67,7 +75,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "DEFAULT_QUALIFICATION2_ADDRESS": { "Mainnet": "0x4dC5f343Fe57E4fbDA1B454d125D396A3181272c", @@ -81,7 +91,9 @@ "Mumbai": "", "Arbitrum": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", "Arbitrum_Rinkeby": "0xEbd753E66649C824241E63894301BA8Db5DBF5Bb", - "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9" + "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", + "Boba": "", + "Boba_Rinkeby": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-mainnet", @@ -95,6 +107,8 @@ "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", + "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-boba", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/lbp.json b/packages/web3-constants/evm/lbp.json index bc0554b5bf79..001c37c0b0a9 100644 --- a/packages/web3-constants/evm/lbp.json +++ b/packages/web3-constants/evm/lbp.json @@ -11,6 +11,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index c8084a4fc5ae..b3ce9c899fcd 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MASK_BOX_CONTRACT_FROM_BLOCK": { "Mainnet": 13396393, @@ -25,7 +27,9 @@ "Mumbai": 0, "Arbitrum": 0, "Arbitrum_Rinkeby": 0, - "xDai": 0 + "xDai": 0, + "Boba": 0, + "Boba_Rinkeby": 0 }, "MASK_BOX_TEST_NFT": { "Mainnet": "", @@ -39,7 +43,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "WHITE_LIST_QUALIFICATION_CONTRACT_ADDRESS": { "Mainnet": "", @@ -53,7 +59,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SIG_VERIFY_QULIFICATION_CONTRACT_ADDRESS": { "Mainnet": "", @@ -67,6 +75,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index e5861953638b..630cba8710cf 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-mainnet", @@ -25,6 +27,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/opensea-api.json b/packages/web3-constants/evm/opensea-api.json index e91d10a4f3ef..134aaa0c4b35 100644 --- a/packages/web3-constants/evm/opensea-api.json +++ b/packages/web3-constants/evm/opensea-api.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "GET_SINGLE_ASSET_URL": { "Mainnet": "https://api.opensea.io/api/v1/asset", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "GET_ASSETS_URL": { "Mainnet": "https://api.opensea.io/api/v1/assets", @@ -39,6 +43,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/pooltogether.json b/packages/web3-constants/evm/pooltogether.json index 768c6c688fe5..6e7b74ca49ed 100644 --- a/packages/web3-constants/evm/pooltogether.json +++ b/packages/web3-constants/evm/pooltogether.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MASK_POOL_ADDRESS": { "Mainnet": "", @@ -25,6 +27,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index f33db96a1a77..3b1237396fd2 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "HAPPY_RED_PACKET_ADDRESS_V2": { "Mainnet": "0x8D8912E1237F9FF3EF661F32743CFB276E052F98", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "HAPPY_RED_PACKET_ADDRESS_V3": { "Mainnet": "", @@ -39,7 +43,9 @@ "Mumbai": "0x0061E06c9f640a03C4981f43762d2AE5e03873c5", "Arbitrum": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", "Arbitrum_Rinkeby": "0x6B70EC653c4331bdD0D0DCC7C941eb594e69a91d", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "HAPPY_RED_PACKET_ADDRESS_V4": { "Mainnet": "0xaBBe1101FD8fa5847c452A6D70C8655532B03C33", @@ -53,7 +59,9 @@ "Mumbai": "", "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", - "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B" + "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", + "Boba": "", + "Boba_Rinkeby": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", @@ -67,6 +75,8 @@ "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", + "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-boba", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index b6ddf4eb70ba..f6cac2d3cc70 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -11,7 +11,9 @@ "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/"], + "Boba": ["https://mainnet.boba.network/"], + "Boba_Rinkeby": ["https://rinkeby.boba.network/"] }, "RPC_WEIGHTS": { "Mainnet": [0, 0, 0, 0], @@ -25,6 +27,8 @@ "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], + "Boba": [0, 0, 0, 0], + "Boba_Rinkeby": [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..1f719aee3399 100644 --- a/packages/web3-constants/evm/space-station-galaxy.json +++ b/packages/web3-constants/evm/space-station-galaxy.json @@ -11,7 +11,9 @@ "Mumbai": "0x1e82cFbcF7292DEf91a2A5736265555883FF0289", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SUBGRAPH_URL": { "Mainnet": "", @@ -25,6 +27,8 @@ "Mumbai": "https://graphigo.stg.galaxy.eco/query", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-constants/evm/token-asset-base-url.json b/packages/web3-constants/evm/token-asset-base-url.json index 9568962517e5..0eb021fac9a5 100644 --- a/packages/web3-constants/evm/token-asset-base-url.json +++ b/packages/web3-constants/evm/token-asset-base-url.json @@ -38,6 +38,8 @@ ], "Arbitrum": [], "Arbitrum_Rinkeby": [], - "xDai": [] + "xDai": [], + "Boba": [], + "Boba_Rinkeby": [] } } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index aa614681e0b9..befa37a25366 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -11,7 +11,9 @@ "Mumbai": "0x0000000000000000000000000000000000000000", "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", - "xDai": "0x0000000000000000000000000000000000000000" + "xDai": "0x0000000000000000000000000000000000000000", + "Boba": "0x0000000000000000000000000000000000000000", + "Boba_Rinkeby": "0x0000000000000000000000000000000000000000" }, "WNATIVE_ADDRESS": { "Mainnet": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", @@ -25,7 +27,9 @@ "Mumbai": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", "Arbitrum": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "Arbitrum_Rinkeby": "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", - "xDai": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" + "xDai": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", + "Boba": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "Boba_Rinkeby": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000" }, "USDC_ADDRESS": { "Mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", @@ -39,7 +43,9 @@ "Mumbai": "", "Arbitrum": "0xe865dF68133fcEd7c2285ff3896B406CAfAa2dB8", "Arbitrum_Rinkeby": "", - "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83" + "xDai": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", + "Boba": "0x66a2A913e447d6b4BF33EFbec43aAeF87890FBbc", + "Boba_Rinkeby": "0xB24898De59C8E259F9742bCF2C16Fd613DCeA8F7" }, "USDT_ADDRESS": { "Mainnet": "0xdAC17F958D2ee523a2206206994597C13D831ec7", @@ -53,7 +59,9 @@ "Mumbai": "", "Arbitrum": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "Arbitrum_Rinkeby": "", - "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6" + "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", + "Boba": "0x5DE1677344D3Cb0D7D465c10b72A8f60699C062d", + "Boba_Rinkeby": "0x9d0364c866A73e34649869525CD7576080259A42" }, "HUSD_ADDRESS": { "Mainnet": "0xdf574c24545e5ffecb9a659c229253d4111d87e1", @@ -67,7 +75,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0x1e37E5b504F7773460d6eB0e24D2e7C223B66EC7" + "xDai": "0x1e37E5b504F7773460d6eB0e24D2e7C223B66EC7", + "Boba": "", + "Boba_Rinkeby": "" }, "BUSD_ADDRESS": { "Mainnet": "0x4fabb145d64652a948d72533023f6e7a623c7c53", @@ -81,7 +91,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff" + "xDai": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff", + "Boba": "", + "Boba_Rinkeby": "" }, "COMP_ADDRESS": { "Mainnet": "0xc00e94Cb662C3520282E6f5717214004A7f26888", @@ -95,7 +107,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "EASY_ADDRESS": { "Mainnet": "", @@ -109,7 +123,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MKR_ADDRESS": { "Mainnet": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", @@ -123,7 +139,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MASK_ADDRESS": { "Mainnet": "0x69af81e73A73B40adF4f3d4223Cd9b1ECE623074", @@ -137,7 +155,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MSKA_ADDRESS": { "Mainnet": "", @@ -151,7 +171,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MSKB_ADDRESS": { "Mainnet": "", @@ -165,7 +187,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MSKC_ADDRESS": { "Mainnet": "", @@ -179,7 +203,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MSKD_ADDRESS": { "Mainnet": "", @@ -193,7 +219,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "MSKE_ADDRESS": { "Mainnet": "", @@ -207,7 +235,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "DAI_ADDRESS": { "Mainnet": "0x6B175474E89094C44Da98b954EedeAC495271d0F", @@ -221,7 +251,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "0xf74195Bb8a5cf652411867c5C2C5b8C2a402be35", + "Boba_Rinkeby": "0x0630f97C8938051a44b0A64e9D4d484295393Fe4" }, "AMPL_ADDRESS": { "Mainnet": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", @@ -235,7 +267,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "OKB_ADDRESS": { "Mainnet": "0x75231F58b43240C9718Dd58B4967c5114342a86c", @@ -249,7 +283,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UST_ADDRESS": { "Mainnet": "0xa47c8bf37f92aBed4A126BDA807A7b7498661acD", @@ -263,7 +299,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "0xE5Ef1407928eBCe28a6f1a0759251b7187fEa726", + "Boba_Rinkeby": "" }, "eUSDC_ADDRESS": { "Mainnet": "", @@ -277,7 +315,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "eUSDT_ADDRESS": { "Mainnet": "", @@ -291,7 +331,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "eDAI_ADDRESS": { "Mainnet": "", @@ -305,7 +347,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNITOKEN_ADDRESS": { "Mainnet": "", @@ -319,7 +363,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "TT01_ADDRESS": { "Mainnet": "", @@ -333,7 +379,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "TT02_ADDRESS": { "Mainnet": "", @@ -347,7 +395,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "QUICK_ADDRESS": { "Mainnet": "", @@ -361,7 +411,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "WBTC_ADDRESS": { "Mainnet": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", @@ -375,7 +427,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252" + "xDai": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252", + "Boba": "0xdc0486f8bf31DF57a952bcd3c1d3e166e3d9eC8b", + "Boba_Rinkeby": "0x87EB6C9E8579582D2f02AbeD2c8589616D005210" }, "IGG_ADDRESS": { "Mainnet": "", @@ -389,7 +443,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "OM_ADDRESS": { "Mainnet": "", @@ -403,7 +459,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SUSHI_ADDRESS": { "Mainnet": "0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", @@ -417,7 +475,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "0x5fFccc55C0d2fd6D3AC32C26C020B3267e933F1b", + "Boba_Rinkeby": "" }, "YAM_ADDRESS": { "Mainnet": "0x0e2298E3B3390e3b945a5456fBf59eCc3f55DA16", @@ -431,7 +491,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "RUNE_ADDRESS": { "Mainnet": "0x3155BA85D5F96b2d030a4966AF206230e46849cb", @@ -445,7 +507,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "YFI_ADDRESS": { "Mainnet": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", @@ -459,7 +523,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "sUSD_ADDRESS": { "Mainnet": "0x57ab1ec28d129707052df4df418d58a2d46d5f51", @@ -473,7 +539,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BTCB_ADDRESS": { "Mainnet": "", @@ -487,7 +555,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "CAKE_ADDRESS": { "Mainnet": "", @@ -501,7 +571,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "maUSDC_ADDRESS": { "Mainnet": "", @@ -515,7 +587,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "stETH_ADDRESS": { "Mainnet": "0xDFe66B14D37C77F4E9b180cEb433d1b164f0281D", @@ -529,7 +603,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "NFTX_ADDRESS": { "Mainnet": "0x87d73E916D7057945c9BcD8cdd94e42A6F47f776", @@ -543,7 +619,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "ETHER_ADDRESS": { "Mainnet": "", @@ -557,7 +635,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "0x4200000000000000000000000000000000000006", + "Boba_Rinkeby": "0x4200000000000000000000000000000000000006" }, "NATIVE_TOKEN_ADDRESS": { "Mainnet": "0x0000000000000000000000000000000000000000", @@ -571,6 +651,8 @@ "Mumbai": "0x0000000000000000000000000000000000000000", "Arbitrum": "0x0000000000000000000000000000000000000000", "Arbitrum_Rinkeby": "0x0000000000000000000000000000000000000000", - "xDai": "0x0000000000000000000000000000000000000000" + "xDai": "0x0000000000000000000000000000000000000000", + "Boba": "0x0000000000000000000000000000000000000000", + "Boba_Rinkeby": "0x0000000000000000000000000000000000000000" } } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index f9b466a0d1dc..2f96ea8c8dd0 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V2_FACTORY_ADDRESS": { "Mainnet": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V2_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2", @@ -39,7 +43,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V2_INIT_CODE_HASH": { "Mainnet": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", @@ -53,7 +59,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_SWAP_ROUTER_ADDRESS": { "Mainnet": "0xe592427a0aece92de3edee1f18e0157c05861564", @@ -67,7 +75,9 @@ "Mumbai": "", "Arbitrum": "0xE592427A0AEce92De3Edee1F18E0157C05861564", "Arbitrum_Rinkeby": "0xE592427A0AEce92De3Edee1F18E0157C05861564", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V3_FACTORY_ADDRESS": { "Mainnet": "0x1F98431c8aD98523631AE4a59f267346ea31F984", @@ -81,7 +91,9 @@ "Mumbai": "", "Arbitrum": "0x1F98431c8aD98523631AE4a59f267346ea31F984", "Arbitrum_Rinkeby": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V3_QUOTER_ADDRESS": { "Mainnet": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", @@ -95,7 +107,9 @@ "Mumbai": "", "Arbitrum": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", "Arbitrum_Rinkeby": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V3_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", @@ -109,7 +123,9 @@ "Mumbai": "", "Arbitrum": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", "Arbitrum_Rinkeby": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V3_INIT_CODE_HASH": { "Mainnet": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", @@ -123,7 +139,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SUSHISWAP_ROUTER_ADDRESS": { "Mainnet": "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", @@ -137,7 +155,9 @@ "Mumbai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Arbitrum": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Arbitrum_Rinkeby": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", - "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506" + "xDai": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", + "Boba": "", + "Boba_Rinkeby": "" }, "SUSHISWAP_FACTORY_ADDRESS": { "Mainnet": "0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac", @@ -151,7 +171,9 @@ "Mumbai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Arbitrum_Rinkeby": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", - "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4" + "xDai": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", + "Boba": "", + "Boba_Rinkeby": "" }, "SUSHISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/zippoxer/sushiswap-subgraph-fork", @@ -165,7 +187,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SUSHISWAP_INIT_CODE_HASH": { "Mainnet": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", @@ -179,7 +203,9 @@ "Mumbai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Arbitrum_Rinkeby": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", - "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303" + "xDai": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", + "Boba": "", + "Boba_Rinkeby": "" }, "SASHIMISWAP_ROUTER_ADDRESS": { "Mainnet": "0xe4fe6a45f354e845f954cddee6084603cedb9410", @@ -193,7 +219,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SASHIMISWAP_FACTORY_ADDRESS": { "Mainnet": "0xF028F723ED1D0fE01cC59973C49298AA95c57472", @@ -207,7 +235,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SASHIMISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/sashimiproject/sashimi", @@ -221,7 +251,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "SASHIMISWAP_INIT_CODE_HASH": { "Mainnet": "0xb465bbe4edb8c9b0da8ff0b2b36ce0065de9fcd5a33f32c6856ea821779c8b72", @@ -235,7 +267,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "QUICKSWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -249,7 +283,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "QUICKSWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -263,7 +299,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "QUICKSWAP_THEGRAPH": { "Mainnet": "", @@ -277,7 +315,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "QUICKSWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -291,7 +331,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "PANCAKESWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -305,7 +347,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "PANCAKESWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -319,7 +363,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "PANCAKESWAP_THEGRAPH": { "Mainnet": "", @@ -333,7 +379,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "PANCAKESWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -347,7 +395,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BALANCER_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -361,7 +411,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BALANCER_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21", @@ -375,7 +427,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BALANCER_POOLS_URL": { "Mainnet": "https://ipfs.fleek.co/ipns/balancer-bucket.storage.fleek.co/balancer-exchange/pools", @@ -389,7 +443,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "DODO_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -403,7 +459,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "DODO_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149", @@ -417,7 +475,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BANCOR_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -431,7 +491,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "BANCOR_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x2F9EC37d6CcFFf1caB21733BdaDEdE11c823cCB0", @@ -445,6 +507,40 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" + }, + "OOLONGSWAP_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "0x5C6d452F4dF3A7b5D2A3928D8CAaE332718BbFF9", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0x7DDaF116889D655D1c486bEB95017a8211265d29", + "Boba_Rinkeby": "0xab740666e226cb5b6b451eb943b0257a7cb3ce0a" + }, + "OOLONGSWAP_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "0x6000eb83c2583AFD25D93cB0629D6b0a0B2F245c", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0x17C83E2B96ACfb5190d63F5E46d93c107eC0b514", + "Boba_Rinkeby": "0x4df04E20cCd9a8B82634754fcB041e86c5FF085A" } } diff --git a/packages/web3-constants/evm/trending.json b/packages/web3-constants/evm/trending.json index 41b00629b33d..5ebcd2fd9fbf 100644 --- a/packages/web3-constants/evm/trending.json +++ b/packages/web3-constants/evm/trending.json @@ -11,7 +11,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "UNISWAP_V2_HEALTH_URL": { "Mainnet": "https://api.thegraph.com/index-node/graphql", @@ -25,7 +27,9 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" }, "ETHEREUM_BLOCKS_SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/blocklytics/ethereum-blocks", @@ -39,6 +43,8 @@ "Mumbai": "", "Arbitrum": "", "Arbitrum_Rinkeby": "", - "xDai": "" + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "" } } diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 6cf783d64c85..40416d7505d7 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": "Boba Network", + "chain": "BOB", + "network": "mainnet", + "rpc": ["https://mainnet.boba.network/"], + "faucets": [], + "features": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://boba.network", + "shortName": "eth", + "chainId": 288, + "networkId": 288 + }, + { + "name": "Boba Network Rinkeby", + "chain": "BOB", + "network": "testnet", + "rpc": ["https://rinkeby.boba.network/"], + "faucets": [], + "features": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://boba.network", + "shortName": "eth", + "chainId": 28, + "networkId": 28 + }, { "name": "Metadium Mainnet", "chain": "META", diff --git a/packages/web3-shared/evm/assets/coingecko-asset-platforms.json b/packages/web3-shared/evm/assets/coingecko-asset-platforms.json index fd06d584767f..c1558774509a 100644 --- a/packages/web3-shared/evm/assets/coingecko-asset-platforms.json +++ b/packages/web3-shared/evm/assets/coingecko-asset-platforms.json @@ -5,6 +5,12 @@ "name": "Fantom", "shortname": "" }, + { + "id": "boba", + "chainId": 288, + "name": "Boba", + "shortname": "" + }, { "id": "binance-smart-chain", "chainId": 56, diff --git a/packages/web3-shared/evm/assets/coingecko-coin-list.json b/packages/web3-shared/evm/assets/coingecko-coin-list.json index a29202b5ce38..dbe91c1ea4a1 100644 --- a/packages/web3-shared/evm/assets/coingecko-coin-list.json +++ b/packages/web3-shared/evm/assets/coingecko-coin-list.json @@ -22,5 +22,11 @@ "symbol": "matic", "chainId": 137, "name": "Polygon" + }, + { + "id": "boba-network", + "symbol": "eth", + "chainId": 288, + "name": "Boba" } ] diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index d5442c7511bc..03c5eac71b9d 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.Boba]: 'Boba', }, 'Unknown', ) @@ -68,6 +70,8 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Arbitrum]: 'rgb(36, 150, 238)', [ChainId.Arbitrum_Rinkeby]: 'rgb(36, 150, 238)', [ChainId.xDai]: 'rgb(73, 169, 166)', + [ChainId.Boba]: 'rgb(204, 255, 0)', + [ChainId.Boba_Rinkeby]: 'rgb(204, 255, 0)', }, 'rgb(214, 217, 220)', ) diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index 2306ac03a7bf..cc536a59cc6f 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -40,6 +40,10 @@ export enum ChainId { // xDai xDai = 100, + + // Boba Network + Boba = 288, + Boba_Rinkeby = 28, } export enum ProviderType { @@ -63,6 +67,7 @@ export enum NetworkType { Polygon = 'Polygon', Arbitrum = 'Arbitrum', xDai = 'xDai', + Boba = 'Boba', } export interface Wallet { diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 33dfa7af8f65..63d03aacb767 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 { From 472407e29defeb7d721897743bef7688882febef Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 27 Dec 2021 01:13:44 +0000 Subject: [PATCH 02/32] feat(boba-network): add OolongSwap address --- .../src/plugins/Trader/constants/trader.ts | 1 + .../plugins/Trader/trader/useTradeCallback.ts | 2 + .../plugins/Trader/trader/useTradeComputed.ts | 1 + .../plugins/Trader/trader/useTradeContext.ts | 12 +++ .../src/plugins/Wallet/pipes/index.ts | 1 + packages/web3-constants/evm/trader.json | 32 ++++++++ pnpm-lock.yaml | 74 ++++++------------- 7 files changed, 73 insertions(+), 50 deletions(-) diff --git a/packages/maskbook/src/plugins/Trader/constants/trader.ts b/packages/maskbook/src/plugins/Trader/constants/trader.ts index 0f9655914cd2..d8c94506723a 100644 --- a/packages/maskbook/src/plugins/Trader/constants/trader.ts +++ b/packages/maskbook/src/plugins/Trader/constants/trader.ts @@ -61,6 +61,7 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Arbitrum_Rinkeby]: [WNATIVE[ChainId.Arbitrum_Rinkeby]], [ChainId.xDai]: [WNATIVE[ChainId.xDai]], [ChainId.Boba]: [WNATIVE[ChainId.Boba]], + [ChainId.Boba_Rinkeby]: [WNATIVE[ChainId.Boba_Rinkeby]], } export const BIPS_BASE = new BigNumber(10000) diff --git a/packages/maskbook/src/plugins/Trader/trader/useTradeCallback.ts b/packages/maskbook/src/plugins/Trader/trader/useTradeCallback.ts index 82f144e43a51..b7969428f488 100644 --- a/packages/maskbook/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/maskbook/src/plugins/Trader/trader/useTradeCallback.ts @@ -71,6 +71,8 @@ export function useTradeCallback(provider: TradeProvider, tradeComputed: TradeCo return uniswapV3Like case TradeProvider.SUSHISWAP: return uniswapV2Like + case TradeProvider.OOlONGSWAP: + return uniswapV2Like case TradeProvider.SASHIMISWAP: return uniswapV2Like case TradeProvider.QUICKSWAP: diff --git a/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts b/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts index 099f1f1e2c8d..17246ceb1617 100644 --- a/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts +++ b/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts @@ -122,6 +122,7 @@ export function useTradeComputed( switch (provider) { case TradeProvider.UNISWAP_V2: case TradeProvider.SUSHISWAP: + case TradeProvider.OOlONGSWAP: case TradeProvider.SASHIMISWAP: case TradeProvider.QUICKSWAP: case TradeProvider.PANCAKESWAP: diff --git a/packages/maskbook/src/plugins/Trader/trader/useTradeContext.ts b/packages/maskbook/src/plugins/Trader/trader/useTradeContext.ts index 62f3563c95ca..b4ca7c859441 100644 --- a/packages/maskbook/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/maskbook/src/plugins/Trader/trader/useTradeContext.ts @@ -108,6 +108,18 @@ export function useTradeContext(tradeProvider: TradeProvider) { TYPE: tradeProvider, ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).DODO_EXCHANGE_PROXY_ADDRESS, } + case TradeProvider.OOlONGSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, + INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, + } case TradeProvider.BANCOR: return { TYPE: tradeProvider, diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index ba47cebf3664..00faf3bf45fa 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 Date: Wed, 29 Dec 2021 18:53:07 +0000 Subject: [PATCH 03/32] Merge remote-tracking branch 'upstream/develop' into feat/integration-boba-network From d6b62cb73ad6d092104dffdaccb6259a2d713538 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 29 Dec 2021 21:23:34 +0000 Subject: [PATCH 04/32] chore(Fantom): add wallet-network-icon --- packages/mask/src/plugins/Trader/settings.ts | 22 +++++++++--------- .../src/UI/components/NetworkIcon/index.tsx | 1 + .../wallet-network-icon/fantom.png | Bin 0 -> 6219 bytes packages/web3-constants/evm/coingecko.json | 8 +++---- 4 files changed, 16 insertions(+), 15 deletions(-) create mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png diff --git a/packages/mask/src/plugins/Trader/settings.ts b/packages/mask/src/plugins/Trader/settings.ts index 2ccfb108e00c..5635423a492e 100644 --- a/packages/mask/src/plugins/Trader/settings.ts +++ b/packages/mask/src/plugins/Trader/settings.ts @@ -99,17 +99,17 @@ export interface TradeProviderSettings { pools: ZrxTradePool[] } -const uniswapV2Settings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+uniswap+v2`, '') -const uniswapV3Settings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+uniswap+v3`, '') -const zrxSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+zrx`, '') -const sushiswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+sushiswap`, '') -const sashimiswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+sashimiswap`, '') -const quickswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+quickswap`, '') -const pancakeswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+pancakeswap`, '') -const balancerSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+balancer`, '') -const dodoSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+dodo`, '') -const bancorSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+bancor`, '') -const oolongswapSettings = createInternalSettings(`${PLUGIN_IDENTIFIER}+tradeProvider+oolongswap`, '') +const uniswapV2Settings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+uniswap+v2`, '') +const uniswapV3Settings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+uniswap+v3`, '') +const zrxSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+zrx`, '') +const sushiswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+sushiswap`, '') +const sashimiswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+sashimiswap`, '') +const quickswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+quickswap`, '') +const pancakeswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+pancakeswap`, '') +const balancerSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+balancer`, '') +const dodoSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+dodo`, '') +const bancorSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+bancor`, '') +const oolongswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+oolongswap`, '') /** * The general settings of specific tarde provider diff --git a/packages/shared/src/UI/components/NetworkIcon/index.tsx b/packages/shared/src/UI/components/NetworkIcon/index.tsx index c32b4bb5cda6..491ee2d307ae 100644 --- a/packages/shared/src/UI/components/NetworkIcon/index.tsx +++ b/packages/shared/src/UI/components/NetworkIcon/index.tsx @@ -22,6 +22,7 @@ const icons: Record = { [NetworkType.xDai]: new URL('./wallet-network-icon/xdai.png', import.meta.url).toString(), [NetworkType.Boba]: new URL('./wallet-network-icon/boba.png', import.meta.url).toString(), [NetworkType.Celo]: new URL('./wallet-network-icon/celo.png', import.meta.url).toString(), + [NetworkType.Fantom]: new URL('./wallet-network-icon/fantom.png', import.meta.url).toString(), } export function NetworkIcon(props: NetworkIconProps) { diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png new file mode 100644 index 0000000000000000000000000000000000000000..899c7b1f6e5888c5c107be36281fb1042edd8cbf GIT binary patch literal 6219 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 literal 0 HcmV?d00001 diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index e3f574815876..022443368089 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -13,9 +13,9 @@ "Arbitrum_Rinkeby": "", "xDai": "xdai", "Celo": "celo", + "Fantom": "fantom", "Boba": "boba", - "Boba_Rinkeby": "", - "Fantom": "fantom" + "Boba_Rinkeby": "" }, "COIN_ID": { "Mainnet": "ethereum", @@ -31,8 +31,8 @@ "Arbitrum_Rinkeby": "", "xDai": "xdai", "Celo": "celo", + "Fantom": "fantom", "Boba": "boba", - "Boba_Rinkeby": "", - "Fantom": "fantom" + "Boba_Rinkeby": "" } } From 0e5062feea2330a38d72727209396b364fb582fa Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 29 Dec 2021 23:03:09 +0000 Subject: [PATCH 05/32] chore(boba): change onchange value type to string --- .../dashboard/src/pages/Labs/components/SwapSettingDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 59b799b075ac..5ad72d7f95f7 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -101,7 +101,7 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) legend: t.labs_settings_swap_network({ network: 'Boba' }), value: useBobaNetworkTradeProvider(), options: bobaOptions, - onChange: (value: any) => Services.Settings.setBobaNetworkTradeProvider(+value), + onChange: (value: string) => Services.Settings.setBobaNetworkTradeProvider(+value), }, { legend: t.labs_settings_swap_network({ network: 'Fantom' }), From c73ee723f7ce427d29620e46365cf07db79929b3 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 5 Jan 2022 11:54:27 +0000 Subject: [PATCH 06/32] feat(boba): add boba logo on evm constans and update balance checker address --- packages/mask/src/plugins/EVM/assets/boba.png | Bin 0 -> 26311 bytes packages/mask/src/plugins/EVM/constants.ts | 10 +++++ packages/web3-constants/evm/ethereum.json | 4 +- packages/web3-constants/evm/ito.json | 4 +- packages/web3-constants/evm/token-list.json | 3 +- packages/web3-shared/evm/assets/chains.json | 36 +++++++++++++++--- pnpm-lock.yaml | 1 + 7 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 packages/mask/src/plugins/EVM/assets/boba.png diff --git a/packages/mask/src/plugins/EVM/assets/boba.png b/packages/mask/src/plugins/EVM/assets/boba.png new file mode 100644 index 0000000000000000000000000000000000000000..adc63452fa65ba2e5341d810428bbeacb2cd51a6 GIT binary patch literal 26311 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 DHcphG literal 0 HcmV?d00001 diff --git a/packages/mask/src/plugins/EVM/constants.ts b/packages/mask/src/plugins/EVM/constants.ts index 960067629005..b9241063092a 100644 --- a/packages/mask/src/plugins/EVM/constants.ts +++ b/packages/mask/src/plugins/EVM/constants.ts @@ -147,6 +147,16 @@ export const PLUGIN_NETWORKS: Web3Plugin.NetworkDescriptor[] = [ iconColor: 'rgb(73, 169, 166)', isMainnet: true, }, + { + ID: `${PLUGIN_ID}_boba`, + networkSupporterPluginID: PLUGIN_ID, + chainId: ChainId.Boba, + type: NetworkType.Boba, + name: 'Boba', + icon: new URL('./assets/boba.png', import.meta.url), + iconColor: 'rgb(73, 169, 166)', + isMainnet: true, + }, ] export const PLUGIN_PROVIDERS: Web3Plugin.ProviderDescriptor[] = [ { diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 1be733de249f..422c1f43f74c 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -44,7 +44,7 @@ "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", "Fantom": "0xc119574d5fb333f5ac018658d4d8b5035e16bf39" }, @@ -62,7 +62,7 @@ "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Boba": "0xfb91c019D9F12A0f9c23B4762fa64A34F8daDb4A", - "Boba_Rinkeby": "0xE7d92C97168CaB02fF6550Ebf1b2Cc5D58f17321", + "Boba_Rinkeby": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", "Fantom": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c" }, diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index a666c024f021..c0484e41ed44 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -13,7 +13,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0x97369fEE7db34E0BfE47861f2ec44b4378d13eB4", "Celo": "", "Fantom": "" }, @@ -67,7 +67,7 @@ "Arbitrum_Rinkeby": 708696, "xDai": 17865755, "Boba": 0, - "Boba_Rinkeby": 0, + "Boba_Rinkeby": 83114, "Celo": 10278776, "Fantom": 0 }, diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 6b18d73e9def..85be8e6926d6 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -26,6 +26,7 @@ ], "xDai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/100/tokens.json"], "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"] + "Fantom": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/250/tokens.json"], + "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/tokens.json"] } } diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 3935340a8331..8617c9d025dd 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -336,29 +336,53 @@ }, { "name": "Boba Network", - "chain": "BOB", + "chain": "BOBA", "network": "mainnet", "rpc": ["https://mainnet.boba.network/"], "faucets": [], "features": [], - "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18, + "logoURI": "https://raw.githubusercontent.com/sushiswap/icons/master/token/eth.jpg" + }, "infoURL": "https://boba.network", "shortName": "eth", "chainId": 288, - "networkId": 288 + "networkId": 288, + "explorers": [ + { + "name": "blockexplorer", + "url": "https://blockexplorer.boba.network/", + "standard": "EIP3091" + } + ] }, { "name": "Boba Network Rinkeby", - "chain": "BOB", + "chain": "BOBA", "network": "testnet", "rpc": ["https://rinkeby.boba.network/"], "faucets": [], "features": [], - "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18, + "logoURI": "https://raw.githubusercontent.com/sushiswap/icons/master/token/eth.jpg" + }, "infoURL": "https://boba.network", "shortName": "eth", "chainId": 28, - "networkId": 28 + "networkId": 28, + "explorers": [ + { + "name": "blockexplorer", + "url": "https://blockexplorer.rinkeby.boba.network/", + "standard": "EIP3091" + } + ] }, { "name": "Metadium Mainnet", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f5f044c7a32..3d9373b39530 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3479,6 +3479,7 @@ packages: /@dimensiondev/eslint-plugin/0.0.1-20220104011158-0905fa1_eslint@8.5.0: resolution: {integrity: sha512-DyAzOQp2Dp9Nzll6dTbujqyBAXOLhlWXvDdmnfX3+cHixhvaupbMeoh4MmujkOY681N5ohVm2eKWJd/ApC4lrQ==, tarball: download/@dimensiondev/eslint-plugin/0.0.1-20220104011158-0905fa1/931c157d880a7f8a78e87326a2840ad7d4583b5c714f155e045f73a11969fc82} + engines: {node: '>= 14'} peerDependencies: eslint: '>= 8' dependencies: From 51dc9f8117da40767c303524c0e74c38cc3bdd71 Mon Sep 17 00:00:00 2001 From: Septs Date: Wed, 5 Jan 2022 20:51:01 +0800 Subject: [PATCH 07/32] chore: improve chain id --- .../components/shared/ApplicationBoard.tsx | 30 ++++++++----------- .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 24 +++++++-------- .../src/plugins/Trader/trader/0x/constants.ts | 3 ++ .../Trader/trader/0x/useTradeCallback.ts | 13 ++------ .../Trader/trader/0x/useTradeGasLimit.ts | 4 +-- 5 files changed, 31 insertions(+), 43 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/trader/0x/constants.ts diff --git a/packages/mask/src/components/shared/ApplicationBoard.tsx b/packages/mask/src/components/shared/ApplicationBoard.tsx index 97cc5d144006..c53d508f20fb 100644 --- a/packages/mask/src/components/shared/ApplicationBoard.tsx +++ b/packages/mask/src/components/shared/ApplicationBoard.tsx @@ -84,6 +84,16 @@ const useStyles = makeStyles()((theme) => ({ }, })) +const SUPPORTED_CHAIN_ID_LIST = [ + ChainId.Mainnet, + ChainId.BSC, + ChainId.Matic, + ChainId.Arbitrum, + ChainId.xDai, + ChainId.Celo, + ChainId.Fantom, +] + export interface MaskAppEntry { title: string img: string @@ -281,15 +291,7 @@ export function ApplicationBoard({ secondEntries, secondEntryChainTabs }: MaskAp ]), createEntry('dHEDGE', new URL('./assets/dHEDGE.png', import.meta.url).toString(), () => {}), ], - [ - ChainId.Mainnet, - ChainId.BSC, - ChainId.Matic, - ChainId.Arbitrum, - ChainId.xDai, - ChainId.Celo, - ChainId.Fantom, - ], + SUPPORTED_CHAIN_ID_LIST, ), undefined, true, @@ -308,15 +310,7 @@ export function ApplicationBoard({ secondEntries, secondEntryChainTabs }: MaskAp () => {}, ), ], - [ - ChainId.Mainnet, - ChainId.BSC, - ChainId.Matic, - ChainId.Arbitrum, - ChainId.xDai, - ChainId.Celo, - ChainId.Fantom, - ], + SUPPORTED_CHAIN_ID_LIST, ), undefined, true, diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index c310bc6448d0..27140adaf83d 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -214,6 +214,15 @@ interface ClaimAllDialogProps { open: boolean } +const SUPPORTED_CHAIN_ID_LIST = [ + ChainId.Mainnet, + ChainId.BSC, + ChainId.Matic, + ChainId.Arbitrum, + ChainId.xDai, + ChainId.Fantom, +] + export function ClaimAllDialog(props: ClaimAllDialogProps) { const { t } = useI18N() const { open, onClose } = props @@ -227,11 +236,7 @@ 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, ChainId.Fantom].includes( - currentChainId, - ) - ? currentChainId - : ChainId.Mainnet, + SUPPORTED_CHAIN_ID_LIST.includes(currentChainId) ? currentChainId : ChainId.Mainnet, ) const { value: swappedTokens, loading, retry } = useClaimablePools(chainId) const { ITO_CONTRACT_ADDRESS: ITO_CONTRACT_ADDRESS_MAINNET } = useITOConstants(ChainId.Mainnet) @@ -368,14 +373,7 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { chainId={chainId} setChainId={setChainId} classes={classes} - chains={[ - ChainId.Mainnet, - ChainId.BSC, - ChainId.Matic, - ChainId.Arbitrum, - ChainId.xDai, - ChainId.Fantom, - ]} + chains={SUPPORTED_CHAIN_ID_LIST} />
diff --git a/packages/mask/src/plugins/Trader/trader/0x/constants.ts b/packages/mask/src/plugins/Trader/trader/0x/constants.ts new file mode 100644 index 000000000000..f7e8ee3aefe7 --- /dev/null +++ b/packages/mask/src/plugins/Trader/trader/0x/constants.ts @@ -0,0 +1,3 @@ +import { ChainId } from '@masknet/web3-shared-evm' + +export const SUPPORTED_CHAIN_IDS = [ChainId.Mainnet, ChainId.BSC, ChainId.Matic] diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/0x/useTradeCallback.ts index bb4a414cc730..56a0a3d26657 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTradeCallback.ts @@ -2,16 +2,10 @@ import { useCallback, useMemo, useState } from 'react' import stringify from 'json-stable-stringify' import { pick } from 'lodash-unified' import type { TransactionConfig } from 'web3-core' -import { - ChainId, - GasOptionConfig, - TransactionState, - TransactionStateType, - useAccount, - useWeb3, -} from '@masknet/web3-shared-evm' +import { GasOptionConfig, TransactionState, TransactionStateType, useAccount, useWeb3 } from '@masknet/web3-shared-evm' import type { SwapQuoteResponse, TradeComputed } from '../../types' import { TargetChainIdContext } from '../useTargetChainIdContext' +import { SUPPORTED_CHAIN_IDS } from './constants' export function useTradeCallback(tradeComputed: TradeComputed | null, gasConfig?: GasOptionConfig) { const account = useAccount() @@ -24,8 +18,7 @@ export function useTradeCallback(tradeComputed: TradeComputed // compose transaction config const config = useMemo(() => { - if (!account || !tradeComputed?.trade_ || ![ChainId.Mainnet, ChainId.BSC, ChainId.Matic].includes(chainId)) - return null + if (!account || !tradeComputed?.trade_ || !SUPPORTED_CHAIN_IDS.includes(chainId)) return null return { from: account, ...pick(tradeComputed.trade_, ['to', 'data', 'value', 'gas', 'gasPrice']), diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTradeGasLimit.ts b/packages/mask/src/plugins/Trader/trader/0x/useTradeGasLimit.ts index 40bb83acbda7..3375072b1bda 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTradeGasLimit.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTradeGasLimit.ts @@ -1,14 +1,14 @@ import type { TradeComputed, SwapQuoteResponse } from '../../types' import { useMemo } from 'react' import { TargetChainIdContext } from '../useTargetChainIdContext' -import { ChainId } from '../../../../../../web3-shared/evm' import BigNumber from 'bignumber.js' +import { SUPPORTED_CHAIN_IDS } from './constants' export function useTradeGasLimit(tradeComputed: TradeComputed | null) { const { targetChainId } = TargetChainIdContext.useContainer() return useMemo(() => { - if (!tradeComputed?.trade_ || ![ChainId.Mainnet, ChainId.BSC, ChainId.Matic].includes(targetChainId)) return 0 + if (!tradeComputed?.trade_ || !SUPPORTED_CHAIN_IDS.includes(targetChainId)) return 0 return new BigNumber(tradeComputed.trade_.gas).toNumber() }, [targetChainId, tradeComputed]) } From e4fa11a4cc9fac04b407482644c7d21cfa1e6f0b Mon Sep 17 00:00:00 2001 From: Septs Date: Wed, 5 Jan 2022 21:23:54 +0800 Subject: [PATCH 08/32] refactor: opensea api --- .../mask/src/plugins/Wallet/apis/opensea.ts | 84 +++++++------------ 1 file changed, 32 insertions(+), 52 deletions(-) diff --git a/packages/mask/src/plugins/Wallet/apis/opensea.ts b/packages/mask/src/plugins/Wallet/apis/opensea.ts index 2fc239fa9339..f483dd5b9707 100644 --- a/packages/mask/src/plugins/Wallet/apis/opensea.ts +++ b/packages/mask/src/plugins/Wallet/apis/opensea.ts @@ -1,4 +1,5 @@ import { ChainId } from '@masknet/web3-shared-evm' +import urlcat from 'urlcat' import { OPENSEA_API_KEY } from '../constants' interface AssetContract { @@ -120,62 +121,41 @@ export interface CollectionsResponse { collections: AssetCollection[] } -export async function getAssetsList( - from: string, - opts: { chainId?: ChainId; page?: number; size?: number; collection?: string }, -) { - const { chainId = ChainId.Mainnet, page = 0, size = 50, collection } = opts - const params = new URLSearchParams() - params.append('owner', from.toLowerCase()) - params.append('limit', String(size)) - params.append('offset', String(size * page)) - if (collection) { - params.append('collection', collection) - } +interface BaseOptions { + chainId?: ChainId + page?: number + size?: number +} - if (![ChainId.Mainnet, ChainId.Rinkeby].includes(chainId)) - return { - assets: [], - } as AssetsListResponse +const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.Rinkeby] - const response = await fetch( - `https://${chainId === ChainId.Mainnet ? 'api' : 'rinkeby-api'}.opensea.io/api/v1/assets?${params.toString()}`, - { - method: 'GET', - mode: 'cors', - headers: { - 'x-api-key': OPENSEA_API_KEY, - }, - }, - ) - return (await response.json()) as AssetsListResponse +export function getAssetsList(from: string, opts: BaseOptions & { collection?: string }): Promise { + const { chainId = ChainId.Mainnet, page = 0, size = 50, collection } = opts + if (!SUPPORTED_CHAIN_ID_LIST.includes(chainId)) return Promise.resolve({ assets: [] }) + return request(chainId, '/api/v1/assets', { + owner: from.toLowerCase(), + limit: size, + offset: size * page, + collection, + }) } -export async function getCollections(owner: string, opts: { chainId?: ChainId; page?: number; size?: number }) { +export function getCollections(owner: string, opts: BaseOptions): Promise { const { chainId = ChainId.Mainnet, page = 0, size = 300 } = opts - const params = new URLSearchParams() - params.append('asset_owner', owner.toLowerCase()) - params.append('limit', String(size)) - params.append('offset', String(size * page)) - - if (![ChainId.Mainnet, ChainId.Rinkeby].includes(chainId)) - return { - collections: [], - } as CollectionsResponse - - const response = await fetch( - `https://${ - chainId === ChainId.Mainnet ? 'api' : 'rinkeby-api' - }.opensea.io/api/v1/collections?${params.toString()}`, - { - method: 'GET', - mode: 'cors', - headers: { - 'x-api-key': OPENSEA_API_KEY, - }, - }, - ) - const collections = (await response.json()) as AssetCollection[] + if (!SUPPORTED_CHAIN_ID_LIST.includes(chainId)) return Promise.resolve({ collections: [] }) + return request(chainId, '/api/v1/collections', { + asset_owner: owner.toLowerCase(), + limit: size, + offset: size * page, + }) +} - return { collections } +async function request(chainId: ChainId, requestPath: string, params: object): Promise { + const domain = chainId === ChainId.Mainnet ? 'https://api.opensea.io' : 'https://rinkeby-api.opensea.io' + const response = await fetch(urlcat(domain, requestPath, params), { + method: 'GET', + mode: 'cors', + headers: { 'x-api-key': OPENSEA_API_KEY }, + }) + return response.json() } From 3a2ef088510638de51eaa76aef9bca31c2f6a719 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 5 Jan 2022 13:35:21 +0000 Subject: [PATCH 09/32] chore(boba): fixed review issues --- .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 36 ++++++++------ .../Trader/trader/useGetTradeContext.ts | 24 ++++----- .../plugins/Trader/trader/useTradeContext.ts | 24 ++++----- .../plugins/Trader/trader/useTradeComputed.ts | 49 ++++++++++--------- .../src/plugins/Wallet/apis/debank.ts | 21 ++++---- .../src/plugins/Wallet/pipes/index.ts | 15 ++---- .../src/UI/components/NetworkIcon/index.tsx | 5 +- 7 files changed, 84 insertions(+), 90 deletions(-) diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index ec27682fb66c..369af3707846 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -221,11 +221,17 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { const DialogRef = useRef(null) const account = useAccount() const currentChainId = useChainId() - const { - value: campaignInfos, - loading: loadingAirdrop, - retry: retryAirdrop, - } = useSpaceStationCampaignInfo(account, Flags.nft_airdrop_enabled) + + const tabItems: Record = { + [ChainId.Mainnet]: 'ETH', + [ChainId.BSC]: 'BSC', + [ChainId.Matic]: 'Polygon/Matic', + [ChainId.Arbitrum]: 'Arbitrum', + [ChainId.xDai]: 'xDai ', + [ChainId.Fantom]: 'Fantom', + [ChainId.Celo]: 'Celo', + [ChainId.Boba]: 'Boba', + } const [chainId, setChainId] = useState( [ @@ -236,10 +242,17 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { ChainId.xDai, ChainId.Boba, ChainId.Fantom, + ChainId.Celo, ].includes(currentChainId) ? currentChainId : ChainId.Mainnet, ) + const { + value: campaignInfos, + loading: loadingAirdrop, + retry: retryAirdrop, + } = useSpaceStationCampaignInfo(account, Flags.nft_airdrop_enabled) + const { value: swappedTokens, loading, retry } = useClaimablePools(chainId) const { ITO_CONTRACT_ADDRESS: ITO_CONTRACT_ADDRESS_MAINNET } = useITOConstants(ChainId.Mainnet) const { ITO2_CONTRACT_ADDRESS } = useITOConstants(chainId) @@ -365,17 +378,8 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { }) const tabProps: AbstractTabProps = { - tabs: [ - createTabItem('ETH', ChainId.Mainnet), - createTabItem('BSC', ChainId.BSC), - createTabItem('Polygon/Matic', ChainId.Matic), - createTabItem('Arbitrum', ChainId.Arbitrum), - createTabItem('xDai', ChainId.xDai), - createTabItem('Boba', ChainId.Boba), - ], - index: [ChainId.Mainnet, ChainId.BSC, ChainId.Matic, ChainId.Arbitrum, ChainId.xDai, ChainId.Boba].indexOf( - chainId, - ), + tabs: Object.entries(tabItems).map(([chainId, displayName]) => createTabItem(displayName, chainId)), + index: Object.keys(tabItems).indexOf(chainId), classes, hasOnlyOneChild: true, } diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index e58c2a2d64e5..70f5c68e59b1 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -94,6 +94,18 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: PANCAKESWAP_CUSTOM_BASES, } + case TradeProvider.OOLONGSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, + INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, @@ -113,18 +125,6 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { TYPE: tradeProvider, ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).BANCOR_EXCHANGE_PROXY_ADDRESS, } - case TradeProvider.OOLONGSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, - } case TradeProvider.OPENOCEAN: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 7af2037a682c..47e026e0f626 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -95,6 +95,18 @@ export function useTradeContext(tradeProvider: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: PANCAKESWAP_CUSTOM_BASES, } + case TradeProvider.OOLONGSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, + INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, @@ -109,18 +121,6 @@ export function useTradeContext(tradeProvider: TradeProvider) { TYPE: tradeProvider, ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).DODO_EXCHANGE_PROXY_ADDRESS, } - case TradeProvider.OOLONGSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, - } case TradeProvider.BANCOR: return { TYPE: tradeProvider, diff --git a/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts b/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts index 8b9a02215e7d..d748bc315055 100644 --- a/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts +++ b/packages/maskbook/src/plugins/Trader/trader/useTradeComputed.ts @@ -1,6 +1,7 @@ import { useContext } from 'react' import BigNumber from 'bignumber.js' -import { pow10, FungibleTokenDetailed } from '@masknet/web3-shared-evm' +import { FungibleTokenDetailed } from '@masknet/web3-shared-evm' +import { rightShift } from '@masknet/web3-shared-base/utils/number' import type { TradeStrategy } from '../types' import { useTrade as useNativeTokenTrade } from './native/useTrade' import { useTradeComputed as useNativeTokenTradeComputed } from './native/useTradeComputed' @@ -22,15 +23,17 @@ import { TradeContext } from './useTradeContext' export function useTradeComputed( provider: TradeProvider, strategy: TradeStrategy, - inputAmount: string, - outputAmount: string, + inputAmount: BigNumber.Value = '0', + outputAmount: BigNumber.Value = '0', inputToken?: FungibleTokenDetailed, outputToken?: FungibleTokenDetailed, ) { - const inputTokenProduct = pow10(inputToken?.decimals ?? 0) - const outputTokenProduct = pow10(outputToken?.decimals ?? 0) - const inputAmount_ = new BigNumber(inputAmount || '0').multipliedBy(inputTokenProduct).integerValue().toFixed() - const outputAmount_ = new BigNumber(outputAmount || '0').multipliedBy(outputTokenProduct).integerValue().toFixed() + inputAmount = rightShift(inputAmount, inputToken?.decimals ?? 0) + .integerValue() + .toFixed() + outputAmount = rightShift(outputAmount, outputToken?.decimals ?? 0) + .integerValue() + .toFixed() // trade context const context = useContext(TradeContext) @@ -40,8 +43,8 @@ export function useTradeComputed( const nativeToken = useNativeTokenTradeComputed( nativeToken_.value ?? false, strategy, - inputAmount_, - outputAmount_, + inputAmount, + outputAmount, inputToken, outputToken, ) @@ -49,8 +52,8 @@ export function useTradeComputed( // uniswap-v2 like providers const uniswapV2_ = useUniswapV2Trade( strategy, - context?.IS_UNISWAP_V2_LIKE ? inputAmount_ : '0', - context?.IS_UNISWAP_V2_LIKE ? outputAmount_ : '0', + context?.IS_UNISWAP_V2_LIKE ? inputAmount : '0', + context?.IS_UNISWAP_V2_LIKE ? outputAmount : '0', inputToken, outputToken, ) @@ -59,8 +62,8 @@ export function useTradeComputed( // uniswap-v3 like providers const uniswapV3_ = useUniswapV3Trade( strategy, - context?.IS_UNISWAP_V3_LIKE ? inputAmount_ : '0', - context?.IS_UNISWAP_V3_LIKE ? outputAmount_ : '0', + context?.IS_UNISWAP_V3_LIKE ? inputAmount : '0', + context?.IS_UNISWAP_V3_LIKE ? outputAmount : '0', inputToken, outputToken, ) @@ -69,8 +72,8 @@ export function useTradeComputed( // zrx const zrx_ = useZrxTrade( strategy, - provider === TradeProvider.ZRX ? inputAmount_ : '0', - provider === TradeProvider.ZRX ? outputAmount_ : '0', + provider === TradeProvider.ZRX ? inputAmount : '0', + provider === TradeProvider.ZRX ? outputAmount : '0', inputToken, outputToken, ) @@ -79,16 +82,16 @@ export function useTradeComputed( // balancer const balancer_ = useBalancerTrade( strategy, - provider === TradeProvider.BALANCER ? inputAmount_ : '0', - provider === TradeProvider.BALANCER ? outputAmount_ : '0', + provider === TradeProvider.BALANCER ? inputAmount : '0', + provider === TradeProvider.BALANCER ? outputAmount : '0', inputToken, outputToken, ) const balancer = useBalancerTradeComputed( balancer_.value ?? null, strategy, - provider === TradeProvider.BALANCER ? inputAmount_ : '0', - provider === TradeProvider.BALANCER ? outputAmount_ : '0', + provider === TradeProvider.BALANCER ? inputAmount : '0', + provider === TradeProvider.BALANCER ? outputAmount : '0', inputToken, outputToken, ) @@ -96,8 +99,8 @@ export function useTradeComputed( // dodo const dodo_ = useDODOTrade( strategy, - provider === TradeProvider.DODO ? inputAmount_ : '0', - provider === TradeProvider.DODO ? outputAmount_ : '0', + provider === TradeProvider.DODO ? inputAmount : '0', + provider === TradeProvider.DODO ? outputAmount : '0', inputToken, outputToken, ) @@ -105,8 +108,8 @@ export function useTradeComputed( const bancor_ = useBancorTrade( strategy, - provider === TradeProvider.BANCOR ? inputAmount_ : '0', - provider === TradeProvider.BANCOR ? outputAmount_ : '0', + provider === TradeProvider.BANCOR ? inputAmount : '0', + provider === TradeProvider.BANCOR ? outputAmount : '0', inputToken, outputToken, ) diff --git a/packages/maskbook/src/plugins/Wallet/apis/debank.ts b/packages/maskbook/src/plugins/Wallet/apis/debank.ts index f2ff581ab748..5d109b1c2f77 100644 --- a/packages/maskbook/src/plugins/Wallet/apis/debank.ts +++ b/packages/maskbook/src/plugins/Wallet/apis/debank.ts @@ -4,17 +4,17 @@ import { ChainId } from '@masknet/web3-shared-evm' const DEBANK_API = 'https://api.debank.com' -export async function getTransactionList(address: string, chain: string) { - const response = await fetch(`${DEBANK_API}/history/list?user_addr=${address.toLowerCase()}&chain=${chain}`) - return (await response.json()) as HistoryResponse +export async function getTransactionList(address: string, chain: string): Promise { + const response = await fetch(urlcat(DEBANK_API, '/history/list', { user_addr: address.toLowerCase(), chain })) + return response.json() } -export async function getAssetsList(address: string) { - const response = await fetch(`${DEBANK_API}/token/balance_list?is_all=true&user_addr=${address.toLowerCase()}`) - return (await response.json()) as BalanceListResponse +export async function getAssetsList(address: string): Promise { + const response = await fetch(DEBANK_API, '/token/balance_list', { is_all: true, user_addr: address.toLowerCase() }) + return response.json() } -const chainIdMap: Record = { +const chainIdMap: Record = { [ChainId.Mainnet]: 'eth', [ChainId.BSC]: 'bsc', [ChainId.xDai]: 'xdai', @@ -23,16 +23,15 @@ const chainIdMap: Record = { [ChainId.Boba]: 'bob', } -const getDebankChain = (chainId: number) => { +const getDebankChain = (chainId: ChainId) => { return chainIdMap[chainId] ?? '' } export async function getGasPriceDict(chainId: ChainId) { const chain = getDebankChain(chainId) const response = await fetch(urlcat(DEBANK_API, '/chain/gas_price_dict_v2', { chain })) - const result = await response.json() + const result: GasPriceDictResponse = await response.json() if (result.error_code === 0) { - return result as GasPriceDictResponse + return result } - return null } diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index 00faf3bf45fa..6e9f277e9b92 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -74,18 +74,9 @@ export const resolveChainByScope = createLookupTableResolver< } >( { - assets: { - chain: 'eth', - chainId: ChainId.Mainnet, - }, - 'bsc-assets': { - chain: 'bsc', - chainId: ChainId.BSC, - }, - 'polygon-assets': { - chain: 'matic', - chainId: ChainId.Matic, - }, + assets: { chain: 'eth', chainId: ChainId.Mainnet }, + 'bsc-assets': { chain: 'bsc', chainId: ChainId.BSC }, + 'polygon-assets': { chain: 'matic', chainId: ChainId.Matic }, }, { chain: 'unknown', diff --git a/packages/shared/src/UI/components/NetworkIcon/index.tsx b/packages/shared/src/UI/components/NetworkIcon/index.tsx index 491ee2d307ae..6adc2cfc5339 100644 --- a/packages/shared/src/UI/components/NetworkIcon/index.tsx +++ b/packages/shared/src/UI/components/NetworkIcon/index.tsx @@ -30,8 +30,5 @@ export function NetworkIcon(props: NetworkIconProps) { const classes = useStylesExtends(useStyles(), props) if (!networkType) return null - - return icons[networkType] ? ( - - ) : null + return } From a2ca6318f639d68f2f11e968a88d08fc1ea5f82d Mon Sep 17 00:00:00 2001 From: Septs Date: Wed, 5 Jan 2022 21:23:54 +0800 Subject: [PATCH 10/32] refactor: opensea api --- .../mask/src/plugins/Wallet/apis/opensea.ts | 80 +++++++------------ 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/packages/mask/src/plugins/Wallet/apis/opensea.ts b/packages/mask/src/plugins/Wallet/apis/opensea.ts index 2fc239fa9339..389cda0339e1 100644 --- a/packages/mask/src/plugins/Wallet/apis/opensea.ts +++ b/packages/mask/src/plugins/Wallet/apis/opensea.ts @@ -1,4 +1,5 @@ import { ChainId } from '@masknet/web3-shared-evm' +import urlcat from 'urlcat' import { OPENSEA_API_KEY } from '../constants' interface AssetContract { @@ -120,62 +121,37 @@ export interface CollectionsResponse { collections: AssetCollection[] } -export async function getAssetsList( - from: string, - opts: { chainId?: ChainId; page?: number; size?: number; collection?: string }, -) { - const { chainId = ChainId.Mainnet, page = 0, size = 50, collection } = opts - const params = new URLSearchParams() - params.append('owner', from.toLowerCase()) - params.append('limit', String(size)) - params.append('offset', String(size * page)) - if (collection) { - params.append('collection', collection) - } +type Options = { chainId?: ChainId; page?: number; size?: number } & T - if (![ChainId.Mainnet, ChainId.Rinkeby].includes(chainId)) - return { - assets: [], - } as AssetsListResponse +const SUPPORTED_CHAIN_ID_LIST = [ChainId.Mainnet, ChainId.Rinkeby] - const response = await fetch( - `https://${chainId === ChainId.Mainnet ? 'api' : 'rinkeby-api'}.opensea.io/api/v1/assets?${params.toString()}`, - { - method: 'GET', - mode: 'cors', - headers: { - 'x-api-key': OPENSEA_API_KEY, - }, - }, - ) - return (await response.json()) as AssetsListResponse +export function getAssetsList(from: string, opts: Options<{ collection?: string }>): Promise { + const { chainId = ChainId.Mainnet, page = 0, size = 50, collection } = opts + if (!SUPPORTED_CHAIN_ID_LIST.includes(chainId)) return Promise.resolve({ assets: [] }) + return request(chainId, '/assets', { + owner: from.toLowerCase(), + limit: size, + offset: size * page, + collection, + }) } -export async function getCollections(owner: string, opts: { chainId?: ChainId; page?: number; size?: number }) { +export function getCollections(owner: string, opts: Options): Promise { const { chainId = ChainId.Mainnet, page = 0, size = 300 } = opts - const params = new URLSearchParams() - params.append('asset_owner', owner.toLowerCase()) - params.append('limit', String(size)) - params.append('offset', String(size * page)) - - if (![ChainId.Mainnet, ChainId.Rinkeby].includes(chainId)) - return { - collections: [], - } as CollectionsResponse - - const response = await fetch( - `https://${ - chainId === ChainId.Mainnet ? 'api' : 'rinkeby-api' - }.opensea.io/api/v1/collections?${params.toString()}`, - { - method: 'GET', - mode: 'cors', - headers: { - 'x-api-key': OPENSEA_API_KEY, - }, - }, - ) - const collections = (await response.json()) as AssetCollection[] + if (!SUPPORTED_CHAIN_ID_LIST.includes(chainId)) return Promise.resolve({ collections: [] }) + return request(chainId, '/collections', { + asset_owner: owner.toLowerCase(), + limit: size, + offset: size * page, + }) +} - return { collections } +async function request(chainId: ChainId, requestPath: string, params: object): Promise { + const subdomain = chainId === ChainId.Mainnet ? 'api' : 'rinkeby-api' + const response = await fetch(urlcat(`https://${subdomain}.opensea.io/api/v1/`, requestPath, params), { + method: 'GET', + mode: 'cors', + headers: { 'x-api-key': OPENSEA_API_KEY }, + }) + return response.json() } From 8ec4718b111f51d560b09e8f93e355f4f31b693a Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 5 Jan 2022 14:29:07 +0000 Subject: [PATCH 11/32] chore(boba): fixed pr review NATIVE_TOKEN_ADDRESS and chainList --- .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 16 ++-------------- .../src/plugins/Trader/trader/0x/useTrade.ts | 12 ++++-------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 369af3707846..e16c4ae7e3e6 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -233,20 +233,8 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { [ChainId.Boba]: 'Boba', } - const [chainId, setChainId] = useState( - [ - ChainId.Mainnet, - ChainId.BSC, - ChainId.Matic, - ChainId.Arbitrum, - ChainId.xDai, - ChainId.Boba, - ChainId.Fantom, - ChainId.Celo, - ].includes(currentChainId) - ? currentChainId - : ChainId.Mainnet, - ) + const [chainId, setChainId] = useState(tabItems[currentChainId] ? currentChainId : ChainId.Mainnet) + const { value: campaignInfos, loading: loadingAirdrop, diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts index b924ff5d8542..6bbe753adc50 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts @@ -18,24 +18,20 @@ import { currentNetworkSettings } from '../../../Wallet/settings' import { TargetChainIdContext } from '../useTargetChainIdContext' import { TradeProvider } from '@masknet/public-api' +const NATIVE_TOKEN_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' + export function getNativeTokenLabel(networkType: NetworkType) { switch (networkType) { case NetworkType.Ethereum: return 'ETH' case NetworkType.Binance: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.Polygon: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.Arbitrum: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.xDai: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' - case NetworkType.Boba: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.Celo: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' case NetworkType.Fantom: - return '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' + case NetworkType.Boba: + return NATIVE_TOKEN_ADDRESS default: safeUnreachable(networkType) return '' From a11cd8729e2bb3145ac9d23ffaebf788962fa5b7 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 5 Jan 2022 15:10:12 +0000 Subject: [PATCH 12/32] chore(boba): extract getTraderConstants(chainId) as variable --- .../plugins/Trader/trader/useTradeContext.ts | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 853f50315717..244dec1ac265 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -22,16 +22,18 @@ export const TradeContext = createContext(null) export function useTradeContext(tradeProvider: TradeProvider) { const { targetChainId: chainId } = TargetChainIdContext.useContainer() + const TRADER_DEX = getTraderConstants(chainId) + return useMemo(() => { switch (tradeProvider) { case TradeProvider.UNISWAP_V2: return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).UNISWAP_V2_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).UNISWAP_V2_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).UNISWAP_V2_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).UNISWAP_V2_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.UNISWAP_V2_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.UNISWAP_V2_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.UNISWAP_V2_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.UNISWAP_V2_FACTORY_ADDRESS, AGAINST_TOKENS: UNISWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: UNISWAP_CUSTOM_BASES, @@ -40,10 +42,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V3_LIKE: true, - GRAPH_API: getTraderConstants(chainId).UNISWAP_V3_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).UNISWAP_V3_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).UNISWAP_SWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).UNISWAP_V3_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.UNISWAP_V3_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.UNISWAP_V3_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.UNISWAP_SWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.UNISWAP_V3_FACTORY_ADDRESS, AGAINST_TOKENS: UNISWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: UNISWAP_CUSTOM_BASES, @@ -52,10 +54,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).SUSHISWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).SUSHISWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).SUSHISWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).SUSHISWAP_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.SUSHISWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.SUSHISWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.SUSHISWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.SUSHISWAP_FACTORY_ADDRESS, AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, @@ -64,10 +66,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).SASHIMISWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).SASHIMISWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).SASHIMISWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).SASHIMISWAP_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.SASHIMISWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.SASHIMISWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.SASHIMISWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.SASHIMISWAP_FACTORY_ADDRESS, AGAINST_TOKENS: SASHIMISWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: SASHIMISWAP_CUSTOM_BASES, @@ -76,10 +78,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).QUICKSWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).QUICKSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).QUICKSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).QUICKSWAP_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.QUICKSWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.QUICKSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.QUICKSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.QUICKSWAP_FACTORY_ADDRESS, AGAINST_TOKENS: QUICKSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: QUICKSWAP_CUSTOM_BASES, @@ -88,10 +90,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).PANCAKESWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).PANCAKESWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).PANCAKESWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).PANCAKESWAP_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.PANCAKESWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.PANCAKESWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.PANCAKESWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.PANCAKESWAP_FACTORY_ADDRESS, AGAINST_TOKENS: PANCAKESWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: PANCAKESWAP_CUSTOM_BASES, @@ -100,10 +102,10 @@ export function useTradeContext(tradeProvider: TradeProvider) { return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: getTraderConstants(chainId).OOLONGSWAP_THEGRAPH, - INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, + GRAPH_API: TRADER_DEX.OOLONGSWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.OOLONGSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.OOLONGSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.OOLONGSWAP_FACTORY_ADDRESS, AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, @@ -115,22 +117,22 @@ export function useTradeContext(tradeProvider: TradeProvider) { case TradeProvider.BALANCER: return { TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).BALANCER_EXCHANGE_PROXY_ADDRESS, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.BALANCER_EXCHANGE_PROXY_ADDRESS, } case TradeProvider.DODO: return { TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).DODO_EXCHANGE_PROXY_ADDRESS, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.DODO_EXCHANGE_PROXY_ADDRESS, } case TradeProvider.BANCOR: return { TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).BANCOR_EXCHANGE_PROXY_ADDRESS, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.BANCOR_EXCHANGE_PROXY_ADDRESS, } case TradeProvider.OPENOCEAN: return { TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OPENOCEAN_EXCHANGE_PROXY_ADDRESS, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.OPENOCEAN_EXCHANGE_PROXY_ADDRESS, } default: unreachable(tradeProvider) From e458f43b43d908b37e0e58545ac1c9e6af9983c2 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 6 Jan 2022 14:28:23 +0000 Subject: [PATCH 13/32] chore(boba): fixed supported networks --- packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 3a5fc774877e..482c451f055b 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -220,6 +220,7 @@ const SUPPORTED_CHAIN_ID_LIST = [ ChainId.Matic, ChainId.Arbitrum, ChainId.xDai, + ChainId.Celo, ChainId.Fantom, ChainId.Boba, ] From 777d2c08220f71862d3843d4eb048970c7e7ad1b Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 7 Jan 2022 08:00:34 +0000 Subject: [PATCH 14/32] chore(boba): fixed claimAllDialog --- packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 482c451f055b..dc3d0b45b447 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -242,9 +242,6 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { retry: retryAirdrop, } = useSpaceStationCampaignInfo(account, Flags.nft_airdrop_enabled) - const [chainId, setChainId] = useState( - SUPPORTED_CHAIN_ID_LIST.includes(currentChainId) ? currentChainId : ChainId.Mainnet, - ) const { value: swappedTokens, loading, retry } = useClaimablePools(chainId) const { ITO_CONTRACT_ADDRESS: ITO_CONTRACT_ADDRESS_MAINNET } = useITOConstants(ChainId.Mainnet) const { ITO2_CONTRACT_ADDRESS } = useITOConstants(chainId) From 92a3c9407d1684b693e270dd49ab59e0a59d824d Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 7 Jan 2022 10:12:45 +0000 Subject: [PATCH 15/32] feat(boba): add maskbook contracts on boba rinkeby --- packages/mask/src/plugins/EVM/assets/boba.png | Bin 26311 -> 29086 bytes packages/web3-constants/evm/ito.json | 2 +- packages/web3-constants/evm/mask-box.json | 4 ++-- .../web3-constants/evm/nft-red-packet.json | 4 ++-- packages/web3-constants/evm/red-packet.json | 6 ++++-- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/mask/src/plugins/EVM/assets/boba.png b/packages/mask/src/plugins/EVM/assets/boba.png index adc63452fa65ba2e5341d810428bbeacb2cd51a6..70b8b55d4a74cbe211e1d39965e800efea50a627 100644 GIT binary patch literal 29086 zcmXVXby(Bi`!~(#(MXQ&md?>#5~I62r3D;a1Ef<*=>}&(2=d$K`#gW_ z+TPo_?sM)quR9m7qos_8O^JyMLzKC{Mlyx-iuVBDS{0p%S|ES zMm7T0<(%)H--EtMKDADiP8NHa zSM3Q<-%*_e)BWq`)J`|Oq^Nze^>~)qi({E=s z3+E2z0KAF>#KG$Ct>e*(X@81Z#^ffyQCU=)7E#njr>_Gd6IN1@L5E5?^Px79uLp^U zO(Ad_!b(y?pmnu%q*DYlS?JGLK0-HoYh7n3gkz9|0fj+>rQP3~gR7}=k8E(?x_e*| z#KUG&0mz6#Y~(@-Bu~NsoX9fnM$G}hDufK6L51J*T@i~9KpaM5E7$V0#j?0jeKc#c zxCp@BM`Z8WOZhRoJgfL|M&PLe1tVg;Q={!Gqpw8xO#%)qnsKJAsj|R7?*VaqL=2QG zc->tP1qBT>Foh6aYoB~gMi#p|S?#aEFjzSN3``%$8gU2C!rETiNV9V8>FuO;2PZ6+ zncIjAK|RP(d;yfs8w8WX%xx@DF!a~5X8O%~-EQRMrp-~HZ+vd9wn74~w&|Hcrv{KM zAuv#Ynk;1vv=~!cWohahMn%L)2u&)BT;#A@jA3*=tp5v=V*og7qrx?rIm4D*R0d-} z` zlzS>22PaSq)`{g6jX2~yUHf^p~TIE#n zSRk@7xHa9WC5VR;JVtW19EY~d8V4AITV-dWO`y|XH!4C2vlm4P$rtZ0<;@JE_}(~0 zeQ6zuhJb88A`c(N*ANAs)FSfiMK(g@S2Rxt zkA!v8vOs9A1}fJtl*BP0G>m~C_PiGhmq4RmbBcm1{z+{0-4a>Xj@_eSppAl=-_wVk z{YeCjjhQK)8mKgy0h>u>YNce&mKZ_&uzjz_CkY@L7-=e{NX<(MnGm+)#i$^*3q<>> zidt)z$4U=}fr6?3`8**D@aq7fY0l;T^yNZ5a%k{Dg7H=&G;6=tV1ZT=2GDOe92qn) zP)V6sL7~|~_6hhKh-Mx7ntoD|DIXnP{~NZW9R*4vPl;}fv$Hq7cOwN75`ckvii-&< z!em4~OPc?CME}Ly^T{lNi*fCz?3b=5dKD3K#3Gzu?Cak<;ulTquvVBrT(mVHgo1+_ zN#~$kglTSs|D#lyP>c8sD81&rCO|NhWAer3nedyHLsx`KdnO1lKb$l@l{b#UuuBgZ z^b;&ow5!C9qcfy?_usY%;7J?eN99~}w4sTkvk3x3!K9b{8N$EuIpm@5#@@6Oq0vh@ z58|E{3T2={4J?#qu%lp8ufO^@evb=c5FC$Q0Q^U0j!MQs$M~xTAldpn$rdX6`8w%z)6deNl)AV*Voj6{<3a|kDWeNF40>kAGE zcPgE6qXSfhM(tafPDL1!{i^ZUs1G#R0c{3H`zEDe>WCdFz#Vln9Q{86lEW}o3Sn!? z94#D$VDpMs!z5hqf-$j_z)y*Upv1CuQJUM$Q&kN)y9l)7&t+&}Uy%R>55<8NDTnyR zimOMdjZ-6+ zh?&q#wBcAO?ScdT32=i>6{n%>f>C_Fm-COfm60bvpiFIoFa7s1Zrw*hM!5;t`%XJ+ zeVCWukaMHbOp2sCa_HEbtXR!k>XOC(E@hUp7+Wzu@`Et+hRM#}Vg-VHgKY9%1vmSZ zUF`jh4-w3SVoK7oYi)fPfiypJuY_6OaDzDM-B;(c+8y40kJZ8^Qo@N+k_gic#k#|v z_m9400jT6GMpgW`+`#-M74e8_WM_x#lnpf|B;Vah^w~B);7x(8Y!DR$7`zcUF&wkQ0et!(Bs)eC;EtBp z0q4CY|4%+MZp_Hz{u@jBghW&D>Q`CuZ4kX6bn7nX0j6L58QdVf*E!Y{t$#h&w)>`% z>}`V5YQJ`C*QDU(Ha8UZ0}yhQ$#99*sEnwEmY+K?{pvZGg4;wnjf~|&+Nu}2If-4d zbaYS<+Rw(&C?yrhMPX2U|7zm!ZH%K$^!E)WU?fv61l+97!QNwWMg(i-aE<9gfcsSW z@JCj4Swp$n)TC%vFp*#rii4n>!&0McS7H3Ye6<-0QK^s-ngVbR8R7fH4m7eN;%?Kv zdZ`op@`a0K#oM>fKNLVilm(l zcl(q^?eHWBAomEn>J?i+X(qA>`vwpeH_3yL#VyRio4FA@9(>l|+91WOvSgBKLZeT< zWE?hBsYd^g=-{H}g=|+PTDd)3gR9sOi&}3K2QOU?T)yZtH8DIRJSI%~H7MGjzKR6soFn>vdDs^$_j~fJbyw`zxr1 z!qnWx!5~C*#7hY)eHJ%BFg2JI#T{RVHB?b6`{)63)~=1q(~5&;vEVRg8Ug3hK0xTJ z5I_JA6Jm5;{Qx57$m}3xyoFE9I_Pe16vhj!5$OLw0RBxWGJ8&85jJus&0vz<(Bn=n z#5yxx=tB={)&#sds;mgO8ERDzp^t*4XaoiXbD-_(0|e8*dv^7Mx_qq9D`bPUTiZgY z+hu!9;+a8M^H|U7|4II9%RH-Hw1z%Hsd{f6xz@%|UL7Y`w#TTqv7W~db8GtT>jj1_ zHfnJ7Cv}iQ{h-6P%q#;6=nB}Fj(k$*1ApG`W{dr_hC$K3XAufCN!msK=oDzWKVxuq zW&oT_Jmeq|6T&d!Zu$3Cy2Qdar{LH%SuEn|4mRE#yz5d;WN|nMv&zKK09CwY_@Ag8 zuY>Qhq3HBhXV8NJ#J%0kVrhxFh39o6u{A`404L-A6s&us2ng{P;at8HHk;xw?-*HA z;>&prE2?G9YCy_i^ag@ej41i0tR4f=%aP>_8+|#=1it1%Vn(<%yOfUO4Ny{z4=8zt zb0OE|Ri&VE&OQ9fR3q6D_bWi|aJ{Cir}9&?i*xBM$gVwkhM1E;%%r!5x)5E#Bo82G zB3O?gi?-i*Ow=3^=~2V5F){&{Yh^Xu4K%HhGsgm~N8T`FBBIfo3go>@u4H9d7PDS9 zJ2KM@?6IQb3Z{9iwmfUg+8`W6021trJTexDrob`XlEnS%i)kLhlL?Ul1GGB(t zz$8Eq$cJDwILkf2$2J<1kpa(LV=u4ND7<(ITB4k3SpQDE1 z7zC{xSMP6H=Gi(D!mrpw&ys$JQ*II`wzPygBy$ocw%Nr4;y~pRZcIsCEOuNd42#NH zb6a?4YB^d?(-^P3#XlNK)mFs6HXwnv#tz&52vMrta-IiEG|M zHMriGA4N+LC*CSMya&iB@m0Ik&H_|WSwuyQ#zGnBtxN~K*vX&~vjuPz{vT55c-bag z^H>Oa+fwiPr3jQ65#AO6AGsY8Y>IO5y~%?&=;ffCw7K-S+puJfVj?i4_&J70i4nBh zM?_*O%z`%O?{U6a8g*zgr%|hRTxrV9aT-Z^63-0C9SENfx?=^o4c;RtF5+FBKxqpF zn@k9WL(=VR(jtyCIq-?R^FXv#MQ|`0J@Ik_mFqi{IV5mgvv12^oS`E|Cn|(uFcrrZ zep(~;As=@GBC;^bKmL3F&=7n_Q-rk7t`f zB!!=gAnW@4{KSc7kf3Np@cO*sNNs0{!mw~O$S3TslA{Hvsff>vKlmrUBGuHx=8vUf z&&_AF3yOlVCw)f$O9WKiB8^EC-OLhf8a%W}2)sca5@`BDR<5DR`kEShkXw^X1^f|Y zht25nRRu+$nnQv9?{X8?1hc&@`kX1@YjK2h6pwMT8Y+n?u_FC)@fZNFhT^Nl5xopkY z{ub`?aaqYTy$E8+l7*RBFB=@UNS&+22FQgs!a2fTza>IrML1E)ILkv`-I?{olG(iS z3e_AB-Uxy=9^{?NM>(u=961(#4rJ#D(AoQx4cY6gd;64N3X>c(yJA{8=CMxMFw!j%{!su`h6v>(9);mI0pbE~?0Yzu zIxl*$BLbK}?OLW{`ag6C#ojNWwTm53>}(9#ru%efufmSWR{ns5g&AY?=q% zUYIZdNu|#aPx7KiN5NF@3(4Uqgd@WNKGx_&0!<8RvWRQf9Bkta+IYRY)Y9TQjtDMc zVqbPa@hAdxQGD3qcSzm&yV(XTWX~;VOx|BeYGSl_YAKEUpbh3+xex@&*P^^}=nP5u z=lOd_=R10a>KTX#f<>cQPml}N=hsOpLx@JtcsWF<@)kQTE|!mlC|2D#7s3T{GiA!x zg2><9b)nhO56e~`$|3UCub#!T8RqPOGHYKsj)qD!yI+7@$VVr2;BVKD&j$Q zMEth$TtMq}H{)V1;+p7nh&iL3O(yJ_e=;+kwEVyl5#9-4B5-RL5qK*+?q%0$)Z#gotmm_}*AoO?RiF?gY zMxx%@nj%QZu>b+?P6LE5z!Jaw=-A*gSBPS;eff411-qOVb2Xp;;L;905nSScuVbKo zbmHU9Y;LLYX;>DkFyK|zu)dtyD=gH){Vu9y+2y4)onA(OJeQC^>>^o$fI+I)p2t-& zb&2vRm?`4uqK{}+guO~0s%Bhn7$dirakK#}V^Gh|WCw6Ukt?QC!Y@zr~VytvKI{G;h~k;ZE`5xty$*Ev1dFvrC=ZVvQ5 zLNY$BD>oJnXeO7SRo?bjcw2c3jkc2@3eorI1wu(0{d?QMYu%;HAotdI9~Q$P zITk~x@T?7XxsfeQ*w~R}5v7@}Xl3-2%M97<8ogOm8f~GziGVSabMAVUIQT>^r4z_3 ziWIa;WOALhS4IDoEvoGt^GAqn2c;?gAs^;~Q{!f&($DSLz@H&BD?H&{hjzC;;Ij8< z6|azeaWDo?Pe?^TpZz(^Z(S~Mg=1u@uoE!D9xS$3Pa}&%vuo3f2N(V+0_Tv%2Z{8C zrjiFX&t-pyo(gzYoh@ROWv2XbJ)V<2>#KCREfPe4=iMkXCd<3<0Qay*hwZ^s$lz?^ z&fv#dU@%dkVP7XMx+n?yBldm>*=O&rCu|I? zT#Xrnp&SiA)K|M!o*HHFt9`%$3G;Wjz_`D@6c@4U*V3Ko=a1T`#V;IKdOKb_jdghM ze+)U2ef%bgt+*P`_NQLQFa~Vu2R-`$46uDU*6sLEZ)V&sk*Mun)wKEPU{0WHe88bK z818ovywd1|SB0LC`nf78nDFZ64f{_Y%J^}Q8-*hI;@{L5ZEvmS)E`>|SNZyBO_}T` zBO0F2zT69JPvx^6-Y}q9uUaFsM}x{EG)XYUZjum)ZQhvA)}?+kSX~!l!?O6KXjl-j zAvF4edAViDO8nsEO03x`dJia!W}Gfi=c&dZIUSuHkzB&|n|GjL!f~>Dy>O<>`d8)6 zBvqoV*E)+v6D~f?cVJxs^oPQ=y<1yKX~`+AWunY@(uLNUBbx#z=73V2gj7C0?;{te zT??CEy`O^gaOGHJQ||2-!spc%z|VETZ`@2zJXyVoy9~TY1fc}?;#jIBi0Hyx1y@0Z z#`R5p_!~kX1wB8S3#rB4{j4jbA*BTh3QMK3zl^h%4i-t+eZZR znGYk9A6$>h;J&Y=jF>kXO#PADp)P?$+}+qM6LW>($CLvz}ZDu^+;Co zBKgFohg9onG((7U*+oT}{}Fcpi=mi%PeFVeXSmcktYsYg#4Xb2Q8abqAr#h1&#ITq zac-8dU05mXOj>KSViqqIDU=yrlMyyZrnGzpGMdG}cJLelqPITqTf2)$71c&NnS7}4 zHqB&eINCm7?~Zv4@oZr&$7rjZb!lb}n6!dn#L_IM-AUTOn-|R141Qgrb7*NP zeygh?5qrCn^(*?SJ{1< ze{6iIzIrCwSaJU!j|nakZI+n~-tU)Nd7?9NN)e zwGkI@j*TOWyimml-^muYlUaE7pmJ>GbGIh44TOIiA4q<|>UqXSvz`EwXTbzSacb;Y zY0~cNCVRw`TS1*Mt7FdlDJj0?5p_}2y&e$lT6<0vS*x~qnRR+lsGntNVI`a~uJV}k zxXDp}9$)t(wLEHC^0AOb3ErPqXyX%nqLb{DZz!g-H|sHG?|fxU<0NMf=F1E&ZnPf1 zw=uD~e$2=W@;AA`n(Jj`RHfL)SW467(A_*)vJn60$|eurt}Fk|%fp*16_(XRPu$DlfLVb5hOxVsn>U@h z9ziroMfxwufVXB!iMOIZbZ1sUiMDuM-$vP_FY$Y%Yv$dXi{1p(mZd^>qTeA;H()GE ztMC5KvlmOo)cWXt(1x>|0}S~LnqL2^jH;ZD?!SIAK(7qR?=DP9I%a=CZg%A^#hi7o zSMvNqXg?zM`LZB6G%T%I377PwaaYoedm8y(?U&eC;g82w zjKT-E=F92Xk1|-6t$9+kW2{S5So^HgO_j{pa@B;$gnDYvMBAQr(KpI(mD*HeeEF68 z-=HTZLlOx-V|x-z%u@do?z(w5d%k!Z>a+AIaw{ygC{eht*$GrAqM()fJ(W6I`ndsc z;=t9mFp`2vG823%w!KM*oXkXx+N(lER)@r6p~~=}`)I7bZWy0zewyz1qs-)mPfd!o z%Fq72nd#I$!6&v5UDb%IU_p+8^=M37oKAae=gof7+9hw;5wEMJw9A_Ru|W%xsTL2;k#)1uvP1vY&&E*v{#4>~!Xy z7BYJSs3vL`)w7rHN!`V>_F+Ho@#m+p{&ysoYK#K3Qy70Q$Rk@+R4kr)Gh@!&WU6Wj z1$F~mWxh_$bbQPWa$(DUMNF71{oS2OSehxDjk=d8d`AIj6i+5f3YsP*KR@Ae@y8s&;L9)1C@a zKd0J?0BQWE>;t#0Z4W^YylfYP@3{Wit$Z;Hmov3KSaFm*{&5S7VQX3Ux7188Jm^I- z!N|kt?Y2tS%e)ad_>7!xcxLN~Ol3_`bm*$|`ANBfd|%&FjZVO?SPHeA9BtgUTsD5Ry$XC$ z9SGZ!TWm}W|5HO5fqBtx25DDl1bUg-jdjzkF^Di)y++Kpe260nN&)u4oGYPHD#7z}hySM#&hTUMglDj2H0HjE>8c`T}2V}7SKimT09`)ZNc)!VPJGZimPd!UDts0jWZ`wpH( zxa4L|p6G_^sCCa6Aq{vOgxge(%{Tz6w%*OuggB zmh@xyU@ik=ciU&Rg`cl1Qe>Sl#oL6ct>!(-h{TZY|D{G~o8y2f1d0B0v`g<)s7#PA zC+4xFn!aphv@3t_o3Sx1M#oX9msY=p`#9Jb7^3)Qqi&r0{U}u0-I03I`4)ENtsnN2 zav@zrp_GtcQ-L9Lf_>7jDBx)DZ9mTSzo!tA@OzH(glx*l#8i}EVU{0>jj|bWXL0M5 zdFmYC6bHwu*`DJOw_lFB6voh!6Q0+SM|%URj&i^ewQM+|#^8PK=Hcp|eh+L1xbpPib+^RybTzSf)bl>*Xz^e2hA&`GO_?eg%5%>AYNV`1R0*M}^@sMaA+4a-qA;Sp7Mz zUGEVrS>sQ>tCIRjWp7?sR|g5^9mPj)DW;$`R~AVEd!h#u%{!x(SL{~9O+e`E95-1U zpLI&P(*yVjaulR34$2FkM31h|V$l`J3W@1_{tO7+ADkl!mgm*X#-%SNus5qC(F*PYJ&!RoyC&ZBR? z>5@pqLEh92c+>z>zI`7Z<*c4nUGl_1pH=+Cy+5@|jk~Qu^dYl?^jI(nVy|T9goN%` z9IbzS;DJFH5Y zU&xbIN=Ivyl3Ll}If995nTge-d^R%u=GSwzW~Pdevq^fwrc%7K$BFCdQM*gigj1PN zqo=zPO3k_aSC?ms`Q8mbMKDIY_bfMZ^q9#1rzCpnDfGg5B$rA6O2WqwXLeMq=0okblh6@L`IzTI6ijr4mjT(ihj)w7t^M7~fjD{k5C#jk|EdI#^xYhwqGyz!pu2U)aPHNL@ZM2Txm zq#}Lgi#qyk?K2^j@F}Pn}|)Su0fTOGl0QuzKk1KzDrz z|K%@oz78`A^)$9{nfXGq)N~ z5S`pJDqs4S54B9z3C*y{s;j-FlEckn+u9r&n&Y5HvE}I^Wt3s(uB~&YVQpuB<^k0sS)fwsI2n+T(E0}#!>P?z@4p`9h9XNp-?ijw zL{zQxomG18-{57DEz>$;hT!Yhfl8xTM;mXU)`dAHe%Msz8gn%*Q&YwGAY$A}u_K(Y zFFiend&ts(EQOEeoUYg?!WT!~E6}5_df4f$ezfwj&v-m5=+}EA8!igOWX0dC{OxO# zdM=L=h)UL&Tf$qv8Q(rK3OE^2ie5ryzR~a|JU!PGcU=Wwj7#$o)kN>uExStQSfMSs9D=Tb~CR12pLln zirs9NV<5p{|3e)k$CYUBwetRx^gSU!jzROOm>aYP0+emb@Sr_j7mn7qvcJMC5xw$& zQnyS#um$}7y7<7Iasmxd&w!~)XQAQ1wRmq!9Uv@=QE15HQmOdK-Qt;5L(}6~qc+$M zTe@#j-(OwLs*-&z@`4!Cv67MPun>{7;|4SQE|unOuuU0(oV>e4KKpWm4PEq%Nwt`N z@1zz%)&^C1?jdPg#6)rG{rmFqHc#8C>&u<;zVzBoyIhpGSRI4*?8ENz^YWu@Vk3}s z!0(Cn;q2kpdl1v0&?lQnfbE_@vvdq~_7KK2y9_pSUzvF_Fla~|!~y!%lUvJbh_ib; zE&O!M=hG_g`sKr3R`jHexdO?9GPM%&^=F~4_!M2&f7K^+k8VrZNucgjUQf1f_~J+( z&_x?Q>!WwuE)o|`OZ@~S#m@M?j1=MUj!aE9D2#@^#6~W-0s~KJaC>jCgJ~Za1K$0? zI1~M?f0HpRPSkN=_vLd9V34}iDm|;-|xk&y^P#mOE?{yaCDh7$@xjwXJfLa8q)>)ME_8X(G2Z=Oxut~@BmE4wzToG~f z9?c%D6ZA!EU*Cw0i5Qlwg@T7`DEe->t_JGDD5I?A;V-H{a|)r+La=EcqubZDaN0wV zQT``2Bm>gUy??i@CvQSu{p$INn7t^g>LFxSywKpH9mp#);tfI=fYsTs75+1nIZEaTIkQq$+kn%5#L5Na&q+BMlu~(b8ziDTufO*T2x^Df`k)ogl@MHaJWQ z>%;BsftqI#+Wpa{2N5e?%UE^eTHs|ht6hB=J(7!b0#OQQAM7~rn zk;WnxsXewSkrw87b+x#`?%Y19lGK^SJ!IEK7Rfe6qtY0{J!oeT@)s2YwFWY9e-jS} zXptLZg*m9Gb4-XJK&Z`5WbyYWIiTBz*&RtfH$=KJkUkV4uFPM2&{qwPbbM8KlrAXm z{um#5^FF0{$}^PnAEdhitGlVSJQs5Isi6(!BE>bkHg1da>7Ma&pQJh%x34ZnVfW-~ z_TspCK9Z$;15_DCat)5z1#K+wggM zfW|l50}@yp5K1WeNHUphH>CV22%@I^k~xv;f!^*BA>3o#hEF>Pdur{ z{(Yh5BkK)(wp$j_Lc~peTRBSfE%lL$q<`*_ z6fL2o9^n`|DGcyY&yYnrkv-^@0slrnV$`s4H2UG&*#D;Uur~MfBSf(`#fvHKsf1V+enza| z>}E^IJR2V~GrN4rsJ^cpHrR1jLhC;{*W*^AJv|-KX_crCV`@lv6%sNVva|%l-!JfI zQKQt-CB5OIHH%wTikg*|8NDhndrd;JJF^}t^uDm=+nKhyaU>2|>2}_1XNyT*M2BUH z<>3+5>@W8jh<1Z9MR$>Tdgr5?kLqG)c=kaHJH9^!8oh&?=!*|CjE5=Ob}CkMf;sSw zwUJ8wVX78+tMD^*uN)rK$K&zfK$c$7Qv?Af9nAtwCQiireGTIwHr}ppjq?41leYL7 zH_lE*Qtr%=e_84DDtA|?>9+O)c*#;i#ckdSWBvGZ1{O4mQC6B*$un^XJ2eF;huC>X z^fMEc-W9z!t#R?bt~D_;GOpt|{gq=7ThT|ous1oyf`ciabGs#yk)Aa58gku%rVf*a zAqjtdq*=b+tUG~;T@tvm`_7~Rp-O*~0CA0$Ux+<2_r|t<{?e~DGjwRJg-Ko0*1?1e z#g{6}IOa}1`=3%>9N8hqmlUqQHXo`azT&p1bAqst6&Ggfq|t`|LwD;x^HFHOh{zT; z`mQ0oIlf96<`=S^Eb`$v$K728QxcN~TF@LSbgq;9ff=U^iuNm!iTV>s=4Ylgo*^B> zA0Hpkzho-d@jO$XGYPnK-!*=~WjJb`SGo=6mHt)#@+o%S)$J1^CoJo%sG2&ms^?^v zvmc~E{4Iw(i!b<)PL?X!c4;TMAm!JBZgsrunF)Sh^scKW~!@CG%|@~NBu)4z0@C z4`M;0IsMC0j`?@o?f8-=$nJsxcSdNe`j_~8?E#kmfCTapYe?|XOo0) zP0OZpB~bU9ZULu)jv{2;K>s(X*j=;_B2+uLz;QQKBip>Mkb zm_d?aGigqfJgI!0;HYJO4cT_3H-Y&gD6!AVp=9))3cYCyY@_dH$i1`jQbv*e>D=v* zeW@P5W&dE3qS|cv<2D-3A0SkdsV0fZC2uh_KK3zrRq!o+(v&c?-EDAYvVq};=s$g{ zWE*ma8{d6xf!I3M3-!!(;!n+6_l!HiSX3L7H~Xu zNur!|_FJp{rf#Js6$z(RWQEnRljxp|{*joQDT!K%q*MNjiuzM0sXGT!7}_x0fPp@exBI&0*}>y zA?5}&68RBDPCdcjZDs$_T9pVFU1tm#0*Xd-0%@+A%rrTue^`LwwhT*6Ay=m|cYK|e z?KTr*{bxi!!p=DX=yHISKEZ5ztLj1N>4HwbeugBCVs5v zzq!UAwRL{?cy_cg?A9Jf(Wm7XQUq=|vUjq0gD35yrzmlJB%R96_^T90=j~k~07IU? zW{5JzzBHffJ($sAV60d*PWWawkw;nT9(m-kidl* zc1Jz5;=0-xSnt^z**s8T5ISa1>za{-KyhtUFG{9^YnK^>cGV}?tcmEKj}Yq@aoP~z z{oY$5*Jlc?0ROQyaN?Qj{gQJe9&*u}TF=mCG1!k+abUO?B5cccz2p9aV9i z8Xm`zFE0AD&L(^kCifP#k={L^Rwgw|cq-eC@&u#OlI|U|SX)i*&Fu9IGAEsX>4_8 zM$WWlp~cxUwUEn4OT4J`vA5}=b3NmyT(B*iw8yC@h~u{IJDmO{B4OP;wvk|S!;L( z4L0jcD~02V%2h$b}?yB1F@Raw-ONu{yCnKOD-TNpycC{|a zRSNpQlFl-$jiznGxVsm3*W&I@arfX-+}(mpkRqiNic{R(-L<$o6b)9KFVFiOM}BPX z?9OIZW@l&a>pJ-{oA$(v>DkQQz9!&XzF?dS-IDUElpmzVC%5<_Pa?sCPoGx1ic>;3 zdre{}{Lq5LpW5Q`5(sI&K@=WjXuzFsEG(5*Thx#Ic`Rgp4e5ZjWEF|_0-tZ)Kf?dc zjqk3`rT<2+30B7YroC&>h}1ShmY7pKv6C-t!7UKFQ%#1{{Z1b~BN7cRAS5t=!Kowl zjHE?~Y?nu`RC*|c=tV=FkMGtla{gA}EdWi8!`vjL7C&xZ{@k#NLv6vM{yIFIn<134 zI>rDlcLToL<65x|NeGbezjM>A2_@vObuySbs=gjZP7dgVIq#G0PM@DaL^7NT9V4Vd z7etF)UsU*V1@9R@&P&yOA6Cnu^Zkd)l<>iwXog{4XS0&>Ct*GBu$Dt7XORRKJEN;Q zn{&;7S!u}>*WwQx$-VNHIA=IxDHcdJaj#nN{T#at)B1AyceV7RKHeMcjICA{r5@_& zSJP?yhz1ks82b-6D2Pf>$C7k;7ZW(@Y$$X3a}}SCa}!s4-sx^;1PQT03`YvwZBhM= ztWlgZ3;K01P1`Sg<2`}G!%BAh^!TGTe^&JTw~i5>wF6Q_j3mXDyG9V1{@4`TYqOAirh{&8+$ zmbBP;?p=e3smS7X{EP7VpBUrmIA;1x9e9%-9tJ{=S;RXDwbFX^b8&hQ2WEsLaY}Xa zgGJ52KXaW1tw-Yt5340X7q5kFRH_#R2kit}$^jHP;5pFvY8JPXh?EtSB{|4|yoQdy zdE4d(VkWa?>_zrjs(Qc4#7b%oZMrYaWcPuKI6;S-m90qIP{0m2XX#OM!H828M}}w7 zvuMnMjW~JV->=)C;V>X8Zrp#b@4z*4aqK&bc(W@BeHiYg43;do;cZWHlp6P}_-st$ zquW|b)K~hRSwNs5Vl?3}#bJfdO8#Zc`TBBS5;WhAA*G9Z zl3%DJv^NPd#L*>_q7*_LbaE>Tt@xydX}!sm7m2JDe0$I7eyd$MP#tkXyIWQ|A+Is} zqYB!Y?Z(?2$z}d1_XlpC6jA}37D$c` zy7#u^B@4doEv3RK_r^)Wsh6|ytD=?~R=z5IDx`>V#L>;xP}$Si!SbGfVN#ckh;0%T z*;=v(gIBxl6>11d(y^t9U&iad0+a7u`8U0zC;HcVUlxb=a%kB4!UI1Rb~BjI=qiko1{5<+TjwEWk=B?TW}Yl@R^-1 ze`@R>9stYuEGf!+5q4iA*|5FM+z>aQg9$y`lGq#0#tAT;O}4@D(O5*%X62{9Dv250 z?Rs?X&5%IDdhL-Qqa1-{eyRogJTq_~8;K7&4>Bp1gInWJPgi1{fQ#tNhY7HoV*xtN5bTg!sT-@7?Fka^R z`ZL5L>@H_0-txQ2_=l=nQXwkJE<>g+VXPvp;iU~I;t>5^rd|r=M6&M$_UY}}W_dpC zFyXW*Vn!tX;!22Qv*&|G#A?x3Q9!?_6~}m)SI6g)ZkNb^*ZREk4))~fxg{C-kq|wP zQ!z!;(L0uw24(8&HK{s29dHUKuk~!rmCF=D#ZHh zj_5NQT?;YuOi^mM;$bG;(jr?5pAeJGBvkaO8cULL0%)*D&P9%c*h<&1Hpw{!==W=r zrKCLvu!iGTS0j51L*l+@snF#P#qXH3XIV7-ue&`=0E7NG$_YUYnJXjkx0V|tS6N9i(YD2yFdn~ zN2!+QNu(ooWb)mkAqF2lAf>r43^&_8*h(B7q)#KH7~BFfb;J~Jl~I53E#P2If^H~I z+K$QVUHNEq@G@ZHF=Nealm{)JcNQFUynmwGT7i8nq)}TfBt)h-IiaY8?fQe^ta!RE z$s>~&Av(>Ba{5~UW~>5;26w_Ca(5s{pP6HTtSH4-`o zHEDjb7h??PkZ(UW4i>w9;EX}m#~)nA)@Nx2{CG^dUFJlyqwO?IuhGSdLPR)%4EXtk zm?P)*R$ebd`XcefmyUsVR;;Ls`I_+Lrt@E2E%BY2ZF2|>om|ng1-fDcsc!%$5o6Dc zimCW1P%VG%KvL-lLBiE2@7)z4SK}qRZze@$Zt`)|u_ouMT2NQ{#~*OyP+3uyym;)O zP`wE8i$AA?lxE2pmv|2YKVnc%FwtqKu4ef2wg}W_Pbgd#nY)`C&yF+Bz|eJHFQtR? zBg~rZjNFWgk7WU=UuVZ@Fc486AU0H^bo$R;?W3Ln*gB$kV*_3yfn2X|#F&M362w%N z&JB>B{eW;%9j*f$^Y>5E!x+5A<57;%?)QR?REzE5jZf*lk|Tf(&(|vuQ!`FdHv&KB zA9V%l8`id<;FWH|ZTroLtCp6Xly`Et(VHF0_P1xDAw2(4d^|q}QP$+Y+hS;-5V0=t ziVltsX!iy=XVh(J>J@V23XL}75ev}xVX$#J#T(}hy8tHc;ei%zcG@grx-uekb|EG~ z9_EiATFUib!rn;LIDU@j`|`laVz&?L7@f4VqE>Fe(?D6(YUcC!p2n!rq>Gc+ zE0Pq*$eTv5ZG)%z|P35(V*Zvo{xiVm>&kM{c%nH zxleANM**XSQ}BqkB|xL}m{g1**!@M0PF=i&^^MR!1~uk7@WUte-8xpSpSilVQ3qmF&Ik-8e=0 z*Nz5*zoa|A9{pH(OK}7|{G%Z&Ydw_%GKpCprWx$HX$M1JR#%Or(^4{|2w#fFDS^L3 zvQpf1tKu#^W%ml*@4ML#O#G3DC+x4_`-i|2InU}6dnq*>`P+t_dpQ;J(UWXQj#SGC z;2Um<7CdYl)Ix_cVMAyGc&ZA&eZP7*QiI~J=y0|85puXev3uOAel+9D7&1u)C+v(O zNczF7^fDtqeG2a+t{f9W zBogtiUVo%ifQ#(JgOl8%-37Y6wT8y7j~brauy1^*HA&xsqGI_}5b>D#0Z-~iZqfY$ zH6)3Uz^{HFD1)D4uxTWSp&2b=3Ew_-JO*zmn(GwGQjO4k=b{o57EM09qZK0E*D)it zRVPnl+f704Zu$M-64|>EV0R&eCh`u~f3__tv}+PfIZ5RRG2Mu*I1*RaFL-uz!a%S9 zV+0Ir5uoj5bq11t`=Pvtqe&L_C6Tqt?>^&+e>k5M|E^YR3w_0@Qu~=5HKsXydSp{C zr<;WHp1K<`ZMt4c<6=E{(SiJ@_f{2 zBFa;R)eLezWs5ftd~{wZ&82VO_Msk>Phe6~ID@{txwmJ*M_BY982HI17?gtrdPj_; z9(C7xu=Y&7zdyY6--b~Jt>2pe%#)4Xb7?(7{D97hBk{6$%LarZ8#!Db zm6^dSw_|TUP(MK}%ZnOPHE*m^{?QX$f)Y_1XERcx7?%_mWb$YI7P^w7 z4!OZ7uC23U_kC{3=tQ5JnR?pb;j72Y+5YGylT?h(WrH46QTDn6UfEv{k`Dn7cdALg zu2+?K=wAHMFten((pf*{veVI$zhc#nd(!Zmgf#Z(o%{I<1Ck1LM0~O^1=(-4@OHAw zUYLVXF*AsHwnOtf&ct)gzJQP+21vy60V8!tF+6&c?%tJ%d_4r1+7<;eWTi4cLMHIav)@l& z4E1_ib|lunVwy43Z>?qbfR33PES`V!SEt2UXDMUF_qK|KV+4==g6AX$m5E2&Wj zJ2S7QW^-kPYk5d<7&Y$x9?5F#r!59FjnyG7a-z(T|6^nkOWcf!5d(pnmgWVp_idI z^$A?w%-Zw!Qlb=FW1x=cJ>>enjvv3{Le59bChJc*R&?5n1Jm2qIe??&Z^?#BeJuQC&JCCY6+Y z(MUV)-At4xLvLu80R~mgTe~H~s3Tdn;3s^=?|{k!%~h#4`k^YE4ZV;L+&1PH%E>@q z7c<@r!~`9QM|e3hb8H)O;jzT~zYZ-VEGi%O*^b%>YJq2Ue+iYEP)Gk=HA@}+gvsIR zYfskJxM`{>IL`)A;-QuC+x7$`iMr|t=*6zH$vuh_WaZE#NnGT8#MI3PEtAbU9;aZA z`A@so@XEg-(o&l_uSa~?yJ&bUyV!3ghG5)51gdX{!9%(S=ZJu*^F`i^w=~y))anAN^85U!;7rw zArKRSiN4d+`^!JLS;T@{zx626*z`iLW>8@A%6z%82JVFRnY%$Ek_pZdL@VignJ}hDI(|X_FL-?zP$5{tn@B!N(&S54RYiZ@Vmef;d z^^;^FKHCvUp{&2IP^tRuaZ4|B*$l{e3$a@qNpTFJ*5z`dVPDco&8Rhoq%5-g5_DUKE84F8U3$9-wd zSlgLuEJD6G5I?e#YpNeE?0D3BH6iKfnT1c-mlcL_U3MRq>qnmy6dS~_kGnYw+eUxNxB8jBVwL-sR4D7gC8~H`1S)md5BlV+xGsA z*tqn0atRUO=7(=f^aiRN7m}E%|4MfE!J&}3^UdLXM&9Xgc@BEFT|A91i9Ku&q+#RN z0kzAIxNY`(GaiFk!EYg1nw<@2r$I(nIgXzNbTUkINJT*KQ-!qwjvPa>1jh#! z7(?{!Ct~N$dr5=c*+MG7-hEI-@y;Z>>Mi=0N{g%AZRsyJwQmcoYhpB*4I&g;r;ECD zG55GPjO$$~0bFH1Wq3$YA@6>7-viHnVAV(H5J_J|r-2PARkG5Kl41LrZPz%cc!pTf^eL3y&kXI4DEm!fv zJ{h#E?$!%@ShfN*UjdWJ5`<~Fup!O-AD|U)XWzyP+rP}1O-iyy?q}*V1(|a5f5R4z zgN5n8AmSXx4XkzG6Qf@#rte8hmS(~hd-`V47OVkL*Fm-gOT=-k3{H0ZwVJxha?8R6 zTVvm`1DH8h!S?x%-$ek{cgB{rt^wW*UP*Pxrmvd)oC2UuC}JR*d{>)@sR zjStc(!lj=DSW(0DD_Hwyc#t^p@OHVe0O9+7eXLEr*jJ2eOh}cYf8`$+DJ`57z=xI> zW_ZWZ{R#K#in34Dr)R2D?1A<%6B(p-e_zhCKZ7%A;ooq*yMM?P_{g_;e%k z3o^}vBts593Ef;oaQI71%6G>n{R(J;<>(GoWT^KbRH}LT<^Ve*So78ID>8gt{E~(r zeAX99k0g(80iC0TQ~$!MyWWfXZfn* z6?9J-JQz4G*gKpVHkBsYpVLt3?yl~;l3z{`!9>flU)76cN_H;KZ$K=vV}CIVMSf0Q zN@_qcL~arrtE7JPL=zx97c}xS%Q^TTUUCRfn8qdsuV_O6x~cnvHj@BzF|HKhz?^-J z8nZwPWJK}G4c4zU5`(WyZwGw^;M41;<^%S4W)0D)Dg>XkQ9AixoMK*N{cu?lNyFN@ zYi8-2A-M-Fu&shwYFv@x1qLtJ?jkW>MTfB4hK72%=pwhY^n^G`f;BxzQ<=C`hIIt| zoCjZ7y&c`uf1XLN+^Ao+ok)A2#Lsz-+jBPa0fe5Q+p3a;IoL5f5dIG|>R0U{NFC~@K^!*UkIQ{yxYOdLyFUKGxlaDhGFBk{%t5cpTv8^?}&Ry z!%xxJUY|#0NZT zhuJD0L=#=}(CEd7Y{55PzPgw%+aRqvWY@GzP{B{iM%?F+g-=#RwY5y#X$F~5m zT|*&P+eOwEPe4^#Z)|M`KGDZ?=_92%y^>$%ppZIa5R1GvI^!~N?R^zGBo?lF(K2pLboE`Od5oo(S5I=3JexDATW?H37H!am zuIh!-N_6{$%JsGB@(f|DpD~^^QEFUrG`eiRq<#$%2GWCCo?YkyZy573N}Yv{8^6 z@GT;d2D6Xt_r;ff>W>vB( zV5m8F4GYar^QrpsUnlA`KIshr^aj~LtF0LLTOOk&>q)In7K|-aK5I^Kf#ld`H8_^S zO9N~iF0Dw9`xKN`m|tqckC~`+xUfi=Sn=>OjnV!@?@i%8#Scr~^IdRx%8+aPF7m#_ zSL@#oHpo8eGrn?SOd_phB`6Ka%RBxm&lE2y+VvLKHN^_&NZwobfteI&yiO%QW{l21VnMT%K^j8zMA-($GfIOt+-9Qml z6Vq8(wv~snHkP@^6O1>cpIMLkG7wcLyrZtvFC}bMVoglDr+Pmz%so*8&%9*;UWYnquh6N;6e#AN$UQpZFD+nda`ID&q8GTgBG*%Su$e(9MAvQmWUt(ar#(3P zjFaFE3HHABGGDv80N>WI;_uRX;E&mTzacvE*GJ9Ih#UggcAKzN9d=T2RhTyanQdbA z4dI4BV+dnqh17PK&lb6uWrEdwr!?Jd$*L+b9e?aQaaS4}4n3zZ&L<73TcIM%RuAt9 z^)v$3tU!K*uHZvj1=!xGWt}m(;kq446uS@couw;S>-aq~FDLDOZWDtDMnZ;{$^ zr+r#TK&8J-BMi2bwMR^q6)Ir_Ogp)<>76on%?cvIud|m$RSD+;ZoC2*QT}z+z=S-* ze-3}9>*dXZW`6_n9xV$_jyDSl1h9#JMr?W>Q9l>d#YY-;v}bKPQ2I!oizQ3pC=@5Y zbxmqGOsD|mB8%MWA+5^eYG(NzT78C$Fjpl*RW(o{Y2^CGu%--z`60Hh_jvs390~js zH7CC`%*BjgF)RbLjlKI#bE!GQG|Ekw##^7*Ji~6CC}1M;n)7tfCwMEh)30o&RczvM z?7fy1knBwwL|{Pb1Jm-6{9X@A)J++1;&T0!)3K+UeI?uVPY5T{Z_Zp$xt5Kb9B0}O z@}?h4HcW=(+k%OUN$%&x`$i}Bf(Jae(yYX^sb|F^`HhMl1-{r$qjLus%UH;-HHYN! zDT8#0og|&NBlwknCN(-@a|O&|`=MMMU18naRov|i26}e$6HbBwZ{nko4|rWi;vXu6 z9b8VVVhMv6)P`1(Y@&np0;zyyZ@lmFzm$5^6Jaq5xrL}#-WAb#XL64H8>2s@_{RPL zeEZ8~V{x0u#pEpRU9dr4i;>f;f;b^2wuG~(DjonLpBk9={c_(bL`z$ux{ean4^N%} zyB3sk2Im~pI0Q6ek~!ihHvcAG=G=ZKbvfp*7Rt6UFe8Zv{RX$RwGRg7|8!ND+u&*O zXo*LDs*1BX?XjrVYi7%%%+;Fo?b~`J3TfLN=g&_dbe33(@W#KSZUa~h31xjIiLiIv6XuW2U>?~yUiiHn<=F1mulC!8S@LO7|Jp)HJM8+RD9 zo$z+sUovJXhgF!`rpu3^Z<$K!d<9)+v3uQdK;?oN^G*gT!?khQ>T2s|rCWEpv|VsGCO)z)Rc_S*qlTYOif$Vb#+DCanNtD!n2d$JQe0Kz28|91jDJIK zlqT3lSi*w_TA~Zlf1^xVGtO;ATD;l0kLWDSY^lz0LA5v`@LJ}=7m20ql>w!+_*O3#U7@w4XT;xP4k~eYT!}Q1CQzwkp*+Ol<@M`DUTd3!l7Fy zFKUs6wt+U#H&X)|Wn>YWGh9|~cnfEqv`C2NZRc_6zG%chYWZ)V{O^w~_D%wWlYB(L zs3_AD#+ZHXM#Y_%G%5f2NmqupQ_>bkZHW7P;0f%humsI~n%F@X>6iaIjDoMto{!Ei zb%Ui*n1fr$m`$8B$YSMPuLwz?+$#W zdi0eDO`JGmI(kz6ojzUIqaO!*YpU#Ze3ib-vh7(7Ch!o6<|Ozbz}5<_9SN@um+_y6XT+qY>F+sFU?UlvX)?fYT<9e2){mVl^VqI2Ok zUU|)*6f=w*X{o@o->GvFEG`7_{<55u^=Oh^G{jE~zOPL?XlQ`TBTs%4csSTAOvdbK zac8?&Gl#|2yhSg2;h)>i?Tlc`@D}XMM2GT7%=<@jxxYshY!LhcRqHZ$$J0RSLt~o7MwKA&r-qK0!}iM5P+l%LE;i&GWFx$ z&Y_gFmP#CpB4*_Qpuj>Z zuPl+3-gpU-zNe82wTd6ZLI%6wbaOt7+%GFu($i$yR8;V+2l`GK&{F3J@+#{zo*7FQ zq|0$P2YTkVxZ4(Dp{mwdvkb>I+%fg-ps_o*;S>xFB~dm0ZpSqx7c~Wo&A(V8qc*2h z`~~dr-(`Xy;vsr=&f+i+h6N_d1h_wu-&~21NAayvcsetawv^faEp?M>PD}OZUm#RI zqqFepX?-$0kJ?jB%q9robGATY`&D1@t+>Eorm#ARUHG;7>R7b4%$0m4N-s>F0xnps ze@+-y{thK=m{}#_Y}}?Deo!rbB5yFAt_aTC<)u{Sc;YQAQUF75xwrbigDe)rb2T{2^syZ2P)d`_VxCS zq;{M!nlt^(Yk^~|iS1~hUTHZ@Sz(1Ia*kZd_jN|@2@p2;bOq(o4cGY|j=ykn8cJCd zE~g)MYfona2O&{dBWtNp4JrL4n7x5*IG)SK)Lw+4J9sEBaIug@MuvIHmcozc;Z6* z-P7qHHnj=#Dq4Lz3MUF2*_?@jQxMvR{bXi}++Lq=a&Todv2)x$#Fn0tv%(x%!7#;{ zot4BJP{%R>VLt%ROOSP!bO`4YJn^xPIQ6NiA*D^RN@TZHf1RI;v~ECL;%tX>Y{Qd( z)~^4>E@C=mrJTI2Wle#=3n0jw%5a_Al;)xa)Csvgs&Gmxk}nDk-!`qR!b3T~M!Kft z|A~gIgD5)8K~k0 z5KIX+fCOZg`rVgp(N34ft$183(&!;Im?VWDi$c+8Abb|N@V}7nc=I;hBl=@SL@~G+ z!3_(l+O*)SIKAz$t!6@08H2Bil0MJPx;CxH=1|0t!$te^qJRNo=RThVV9d(nK( zQb`P>rT$+4CsCnrEPUU(1SzIb7-H3{1p%fs+fuN6&l>)L_AXl#v`r+5Ri8_*AD}ZF zkI1bB=~Iid`eaZ*j`pc6uFXo=C4>nh=O6>|ROkQ7G3J;hIVl4Tu*%Md{0=uFV)M@h92>a@Qu@{4N~;px0uVv7Oi_FdC6Z+^^3v8^3@iOQ8{`Q5 zFH~5F?7s6G3p#c``oF!ulps@+bJcG~9u^_%j!eoy&Kz1P_7eFVoFo;@-tgt>hY2J! zxGM@6R>4uhU(Fuw5YG+Ou0jnr?^`_Nmm-RSP?UK3%kk}hr9<4!>(QI}AkZB$B*hfU z=XbDl_*r z=9#0dFCp}y?;=uXn^>8Ptys{X#966d57YdyB}Y}nNKB-$h9g^RH6tkY=5c^3`N(_q zO30~^>BQOQ))3?v#FYKhJIP^>4mJpnlD+azpABb6W2^tqed^CeN?7xV!V_^usWB7G zvN5QR?$-yiCBe-xWBAM*7WB#?X(hGRmQWBRi%W!`hjSA6+Kkvz z_H$K1{@^pf5g2j4w}bmJQ+OL7 zJT{?fN-NS}!-`~sABmOU>sG#aQOF3uQSE~V97J01zc(R|jd#+4(IvC`DuJynR>i?p zQTim|$-IyDL5LRVqr@LLju0}E*Fh`F_a?uw?A)P(zFS9PNK>~H3Zm7MGB&P{s#&bv zv$JqQ;mDPQJ z5_hqxh<~XC_7kAjeFlE}Zxj09LHI-Un8?pMJXGvNiE|SWjGT-F@V^aYARs=x*nAbV zX8IMnCV~uo9w}BdK-~WW|FFenwB;hSSRWg)EliLWVj$qYq}ou@sMc1iAGJJ!OKT^m zj#zbA^Jox{tTc0IFhk{2((QL@&aa9*vdes}@P){G;W(cm4vc`3U3rn03BTOP5;V6I xFoTGV2oIg0OP)6kJ6>!lq%nkiRwq6XXHCBQnQpLJLU4*uin6LQ)l%l+{|B<2kPrX> literal 26311 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 DHcphG diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index c0484e41ed44..658c7804fbe9 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -103,7 +103,7 @@ "Arbitrum_Rinkeby": "0xEbd753E66649C824241E63894301BA8Db5DBF5Bb", "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", "Celo": "", "Fantom": "" }, diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index 64a243af0279..e3cadca022a5 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -13,7 +13,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0xf44799D9F0aB280a5f26Fd3AB5557595948ff9E9", "Celo": "", "Fantom": "" }, @@ -31,7 +31,7 @@ "Arbitrum_Rinkeby": 0, "xDai": 0, "Boba": 0, - "Boba_Rinkeby": 0, + "Boba_Rinkeby": 87139, "Celo": 0, "Fantom": 0 }, diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index 9aaa462e7bed..fd81a8c55643 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": "", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3", "Celo": "", "Fantom": "" }, @@ -31,7 +31,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-boba-rinkeby", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index b01d8143a919..df8722a7ca3b 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -67,7 +67,7 @@ "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", "Boba": "", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "0xB4D669bc117735FdA44e90e52795132187705B21", "Celo": "", "Fantom": "" }, @@ -84,6 +84,8 @@ "Arbitrum": 909051, "Arbitrum_Rinkeby": 0, "xDai": 18101937, + "Boba": 0, + "Boba_Rinkeby": 87121, "Celo": 0, "Fantom": 0 }, @@ -101,7 +103,7 @@ "Arbitrum_Rinkeby": "", "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai", "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-boba", - "Boba_Rinkeby": "", + "Boba_Rinkeby": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-boba-rinkeby", "Celo": "", "Fantom": "" } From 9ed6b8bec0a71e27a4e368bc6206cab040ced76f Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 10 Jan 2022 10:35:12 +0100 Subject: [PATCH 16/32] chore(boba): fixed add Unknown word (jkoeaghipilijlahjplgbfiocjhldnap) --- cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell.json b/cspell.json index 837e3275a409..69afb5114cf6 100644 --- a/cspell.json +++ b/cspell.json @@ -304,6 +304,7 @@ "inpage", "irss", "isfacebook", + "jkoeaghipilijlahjplgbfiocjhldnap", "jsxs", "koda", "Kodav", From 1b95e9d6893bc07d227be25b640741ac8ff02d3a Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 12 Jan 2022 15:38:16 +0100 Subject: [PATCH 17/32] feat(boba): add contracts ito, balanceChecker, redPacket, nft RedPacket --- packages/web3-constants/evm/ethereum.json | 6 ++++-- packages/web3-constants/evm/ito.json | 4 ++-- packages/web3-constants/evm/nft-red-packet.json | 4 ++-- packages/web3-constants/evm/red-packet.json | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 422c1f43f74c..32e0807432f9 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -28,7 +28,9 @@ "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/tokens.json"], "Boba_Rinkeby": [ "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/28/tokens.json" - ] + ], + "Celo": [], + "Fantom": [] }, "BALANCE_CHECKER_ADDRESS": { "Mainnet": "0xb1F8e55c7f64D203C1400B9D8555d050F94aDF39", @@ -43,7 +45,7 @@ "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", - "Boba": "", + "Boba": "0xAe5C53294003f72B27CEF476680979453193673d", "Boba_Rinkeby": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", "Fantom": "0xc119574d5fb333f5ac018658d4d8b5035e16bf39" diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 658c7804fbe9..cb388581d6d3 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -48,7 +48,7 @@ "Arbitrum": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Arbitrum_Rinkeby": "0x9b3649eC8C9f68484acC76D437B145a4e58Bf2A2", "xDai": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", - "Boba": "", + "Boba": "0xf5056B96ab242C566002852d0b98ce0BcDf1af51", "Boba_Rinkeby": "", "Celo": "0xaA5bfd7355637eA7405CB194a55303e821c4c569", "Fantom": "" @@ -66,7 +66,7 @@ "Arbitrum": 102022, "Arbitrum_Rinkeby": 708696, "xDai": 17865755, - "Boba": 0, + "Boba": 284551, "Boba_Rinkeby": 83114, "Celo": 10278776, "Fantom": 0 diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index fd81a8c55643..9003cc2bc3b6 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": "", - "Boba": "", + "Boba": "0x3f64DFB6009d138DfD7b62916f3322A438d8b00D", "Boba_Rinkeby": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3", "Celo": "", "Fantom": "" @@ -30,7 +30,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Boba": "", + "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-boba", "Boba_Rinkeby": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-boba-rinkeby", "Celo": "", "Fantom": "" diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index df8722a7ca3b..1726296766f1 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -66,7 +66,7 @@ "Arbitrum": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Arbitrum_Rinkeby": "0x4A77E797031257db72F7D2C3Ec08a4FAc5c8CfE9", "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", - "Boba": "", + "Boba": "0x5de932BD252DD79231C9eDB5F2e30D488B785109", "Boba_Rinkeby": "0xB4D669bc117735FdA44e90e52795132187705B21", "Celo": "", "Fantom": "" @@ -84,7 +84,7 @@ "Arbitrum": 909051, "Arbitrum_Rinkeby": 0, "xDai": 18101937, - "Boba": 0, + "Boba": 284557, "Boba_Rinkeby": 87121, "Celo": 0, "Fantom": 0 From 5505a8409dab3e4603f97eeb913b1adc5a266c19 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 12 Jan 2022 15:43:23 +0100 Subject: [PATCH 18/32] chore(boba): add info on evm json files --- packages/web3-constants/evm/airdrop.json | 1 + packages/web3-constants/evm/coingecko.json | 12 ++++++------ packages/web3-constants/evm/coinmarketcap.json | 2 +- packages/web3-constants/evm/cryptoartai.json | 6 ++++++ packages/web3-constants/evm/debank.json | 2 +- packages/web3-constants/evm/gitcoin.json | 4 ++-- packages/web3-constants/evm/token-list.json | 5 +++-- packages/web3-constants/evm/token.json | 10 ++++++++-- packages/web3-constants/evm/trader.json | 4 ++++ packages/web3-constants/evm/zerion.json | 12 ++++++------ 10 files changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/web3-constants/evm/airdrop.json b/packages/web3-constants/evm/airdrop.json index c8800031b4bb..ad5f2a6abdea 100644 --- a/packages/web3-constants/evm/airdrop.json +++ b/packages/web3-constants/evm/airdrop.json @@ -13,6 +13,7 @@ "Arbitrum_Rinkeby": "", "xDai": "", "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index 022443368089..fd404d3ccc77 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -12,10 +12,10 @@ "Arbitrum": "arbitrum-one", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Celo": "celo", - "Fantom": "fantom", "Boba": "boba", - "Boba_Rinkeby": "" + "Boba_Rinkeby": "", + "Celo": "celo", + "Fantom": "fantom" }, "COIN_ID": { "Mainnet": "ethereum", @@ -30,9 +30,9 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Celo": "celo", - "Fantom": "fantom", "Boba": "boba", - "Boba_Rinkeby": "" + "Boba_Rinkeby": "", + "Celo": "celo", + "Fantom": "fantom" } } diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index 98d30be14fbc..9ea87cdc4379 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", - "Celo": "5567", "Boba": "288", "Boba_Rinkeby": "", + "Celo": "5567", "Fantom": "3513" } } diff --git a/packages/web3-constants/evm/cryptoartai.json b/packages/web3-constants/evm/cryptoartai.json index d4e9200b7a36..baa9f0601b3e 100644 --- a/packages/web3-constants/evm/cryptoartai.json +++ b/packages/web3-constants/evm/cryptoartai.json @@ -12,6 +12,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" }, @@ -28,6 +30,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" }, @@ -44,6 +48,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index f0fd181ff871..902c195f35a4 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", - "Celo": "celo", "Boba": "boba", "Boba_Rinkeby": "", + "Celo": "celo", "Fantom": "ftm" } } diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index 9b01f6fb8f6e..6de4d7acb224 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -63,11 +63,11 @@ "BSCT": 5, "Matic": 5, "Mumbai": 5, - "Boba": 5, - "Boba_Rinkeby": 0, "Arbitrum": 5, "Arbitrum_Rinkeby": 5, "xDai": 5, + "Boba": 5, + "Boba_Rinkeby": 0, "Celo": 5, "Fantom": 5 } diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 85be8e6926d6..d371ab453c28 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -25,8 +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"], + "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/tokens.json"], + "Boba_Rinkeby": [], "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"], - "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/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 4ac3f5334886..f330b54968a2 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -14,7 +14,8 @@ "xDai": "0x0000000000000000000000000000000000000000", "Boba": "0x0000000000000000000000000000000000000000", "Boba_Rinkeby": "0x0000000000000000000000000000000000000000", - "Celo": "0x0000000000000000000000000000000000000000" + "Celo": "0x0000000000000000000000000000000000000000", + "Fantom": "" }, "WNATIVE_ADDRESS": { "Mainnet": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", @@ -67,7 +68,6 @@ "xDai": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", "Boba": "0x5DE1677344D3Cb0D7D465c10b72A8f60699C062d", "Boba_Rinkeby": "0x9d0364c866A73e34649869525CD7576080259A42", - "Celo": "0xb020d981420744f6b0fedd22bb67cd37ce18a1d5", "Fantom": "" }, @@ -390,6 +390,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "0x049d68029688eAbF473097a2fC38ef61633A3C7A" }, @@ -730,6 +732,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "" }, @@ -746,6 +750,8 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "" }, diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index e6e27fa6cd9b..6c5c6c2d0ac0 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -660,6 +660,8 @@ "Arbitrum": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Arbitrum_Rinkeby": "", "xDai": "0x0000000000000000000000000000000000000000", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" }, @@ -676,6 +678,8 @@ "Arbitrum": "0x6352a56caadc4f1e25cd6c75970fa768a3304e64", "Arbitrum_Rinkeby": "", "xDai": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", + "Boba": "", + "Boba_Rinkeby": "", "Celo": "", "Fantom": "" } diff --git a/packages/web3-constants/evm/zerion.json b/packages/web3-constants/evm/zerion.json index cdb83b2712f7..df3ac86271d4 100644 --- a/packages/web3-constants/evm/zerion.json +++ b/packages/web3-constants/evm/zerion.json @@ -12,10 +12,10 @@ "Arbitrum": "arbitrum-assets", "Arbitrum_Rinkeby": "", "xDai": "xdai-assets", - "Celo": "celo-assets", - "Fantom": "fantom-assets", "Boba": "boba-assets", - "Boba_Rinkeby": "" + "Boba_Rinkeby": "", + "Celo": "celo-assets", + "Fantom": "fantom-assets" }, "TRANSACTIONS_SCOPE_NAME": { "Mainnet": "transactions", @@ -30,9 +30,9 @@ "Arbitrum": "arbitrum-transactions", "Arbitrum_Rinkeby": "", "xDai": "xdai-transactions", - "Celo": "celo-transactions", - "Fantom": "fantom-transactions", "Boba": "boba-transactions", - "Boba_Rinkeby": "" + "Boba_Rinkeby": "", + "Celo": "celo-transactions", + "Fantom": "fantom-transactions" } } From 0dc8d5c4dcdc8b5c9417fc4eb8a93d4fc35715c7 Mon Sep 17 00:00:00 2001 From: codingsh Date: Fri, 14 Jan 2022 00:26:16 +0100 Subject: [PATCH 19/32] chore(boba): fixed boba network --- .../Labs/components/SwapSettingDialog.tsx | 7 ++-- packages/mask/src/plugins/EVM/constants.ts | 2 +- .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/constants/index.ts | 1 + .../plugins/Trader/constants/oolongswap.ts | 14 ++++++++ .../src/plugins/Trader/constants/openocean.ts | 2 +- .../src/plugins/Trader/constants/sushiswap.ts | 1 - packages/mask/src/plugins/Trader/services.ts | 2 +- packages/mask/src/plugins/Trader/settings.ts | 2 +- .../src/plugins/Trader/trader/0x/constants.ts | 2 +- .../Trader/trader/openocean/useTrade.ts | 2 +- .../plugins/Trader/trader/useTradeContext.ts | 6 ++-- .../src/UI/components/NetworkIcon/index.tsx | 34 ------------------ .../NetworkIcon/wallet-network-icon/boba.png | Bin 26311 -> 0 bytes .../wallet-network-icon/fantom.png | Bin 6219 -> 0 bytes packages/web3-constants/evm/coingecko.json | 4 +-- packages/web3-constants/evm/explorer.json | 12 +++---- packages/web3-constants/evm/trader.json | 2 +- packages/web3-shared/evm/assets/chains.json | 4 +-- 19 files changed, 39 insertions(+), 60 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/oolongswap.ts delete mode 100644 packages/shared/src/UI/components/NetworkIcon/index.tsx delete mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png delete mode 100644 packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 4f8128c508b6..08459510f477 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -60,10 +60,7 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) ] const fantomOptions = xDaiOptions - const bobaOptions = [ - { label: 'SushiSwap', value: TradeProvider.SUSHISWAP }, - { label: 'OolongSwap', value: TradeProvider.OOLONGSWAP }, - ] + const bobaOptions = [{ label: 'OolongSwap', value: TradeProvider.OOLONGSWAP }] const celoOptions = [{ label: 'SushiSwap', value: TradeProvider.SUSHISWAP }] @@ -110,7 +107,7 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) legend: t.labs_settings_swap_network({ network: 'Boba' }), value: useBobaNetworkTradeProvider(), options: bobaOptions, - onChange: (value: string) => Services.Settings.setBobaNetworkTradeProvider(+value), + onChange: (value: string) => Services.Settings.setBobaNetworkTradeProvider(Number.parseInt(value, 10)), }, { legend: t.labs_settings_swap_network({ network: 'Fantom' }), diff --git a/packages/mask/src/plugins/EVM/constants.ts b/packages/mask/src/plugins/EVM/constants.ts index 00fbf69f558d..1cd84c7c4886 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.Boba, name: 'Boba', icon: new URL('./assets/boba.png', import.meta.url), - iconColor: 'rgb(73, 169, 166)', + iconColor: 'rgb(53, 208, 127)', isMainnet: true, }, ] diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index bc81b4b9d416..1bd12b58a98e 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -44,7 +44,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Boba: - return [TradeProvider.SUSHISWAP, TradeProvider.OOLONGSWAP] + return [TradeProvider.OOLONGSWAP] default: safeUnreachable(networkType) return [] diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 1b15553734b4..557023cd4992 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -9,4 +9,5 @@ export * from './quickswap' export * from './pancakeswap' export * from './dodo' export * from './bancor' +export * from './oolongswap' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/oolongswap.ts b/packages/mask/src/plugins/Trader/constants/oolongswap.ts new file mode 100644 index 000000000000..aae5819029c7 --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/oolongswap.ts @@ -0,0 +1,14 @@ +import { ChainId } from '@masknet/web3-shared-evm' +import { 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 OOLONGSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const OOLONGSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.Boba]), +} diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index b9fc6546cfcc..42731423234e 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.Boba]: 'boba', + [NetworkType.Boba]: '', } diff --git a/packages/mask/src/plugins/Trader/constants/sushiswap.ts b/packages/mask/src/plugins/Trader/constants/sushiswap.ts index d5353d8d0e09..ae6db9169262 100644 --- a/packages/mask/src/plugins/Trader/constants/sushiswap.ts +++ b/packages/mask/src/plugins/Trader/constants/sushiswap.ts @@ -33,7 +33,6 @@ export const SUSHISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Matic]: [WNATIVE, USDC, WBTC, DAI, USDT].map((x) => x[ChainId.Matic]), [ChainId.BSC]: [WNATIVE, DAI, BUSD, USDC, USDT, BTCB].map((x) => x[ChainId.BSC]), [ChainId.xDai]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.xDai]), - [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.Boba]), [ChainId.Celo]: [WNATIVE, CUSD, CEUR].map((x) => x[ChainId.Celo]), [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC].map((x) => x[ChainId.Fantom]), } diff --git a/packages/mask/src/plugins/Trader/services.ts b/packages/mask/src/plugins/Trader/services.ts index 4ae7313704b7..8d3aaa407b19 100644 --- a/packages/mask/src/plugins/Trader/services.ts +++ b/packages/mask/src/plugins/Trader/services.ts @@ -45,7 +45,7 @@ currentChainIdSettings.addListener((chainId: ChainId) => { currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP break case NetworkType.Boba: - currentTradeProviderSettings.value = TradeProvider.SUSHISWAP + currentTradeProviderSettings.value = TradeProvider.OOLONGSWAP if (currentDataProviderSettings.value === DataProvider.UNISWAP_INFO) currentDataProviderSettings.value = DataProvider.COIN_MARKET_CAP break diff --git a/packages/mask/src/plugins/Trader/settings.ts b/packages/mask/src/plugins/Trader/settings.ts index b938d685363d..894e37b242a4 100644 --- a/packages/mask/src/plugins/Trader/settings.ts +++ b/packages/mask/src/plugins/Trader/settings.ts @@ -84,7 +84,7 @@ export const fantomNetworkTradeProviderSettings = createGlobalSettings( `${PLUGIN_ID}+boba+tradeProvider`, - TradeProvider.SUSHISWAP, + TradeProvider.OOLONGSWAP, { primary: () => '' }, ) diff --git a/packages/mask/src/plugins/Trader/trader/0x/constants.ts b/packages/mask/src/plugins/Trader/trader/0x/constants.ts index 2a304dd09531..9b3d5ce73960 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.Boba] diff --git a/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts b/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts index 960a788ce0eb..a0aa01fba2a9 100644 --- a/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts @@ -34,7 +34,7 @@ export function useTrade( if (!inputToken || !outputToken) return null if (inputAmount === '0') return null const sellToken = isNativeTokenAddress(inputToken.address) - ? { ...inputToken, address: OPENOCEAN_ETH_ADDRESS ?? '' } + ? { ...inputToken, address: OPENOCEAN_ETH_ADDRESS ?? ' ' } : inputToken const buyToken = isNativeTokenAddress(outputToken.address) ? { ...outputToken, address: OPENOCEAN_ETH_ADDRESS ?? '' } diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 244dec1ac265..20074ba43574 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -11,6 +11,8 @@ import { SASHIMISWAP_CUSTOM_BASES, SUSHISWAP_BASE_AGAINST_TOKENS, SUSHISWAP_CUSTOM_BASES, + OOLONGSWAP_BASE_AGAINST_TOKENS, + OOLONGSWAP_CUSTOM_BASES, UNISWAP_BASE_AGAINST_TOKENS, UNISWAP_CUSTOM_BASES, } from '../constants' @@ -106,9 +108,9 @@ export function useTradeContext(tradeProvider: TradeProvider) { INIT_CODE_HASH: TRADER_DEX.OOLONGSWAP_INIT_CODE_HASH, ROUTER_CONTRACT_ADDRESS: TRADER_DEX.OOLONGSWAP_ROUTER_ADDRESS, FACTORY_CONTRACT_ADDRESS: TRADER_DEX.OOLONGSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, + AGAINST_TOKENS: OOLONGSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, + CUSTOM_TOKENS: OOLONGSWAP_CUSTOM_BASES, } case TradeProvider.ZRX: return { diff --git a/packages/shared/src/UI/components/NetworkIcon/index.tsx b/packages/shared/src/UI/components/NetworkIcon/index.tsx deleted file mode 100644 index 6adc2cfc5339..000000000000 --- a/packages/shared/src/UI/components/NetworkIcon/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { makeStyles } from '@masknet/theme' -import { NetworkType } from '@masknet/web3-shared-evm' -import { useStylesExtends } from '@masknet/theme' - -const useStyles = makeStyles()({ - icon: { - borderRadius: '50%', - backgroundColor: '#F7F9FA', - }, -}) - -export interface NetworkIconProps extends withClasses<'icon'> { - size?: number - networkType?: NetworkType -} - -const icons: Record = { - [NetworkType.Ethereum]: new URL('./wallet-network-icon/ethereum.png', import.meta.url).toString(), - [NetworkType.Binance]: new URL('./wallet-network-icon/binance.png', import.meta.url).toString(), - [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.Boba]: new URL('./wallet-network-icon/boba.png', import.meta.url).toString(), - [NetworkType.Celo]: new URL('./wallet-network-icon/celo.png', import.meta.url).toString(), - [NetworkType.Fantom]: new URL('./wallet-network-icon/fantom.png', import.meta.url).toString(), -} - -export function NetworkIcon(props: NetworkIconProps) { - const { size = 48, networkType } = props - const classes = useStylesExtends(useStyles(), props) - - if (!networkType) return null - return -} diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/boba.png deleted file mode 100644 index adc63452fa65ba2e5341d810428bbeacb2cd51a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26311 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 DHcphG diff --git a/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png b/packages/shared/src/UI/components/NetworkIcon/wallet-network-icon/fantom.png deleted file mode 100644 index 899c7b1f6e5888c5c107be36281fb1042edd8cbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6219 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 diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index fd404d3ccc77..36f721eb04e7 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -27,10 +27,10 @@ "BSCT": "", "Matic": "matic-network", "Mumbai": "arbitrum-one", - "Arbitrum": "", + "Arbitrum": "ethereum", "Arbitrum_Rinkeby": "", "xDai": "xdai", - "Boba": "boba", + "Boba": "ethereum", "Boba_Rinkeby": "", "Celo": "celo", "Fantom": "fantom" diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 2a45b97226d1..90ede2dc9cfb 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -12,10 +12,10 @@ "Arbitrum": ["BE8VU1P9FUKRT15FBHKQMU84829VITWWF2"], "Arbitrum_Rinkeby": [], "xDai": [], - "Celo": [], - "Fantom": ["AST4WWPNEYDURUXG2GH32JZMYWEFDP999S"], "Boba": [], - "Boba_Rinkeby": [] + "Boba_Rinkeby": [], + "Celo": [], + "Fantom": ["AST4WWPNEYDURUXG2GH32JZMYWEFDP999S"] }, "EXPLORER_API": { "Mainnet": "https://api.etherscan.io/api", @@ -30,9 +30,9 @@ "Arbitrum": "https://api.arbiscan.io/api", "Arbitrum_Rinkeby": "", "xDai": "https://blockscout.com/xdai/mainnet/api", - "Celo": "https://explorer.celo.org/api", - "Fantom": "https://api.ftmscan.com/api", "Boba": "", - "Boba_Rinkeby": "" + "Boba_Rinkeby": "", + "Celo": "https://explorer.celo.org/api", + "Fantom": "https://api.ftmscan.com/api" } } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 6c5c6c2d0ac0..bd1b20bd32d8 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -660,7 +660,7 @@ "Arbitrum": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Arbitrum_Rinkeby": "", "xDai": "0x0000000000000000000000000000000000000000", - "Boba": "", + "Boba": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Boba_Rinkeby": "", "Celo": "", "Fantom": "" diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 8617c9d025dd..47ae5c08a76c 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -342,7 +342,7 @@ "faucets": [], "features": [], "nativeCurrency": { - "name": "Ether", + "name": "Boba Ether", "symbol": "ETH", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/sushiswap/icons/master/token/eth.jpg" @@ -367,7 +367,7 @@ "faucets": [], "features": [], "nativeCurrency": { - "name": "Ether", + "name": "Boba Ether", "symbol": "ETH", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/sushiswap/icons/master/token/eth.jpg" From 4c6143ffab957c9fea9d82260b5a06bc5a3f87ae Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 15 Jan 2022 15:43:24 +0100 Subject: [PATCH 20/32] feat(boba): add SwapperChan DEX --- cspell.json | 5 +- .../SNSAdaptor/trader/TradeProviderIcon.tsx | 9 +++ .../Trader/SNSAdaptor/trending/TraderView.tsx | 9 ++- .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/apis/trending/index.ts | 10 +-- .../src/plugins/Trader/constants/index.ts | 1 + .../plugins/Trader/constants/oolongswap.ts | 4 +- .../plugins/Trader/constants/swapperchan.ts | 14 ++++ .../src/plugins/Trader/constants/trader.ts | 3 + packages/mask/src/plugins/Trader/pipes.ts | 6 ++ packages/mask/src/plugins/Trader/settings.ts | 3 + .../Trader/trader/openocean/constants.ts | 1 + .../Trader/trader/useGetTradeContext.ts | 20 ++++- .../plugins/Trader/trader/useTradeCallback.ts | 2 + .../plugins/Trader/trader/useTradeContext.ts | 14 ++++ .../mask/src/plugins/Trader/types/trader.ts | 1 + packages/mask/src/resources/swapperchan.png | Bin 0 -> 16291 bytes packages/public-api/src/web.ts | 3 +- packages/web3-constants/evm/token.json | 54 +++++++++++++ packages/web3-constants/evm/trader.json | 72 ++++++++++++++++++ 20 files changed, 216 insertions(+), 17 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/swapperchan.ts create mode 100644 packages/mask/src/plugins/Trader/trader/openocean/constants.ts create mode 100644 packages/mask/src/resources/swapperchan.png diff --git a/cspell.json b/cspell.json index 5c4e006d4801..49131b9661a9 100644 --- a/cspell.json +++ b/cspell.json @@ -213,6 +213,7 @@ "superrare", "sushiswap", "swappable", + "SWAPPERCHAN", "Swither", "tabindex", "tablist", @@ -349,6 +350,7 @@ "testweb", "tinycolor", "treeshake", + "txreceipt", "txts", "uaddr", "unauthenticate", @@ -362,8 +364,7 @@ "walletlink", "WNATIVE", "xdescribe", - "xtest", - "txreceipt" + "xtest" ], "ignoreRegExpList": ["/@servie/"], "overrides": [ diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx index e88bc62c5580..1e88166250e9 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx @@ -14,6 +14,7 @@ import { resolveTradeProviderName } from '../../pipes' const quickswapIcon = new URL('../../../../resources/quickswap.png', import.meta.url).toString() const pancakeswapIcon = new URL('../../../../resources/pancakeswap.png', import.meta.url).toString() +const swapperchanIcon = new URL('../../../../resources/swapperchan.png', import.meta.url).toString() const useStyles = makeStyles()((theme) => ({ icon: { @@ -57,6 +58,14 @@ export function TradeProviderIcon(props: TradeProviderIconProps) { className={classes.icon} /> ) + case TradeProvider.SWAPPERCHAN: + return ( + {resolveTradeProviderName(TradeProvider.SWAPPERCHAN)} + ) case TradeProvider.DODO: return case TradeProvider.BANCOR: diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx index f95b935300e5..356657008fe2 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trending/TraderView.tsx @@ -131,13 +131,15 @@ export function TraderView(props: TraderViewProps) { //#endregion //#region swap + const coinSymbol = (trending?.coin.symbol || '').toLowerCase() + const { value: tokenDetailed, error: tokenDetailedError, loading: loadingTokenDetailed, } = useFungibleTokenDetailed( - trending?.coin.symbol.toLowerCase() === 'eth' ? EthereumTokenType.Native : EthereumTokenType.ERC20, - trending?.coin.symbol.toLowerCase() === 'eth' ? '' : trending?.coin.contract_address ?? '', + coinSymbol === 'eth' ? EthereumTokenType.Native : EthereumTokenType.ERC20, + coinSymbol === 'eth' ? '' : trending?.coin.contract_address ?? '', ) //#endregion @@ -204,8 +206,7 @@ export function TraderView(props: TraderViewProps) { //#region if the coin is a native token or contract address exists const isSwappable = - (!!trending?.coin.contract_address || - ['eth', 'matic', 'bnb'].includes(trending?.coin.symbol.toLowerCase() ?? '')) && + (!!trending?.coin.contract_address || ['eth', 'matic', 'bnb'].includes(coinSymbol)) && chainIdValid && tradeProviders.length //#endregion diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 1bd12b58a98e..1066afa043a3 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -44,7 +44,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Boba: - return [TradeProvider.OOLONGSWAP] + return [TradeProvider.OOLONGSWAP, TradeProvider.DODO, TradeProvider.SWAPPERCHAN] default: safeUnreachable(networkType) return [] diff --git a/packages/mask/src/plugins/Trader/apis/trending/index.ts b/packages/mask/src/plugins/Trader/apis/trending/index.ts index 711c6b7ff184..b8eb465c7d3f 100644 --- a/packages/mask/src/plugins/Trader/apis/trending/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trending/index.ts @@ -334,10 +334,10 @@ async function getCoinTrending(id: string, currency: Currency, dataProvider: Dat market: marketInfo, coin: { id, - name: token?.name, - symbol: token?.symbol, - decimals: Number(token?.decimals), - is_mirrored: isMirroredKeyword(token?.symbol ?? ''), + name: token?.name || '', + symbol: token?.symbol || '', + decimals: Number(token?.decimals || '0'), + is_mirrored: isMirroredKeyword(token?.symbol || ''), blockchain_urls: [`https://info.uniswap.org/token/${id}`, `https://etherscan.io/address/${id}`], image_url: `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/${id}/logo.png`, platform_url: `https://info.uniswap.org/token/${id}`, @@ -345,7 +345,7 @@ async function getCoinTrending(id: string, currency: Currency, dataProvider: Dat }, tickers: tickersInfo, lastUpdated: '', - } as Trending + } default: unreachable(dataProvider) } diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 557023cd4992..b41a775786d7 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -10,4 +10,5 @@ export * from './pancakeswap' export * from './dodo' export * from './bancor' export * from './oolongswap' +export * from './swapperchan' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/oolongswap.ts b/packages/mask/src/plugins/Trader/constants/oolongswap.ts index aae5819029c7..b4ee88fe6f87 100644 --- a/packages/mask/src/plugins/Trader/constants/oolongswap.ts +++ b/packages/mask/src/plugins/Trader/constants/oolongswap.ts @@ -1,5 +1,5 @@ import { ChainId } from '@masknet/web3-shared-evm' -import { USDC, USDT, WBTC, WNATIVE, WNATIVE_ONLY } from './trader' +import { USDC, USDT, WBTC, WNATIVE, OLO, BOBA, WNATIVE_ONLY } from './trader' import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' /** @@ -10,5 +10,5 @@ export const OOLONGSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} export const OOLONGSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, - [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC].map((x) => x[ChainId.Boba]), + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC, OLO, BOBA].map((x) => x[ChainId.Boba]), } diff --git a/packages/mask/src/plugins/Trader/constants/swapperchan.ts b/packages/mask/src/plugins/Trader/constants/swapperchan.ts new file mode 100644 index 000000000000..8c373790485c --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/swapperchan.ts @@ -0,0 +1,14 @@ +import { ChainId } from '@masknet/web3-shared-evm' +import { USDC, USDT, WBTC, WNATIVE, OLO, BOBA, 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 SWAPPERCHAN_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const SWAPPERCHAN_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC, OLO, BOBA].map((x) => x[ChainId.Boba]), +} diff --git a/packages/mask/src/plugins/Trader/constants/trader.ts b/packages/mask/src/plugins/Trader/constants/trader.ts index e723fd0b0900..ddc088968324 100644 --- a/packages/mask/src/plugins/Trader/constants/trader.ts +++ b/packages/mask/src/plugins/Trader/constants/trader.ts @@ -43,6 +43,9 @@ export const NFTX = createERC20Tokens('NFTX_ADDRESS', 'NFTX', 'NFTX', 18) export const STETH = createERC20Tokens('stETH_ADDRESS', 'stakedETH', 'stETH', 18) export const CUSD = createERC20Tokens('cUSD_ADDRESS', 'Celo Dollar', 'cUSD', 18) export const CEUR = createERC20Tokens('cEUR_ADDRESS', 'Celo Euro', 'cEUR', 18) +export const OLO = createERC20Tokens('OLO_ADDRESS', 'OolongSwap Token', 'OLO', 18) +export const BOBA = createERC20Tokens('BOBA_ADDRESS', 'Boba Token', 'BOBA', 18) +export const WAIFU = createERC20Tokens('WAIFU_ADDRESS', 'WaifuToken', 'WAIFU', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 9907b1c34aa1..2009eabac832 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -58,6 +58,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) @@ -110,6 +111,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://oolongswap.com/' case TradeProvider.OPENOCEAN: return 'https://openocean.finance/classic' + case TradeProvider.SWAPPERCHAN: + return 'https://swapperchan.com/swap' default: unreachable(tradeProvider) } @@ -169,6 +172,8 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri return '' case TradeProvider.OOLONGSWAP: return `https://info.oolongswap.com/#/pair/${address}` + case TradeProvider.SWAPPERCHAN: + return `https://analytics.swapperchan.com/pairs/${address}` case TradeProvider.OPENOCEAN: // TODO - OpenOcean return '' @@ -262,6 +267,7 @@ export const resolveZrxTradePoolName = createLookupTableResolver(`${PLUGIN_ID}+tradeProvi const dodoSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+dodo`, '') const bancorSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+bancor`, '') const oolongswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+oolongswap`, '') +const swapperchanSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+swapperchan`, '') const openoceanSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+openocean`, '') /** @@ -141,6 +142,8 @@ export function getCurrentTradeProviderGeneralSettings(tradeProvider: TradeProvi return oolongswapSettings case TradeProvider.OPENOCEAN: return openoceanSettings + case TradeProvider.SWAPPERCHAN: + return swapperchanSettings default: unreachable(tradeProvider) } diff --git a/packages/mask/src/plugins/Trader/trader/openocean/constants.ts b/packages/mask/src/plugins/Trader/trader/openocean/constants.ts new file mode 100644 index 000000000000..e6cadae022b4 --- /dev/null +++ b/packages/mask/src/plugins/Trader/trader/openocean/constants.ts @@ -0,0 +1 @@ +export const OPENOCEAN_SUPPORTED_CHAINS = [1, 56, 100, 137, 250, 42161, 43114] diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 70f5c68e59b1..55d077e8326a 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -13,6 +13,10 @@ import { SUSHISWAP_CUSTOM_BASES, UNISWAP_BASE_AGAINST_TOKENS, UNISWAP_CUSTOM_BASES, + OOLONGSWAP_BASE_AGAINST_TOKENS, + OOLONGSWAP_CUSTOM_BASES, + SWAPPERCHAN_BASE_AGAINST_TOKENS, + SWAPPERCHAN_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -102,9 +106,21 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { INIT_CODE_HASH: getTraderConstants(chainId).OOLONGSWAP_INIT_CODE_HASH, ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_ROUTER_ADDRESS, FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).OOLONGSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, + AGAINST_TOKENS: OOLONGSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, + CUSTOM_TOKENS: OOLONGSWAP_CUSTOM_BASES, + } + case TradeProvider.SWAPPERCHAN: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: getTraderConstants(chainId).SWAPPERCHAN_THEGRAPH, + INIT_CODE_HASH: getTraderConstants(chainId).SWAPPERCHAN_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).SWAPPERCHAN_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).SWAPPERCHAN_FACTORY_ADDRESS, + AGAINST_TOKENS: SWAPPERCHAN_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SWAPPERCHAN_CUSTOM_BASES, } case TradeProvider.ZRX: return { diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index ceace84d7e07..0397e42e403c 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -92,6 +92,8 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.OOLONGSWAP: return uniswapV2Like + case TradeProvider.SWAPPERCHAN: + return uniswapV2Like case TradeProvider.SASHIMISWAP: return uniswapV2Like case TradeProvider.QUICKSWAP: diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 20074ba43574..cbc6420e9393 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -13,6 +13,8 @@ import { SUSHISWAP_CUSTOM_BASES, OOLONGSWAP_BASE_AGAINST_TOKENS, OOLONGSWAP_CUSTOM_BASES, + SWAPPERCHAN_BASE_AGAINST_TOKENS, + SWAPPERCHAN_CUSTOM_BASES, UNISWAP_BASE_AGAINST_TOKENS, UNISWAP_CUSTOM_BASES, } from '../constants' @@ -112,6 +114,18 @@ export function useTradeContext(tradeProvider: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: OOLONGSWAP_CUSTOM_BASES, } + case TradeProvider.SWAPPERCHAN: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: TRADER_DEX.SWAPPERCHAN_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.SWAPPERCHAN_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.SWAPPERCHAN_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.SWAPPERCHAN_FACTORY_ADDRESS, + AGAINST_TOKENS: SWAPPERCHAN_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SWAPPERCHAN_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index 9fe185c1eeb5..b5ed8d33ed24 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -72,6 +72,7 @@ export enum ZrxTradePool { WaultSwap = 'WaultSwap', xSigma = 'xSigma', OolongSwap = 'OolongSwap', + SwapperChan = 'SwapperChan', } export interface TradeComputed { diff --git a/packages/mask/src/resources/swapperchan.png b/packages/mask/src/resources/swapperchan.png new file mode 100644 index 0000000000000000000000000000000000000000..03040cf6f98e45c1d3bf9939770f3b98abacbe7a GIT binary patch literal 16291 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 8638f63aacb0..a0af270aac41 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -213,8 +213,9 @@ export enum TradeProvider { DODO = 7, UNISWAP_V3 = 8, BANCOR = 9, - OOLONGSWAP = 11, OPENOCEAN = 10, + OOLONGSWAP = 11, + SWAPPERCHAN = 12, } /** Supported language settings */ export enum LanguageOptions { diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index f330b54968a2..020e3ef63703 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -755,6 +755,60 @@ "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "" }, + "OLO_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0x5008F837883EA9a07271a1b5eB0658404F5a9610", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, + "BOBA_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0xa18bF3994C0Cc6E3b63ac420308E5383f53120D7", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, + "WAIFU_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0xB5cB0975716A4AA6438d3FA02364886E13fd678c", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, "ETHER_ADDRESS": { "Mainnet": "", "Ropsten": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index bd1b20bd32d8..66b14f5b4bb9 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -647,6 +647,78 @@ "Celo": "", "Fantom": "" }, + "SWAPPERCHAN_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0x3d97964506800d433fb5DbEBDd0c202EC9B62557", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, + "SWAPPERCHAN_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0x215EC743F2316A0fa4a6Af5A7C331E859f4F5E2b", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, + "SWAPPERCHAN_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, + "SWAPPERCHAN_INIT_CODE_HASH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Boba": "0xf38460909fc2d1bb530318c6a9b776a66b13de28b082e2c3b4dc8670da4d9b6c", + "Boba_Rinkeby": "", + "Celo": "", + "Fantom": "" + }, "OPENOCEAN_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Ropsten": "", From 2a1f568f1bd8ad407af7931a18c67d6a71d533d2 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 15 Jan 2022 18:51:26 +0100 Subject: [PATCH 21/32] feat(boba): add senpaiswap dex --- cspell.json | 3 + .../Labs/components/SwapSettingDialog.tsx | 7 +- .../SNSAdaptor/trader/TradeProviderIcon.tsx | 9 +++ .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/constants/index.ts | 1 + .../plugins/Trader/constants/senpaiswap.ts | 14 ++++ .../src/plugins/Trader/constants/trader.ts | 1 + packages/mask/src/plugins/Trader/pipes.ts | 6 ++ packages/mask/src/plugins/Trader/settings.ts | 3 + .../Trader/trader/openocean/useTrade.ts | 2 + .../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/senpaiswap.png | Bin 0 -> 41789 bytes packages/public-api/src/web.ts | 1 + packages/web3-constants/evm/token.json | 18 +++++ packages/web3-constants/evm/trader.json | 72 ++++++++++++++++++ 18 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/senpaiswap.ts create mode 100644 packages/mask/src/resources/senpaiswap.png diff --git a/cspell.json b/cspell.json index 49131b9661a9..b72d4ae117ab 100644 --- a/cspell.json +++ b/cspell.json @@ -201,6 +201,8 @@ "sashimiswap", "scroller", "secp", + "SENPAI", + "SENPAISWAP", "Serializers", "shink", "Sint", @@ -241,6 +243,7 @@ "Viet", "viewbox", "visualcompletion", + "WAIFU", "walletconnect", "wault", "webextension", diff --git a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx index 08459510f477..3a443c496c08 100644 --- a/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx +++ b/packages/dashboard/src/pages/Labs/components/SwapSettingDialog.tsx @@ -60,7 +60,12 @@ export default function SwapSettingDialog({ open, onClose }: SettingDialogProps) ] const fantomOptions = xDaiOptions - const bobaOptions = [{ label: 'OolongSwap', value: TradeProvider.OOLONGSWAP }] + const bobaOptions = [ + { label: 'OolongSwap', value: TradeProvider.OOLONGSWAP }, + { label: 'DODO', value: TradeProvider.DODO }, + { label: 'SwapperChan', value: TradeProvider.SWAPPERCHAN }, + { label: 'SenpaiSwap', value: TradeProvider.SENPAISWAP }, + ] const celoOptions = [{ label: 'SushiSwap', value: TradeProvider.SUSHISWAP }] diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx index 1e88166250e9..1a37af148c5b 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TradeProviderIcon.tsx @@ -15,6 +15,7 @@ import { resolveTradeProviderName } from '../../pipes' const quickswapIcon = new URL('../../../../resources/quickswap.png', import.meta.url).toString() const pancakeswapIcon = new URL('../../../../resources/pancakeswap.png', import.meta.url).toString() const swapperchanIcon = new URL('../../../../resources/swapperchan.png', import.meta.url).toString() +const senpaiswapIcon = new URL('../../../../resources/senpaiswap.png', import.meta.url).toString() const useStyles = makeStyles()((theme) => ({ icon: { @@ -66,6 +67,14 @@ export function TradeProviderIcon(props: TradeProviderIconProps) { className={classes.icon} /> ) + case TradeProvider.SENPAISWAP: + return ( + {resolveTradeProviderName(TradeProvider.SENPAISWAP)} + ) case TradeProvider.DODO: return case TradeProvider.BANCOR: diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 1066afa043a3..30f2bf31f1ec 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -44,7 +44,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Boba: - return [TradeProvider.OOLONGSWAP, TradeProvider.DODO, TradeProvider.SWAPPERCHAN] + return [TradeProvider.OOLONGSWAP, TradeProvider.DODO, TradeProvider.SWAPPERCHAN, TradeProvider.SENPAISWAP] default: safeUnreachable(networkType) return [] diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index b41a775786d7..dc3bbe31f90f 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -11,4 +11,5 @@ export * from './dodo' export * from './bancor' export * from './oolongswap' export * from './swapperchan' +export * from './senpaiswap' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/senpaiswap.ts b/packages/mask/src/plugins/Trader/constants/senpaiswap.ts new file mode 100644 index 000000000000..7b3638236cbe --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/senpaiswap.ts @@ -0,0 +1,14 @@ +import { ChainId } from '@masknet/web3-shared-evm' +import { USDC, USDT, WBTC, WNATIVE, SENPAI, BOBA, 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 SENPAISWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const SENPAISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC, SENPAI, BOBA].map((x) => x[ChainId.Boba]), +} diff --git a/packages/mask/src/plugins/Trader/constants/trader.ts b/packages/mask/src/plugins/Trader/constants/trader.ts index ddc088968324..f5b184fa9c42 100644 --- a/packages/mask/src/plugins/Trader/constants/trader.ts +++ b/packages/mask/src/plugins/Trader/constants/trader.ts @@ -46,6 +46,7 @@ export const CEUR = createERC20Tokens('cEUR_ADDRESS', 'Celo Euro', 'cEUR', 18) export const OLO = createERC20Tokens('OLO_ADDRESS', 'OolongSwap Token', 'OLO', 18) export const BOBA = createERC20Tokens('BOBA_ADDRESS', 'Boba Token', 'BOBA', 18) export const WAIFU = createERC20Tokens('WAIFU_ADDRESS', 'WaifuToken', 'WAIFU', 18) +export const SENPAI = createERC20Tokens('SENPAI_ADDRESS', 'SenpaiSwap', 'SENPAI', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 2009eabac832..76d99c48b6a7 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -59,6 +59,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) @@ -113,6 +114,8 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy return 'https://openocean.finance/classic' case TradeProvider.SWAPPERCHAN: return 'https://swapperchan.com/swap' + case TradeProvider.SENPAISWAP: + return 'https://app.senpaiswap.com/#/swap' default: unreachable(tradeProvider) } @@ -174,6 +177,8 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri return `https://info.oolongswap.com/#/pair/${address}` case TradeProvider.SWAPPERCHAN: return `https://analytics.swapperchan.com/pairs/${address}` + case TradeProvider.SENPAISWAP: + return `https://pour.senpaiswap.com/#/pair/${address}` case TradeProvider.OPENOCEAN: // TODO - OpenOcean return '' @@ -268,6 +273,7 @@ export const resolveZrxTradePoolName = createLookupTableResolver(`${PLUGIN_ID}+tradeProvider+ const bancorSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+bancor`, '') const oolongswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+oolongswap`, '') const swapperchanSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+swapperchan`, '') +const senpaiswapSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+senpaiswap`, '') const openoceanSettings = createInternalSettings(`${PLUGIN_ID}+tradeProvider+openocean`, '') /** @@ -144,6 +145,8 @@ export function getCurrentTradeProviderGeneralSettings(tradeProvider: TradeProvi return openoceanSettings case TradeProvider.SWAPPERCHAN: return swapperchanSettings + case TradeProvider.SENPAISWAP: + return senpaiswapSettings default: unreachable(tradeProvider) } diff --git a/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts b/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts index a0aa01fba2a9..028fccbfee7e 100644 --- a/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/openocean/useTrade.ts @@ -12,6 +12,7 @@ import { PluginTraderRPC } from '../../messages' import type { TradeStrategy } from '../../types' import { TargetChainIdContext } from '../useTargetChainIdContext' import { useSlippageTolerance } from './useSlippageTolerance' +import { OPENOCEAN_SUPPORTED_CHAINS } from './constants' import { first } from 'lodash-unified' export function useTrade( @@ -31,6 +32,7 @@ export function useTrade( const account = useAccount() return useAsyncRetry(async () => { + if (!OPENOCEAN_SUPPORTED_CHAINS.includes(targetChainId)) return null if (!inputToken || !outputToken) return null if (inputAmount === '0') return null const sellToken = isNativeTokenAddress(inputToken.address) diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 55d077e8326a..70ecab66b656 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -17,6 +17,8 @@ import { OOLONGSWAP_CUSTOM_BASES, SWAPPERCHAN_BASE_AGAINST_TOKENS, SWAPPERCHAN_CUSTOM_BASES, + SENPAISWAP_BASE_AGAINST_TOKENS, + SENPAISWAP_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -122,6 +124,18 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: SWAPPERCHAN_CUSTOM_BASES, } + case TradeProvider.SENPAISWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: getTraderConstants(chainId).SENPAISWAP_THEGRAPH, + INIT_CODE_HASH: getTraderConstants(chainId).SENPAISWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: getTraderConstants(chainId).SENPAISWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: getTraderConstants(chainId).SENPAISWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: SENPAISWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SENPAISWAP_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 0397e42e403c..93163362901e 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -94,6 +94,8 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.SWAPPERCHAN: return uniswapV2Like + case TradeProvider.SENPAISWAP: + return uniswapV2Like case TradeProvider.SASHIMISWAP: return uniswapV2Like case TradeProvider.QUICKSWAP: diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index cbc6420e9393..dd8a1a587e34 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -15,6 +15,8 @@ import { OOLONGSWAP_CUSTOM_BASES, SWAPPERCHAN_BASE_AGAINST_TOKENS, SWAPPERCHAN_CUSTOM_BASES, + SENPAISWAP_BASE_AGAINST_TOKENS, + SENPAISWAP_CUSTOM_BASES, UNISWAP_BASE_AGAINST_TOKENS, UNISWAP_CUSTOM_BASES, } from '../constants' @@ -126,6 +128,18 @@ export function useTradeContext(tradeProvider: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: SWAPPERCHAN_CUSTOM_BASES, } + case TradeProvider.SENPAISWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: TRADER_DEX.SENPAISWAP_THEGRAPH, + INIT_CODE_HASH: TRADER_DEX.SENPAISWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: TRADER_DEX.SENPAISWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: TRADER_DEX.SENPAISWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: SENPAISWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: SENPAISWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index b5ed8d33ed24..2e38b91bf40c 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -73,6 +73,7 @@ export enum ZrxTradePool { xSigma = 'xSigma', OolongSwap = 'OolongSwap', SwapperChan = 'SwapperChan', + SenpaiSwap = 'SenpaiSwap', } export interface TradeComputed { diff --git a/packages/mask/src/resources/senpaiswap.png b/packages/mask/src/resources/senpaiswap.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dd434eca163895f883166cf8cdb834ecc9218d GIT binary patch literal 41789 zcmV)NK)1h%P)FdN+d;55*4Xn z%eK5ua@l_NdY^X7yIb{k>q&3-RlQp8K3jgzcG08k<&N^-Lfap#5;y1)MW|Gz)92!a6r)_%M;y4NcKxK{l* z{`yMVkUFRhE!$}h{o647c@7*INUCjyu%9`dIx2Ty7S?{usdbD}e8R1FrQ8 z)BX*_u@;l8cc_D27vChe_qYP}V{|OrY0kU}?&(d@e(6Cxy4NGH-m5@+&70tsuCyJ{ zfc|9%^)DTWm9*8Mz4uKdX@Ao8AbtF6SQ%xXP~iQs zCGOetLztMlh_mO0aOV6FD%A>(o;VB;Fasb6eE43#;Iz#ove`URsT2YPi@*#14g&dJ z{4;t@V5Ya|-;PoT2Kolj-`D@+cYtj71Nf(9JI%*_(i6Q|+b<-DNB4Taqkwz+YyB+& z^vLl;ICK6qj+{7*BgYQO4~)fNluf`O6vJ}`iiIvDlSvq6^f~o!3y>Mag5THuZx}}F zxlIE?7#LhN7y^25hjXoc!)fxzV!RiM6j?PctA$5c#H4Q_6 z2&`lj5>TUih$L_bW(EAf_c1dyfnWQ;hjG_!?@;$D7|fpU;|fQ3Rss1_SN8QcPy4w7 z@#tRfS|v3uYp^vMb$sPpU&Wq%&qZ@cXdeB|99fqOK^9w-?#3aqmT{wkQDvd^?fn+klAkocf z1n4aFA)QV#08^<1s}j7d^YU*pNXz9K5($feN+70IF4tK{rtcB}ZCjq#aiq#YV56^U z9htsk+LoFiCXy+GuTMaZOJtr5rU{qd7tD%Gj!oc0_q-49y7QeOh@lo92D2{#eFcr& z+`selpf9)bI&ZS3oD@Ts1#loBJb}Zn9>U-J^IwJlW@aG}Jjgy#TY4D|B&d0yeSx|8 zS=e?$NkaOrAF>I)XQ8L7ADK*wfnq1gkRu9=PAy;1cN+~Cp6kOh3~O#l(p)Y~!-gMtFoX%;lhX3s$SEY15k?X)G@d*I%Li8RxwPs)U;uR=vugY9=q&5g7(~0mrrX^Vp*YQ!S zx#0vzrjjsN7Y|UYIxNx2IINbdSi5QsKJfN;V$F)dCAuzv>tB(Y@urr_Z%Rq5f^vo~ z2VerP;TjMmg##boeB|q>*GU3eNLV&ZVelc8%q86tFr_363>eJ43QWw5#_hatxh6xb znD0R*lVM$!KtzTdOH)3l!4jS@(5QP1d;)OOIRZpd81fw2*+CP6CJLRKUXyx2lZCz` zSWOX91u=!B;b6nE$(S^mvI_zOt{1R$rf0Tk5*j`UalX%DCXcUu{~=T>3vK()5CRF3 ztkSB{f1ya{@3Keo{RkHo~%OW+WsHA`dbQB}k<-mVrRgcjp^#`BWi+mO;%OG+Bjqo?-8)*JDx9{4%OO%0%;IV49_#r-PNO12lBjmu&jgv zpnz?qVH&1V7l=9VB^AbwH6?WoeQgOpty1VFgM$nyjfGs!8RUjsEoAhYDJ3#Xa(W(D zNp?~(0;JMOmd11imkmjIPYD9Cp;jQ|E={u>WHP)2U_wP0@~0H4YeRZy;{L@`<}&JyY9mAvnO$3^nAFCGkYN9 zppv0O;2=t}b+shOj^igq^nFxh~n5 zP;4FySaPBzqRD%1Vie!~(GPIv&9`9x(N}P0_{@^yp#?Rm7E&r-a`^5W-Ru3+m5%ir z)qbWRRvmEPl3(xy0~l(6G=S-tnwiAk{OjM~u3PS6P~G>n`(Y;%YB@GT$wvU7W!bcB z*a@j$(tD%^l&kYd*mfA?!$z8u45hI2nE5QZ131JVz_t>h>sQih9xvlsw`B=xXbCH& zKY^TLi?!+yQe;7cCm0>3VKH-J*(ta|gMrM~rx*%T-m_&TS;EtECCnrP%}&}(Cu#1Jbz#;?D^!dBVR0?~KAH*|z_u^e|xeG(%!+7?kJxg}G)|IK*WcZ~oiR9lN-RnK} zv(%G+CLpEm@I~ zL?ia%X9nb-I*8SSKDH!%Mg!cC00~WyK!k^u!o-gb4y@z9NtKXvl@YptwO+~~HjEIg z(v2Ii^dr}_mN@ip!cHNXOtBP(mZBszp*?A)rY;ze6!$=?g8UxTA%9HQ&HUY*&E$QTu&TELDG75GEVZ=ohxKGqAirh3h*YYQGUpbSm`ug zK75eR`_}7j!b^t^V!k}TWQeG4o-5gqp6w>ArKK|2GebWMgYTyb;uwJ28gM+Qb(8to zs9Qzz5d?Vrg-7xBU3c>m-f$W?cIGG#7!53eR2yVcA`0pG5-x0!U};T_+`yIELZ}bZ zIA(K2HkJ%Crb`O}k6d9P5IHK6RS2T!T-Q~sMG(4~^(3OtX(G{t(*_vPe=?v*Qhl!L z@I4Z}mavn2JGDj`i9{NXTjReCBku7tkhC+XH7Ziw2!K@9hT}NAxyY9@OeJSf-7)-SSpE{N!$&8a}-wYat|ug8CSELUdnkAlnk0BmJQ0-Ly8$kh*@c?5$i*0PRCZFpq3$#BwDBf8DGisg}MAv3XExm6nwSAu@vJeq#LXGZ$rM#l# z(y1Ivms z1jeRDux-P&Kp0~x8}NM>)3X;@&CutkxCxTZ zp5I{Il*1S3`of3nyGokb;rS?x((xM1W)KAzO5#8dZj{ME;AuEAAfA3_a?lP*@FYt> zzNY{o<(5ul*wAy_I!nxYqa2Wm&!g@5Jmws<2(tQ6yP-I<| z`zMu2gbFfukG4LIMxuIq2YGcWF8U3;lU_g1?g-QGNAy@J8KMEj`%`3(p0;OLY-rr;6OmnU$&Ye(_&SPD&TA!EUlx`hf(0~_s@B){m zk{h^axOKMv$0jZ?XeHRlot$F#FL~bTjT!@)z)k>@U^En4A&t6fy@G~Q=hp-_$E(Bh z9R3}5tRVp`BhP{;JDAsVfBint>e`B8UY6-`TVSO zE;~W-$`s@5vn$ zl(agLQ}VXVYzTuT8-d*M90nNu-EeAX)E#vV$v_Zr2pA2T7@nLM9Bbh;P^ndT@{nF# zt5qcL?2wvM<8!!PL$WEpK&@70kke#ncn#EDM;V_`5qbQX=O;jtINq`X9YSp{%nE#hJpBU04}aE zknWVZYHkClPt($=O3U%k2c8slRO9{M&>Y;|HA5QJ(71H!E;DHb#x za_N^UvF`^e?idUx0t!t4l8(?haf)rwaTFADO#eD=mE$kys5dI8)aKBr*O?m@Y621C z&~O~gmuFcAc9e9Vot+J{M#|L+UzZ#v^}3@bPoNkS8EICo&hc;M_v&agWQr9TtMpzX zmBPfu$xw&p*kwyjJc<>eRe>fJN$FHRizCO5N~Vu!v_Rmln{LB}@iDkgJ!EBkH6HOs z%u)HIKz&NaZCL35of|F-c^Z}rS{ z9a;gvA)G1fJ9;?uY)BTuz@0b06;C|>EKeX`(SQCTFthqr7pM(en0pndP53aA0Xlw0 zKz>6&tUPgT9T_Zvy9In#z^Me7KP^z1h>RiKwA7?Q`{u*n!1hhoH02kO8~MPi2UrcD zPOXtdR!hIOt)!HTj4S=Gq@(1clf)$I39)O+KVn%Qfi&v)d`7?^mb$TIAy|@8zzrQf zP0j`zS)S97aT79mnX^ZHW;6mMOrSd%tAbE_od3dnA!HdlRsp?=fQ_vq)T?Ee-V>epUrM zPlb@%30nQrYnUQ+_Nq$&k+g=1sfw^1E4P(CG) z$}9LK184X6DA~&p7HzY7T{zd$9{61wRlOv*5h3`sGlkdzH za#mU75mUgns9PNm#MCAz{8Io)A&|8Vl!%UVeb~al#j1XxQgj;K1F0Sq zD?!2UlxP|-wI&$E6!`CWGWcDFVn)mcsZa~$vQz~qdnL@tlQswSMVVI;AeG7BiG43% zq0&4MNjr&;zW>8GaQNjYvS?A$>`}a5ITp_~;8)B`MZx{{>mB{}x`8-m$h9;p3sh$X zF1`|AZa9E5ub7CyXfe3L;21x^%-l5cxk6Y(#Fy!C++~w96UgM!Ds<8bBinSf9z(@F z0NQYohX?H{mL5Jsm@&0Mgqa#)ew~tf9)mc5)2MT*5CPa!OKOt5Vv0hOp!T_A1J^^~ zxvalZcE$X{0;bAyxOj1t@BhW&5u6_%IZ?5s5>9!@`94c0UGs&qWPrb zq)~SzeWwiHIF-k=opM8au^@g~GtOnIkibqI(%s*WlV?tceX9?WuFLzD3+EdCwoy!)_WaFf(U zWdwX^sn0LWbJUuo(A@Yho6Al`q3--z1d(p1Q-=`CtBX5Wq6tNkSuVj12AWV=7o?NA zxNBtrIpJcyyny*ynd5dR=cX|^JB8V~SyakpcEY4g3%-#+DqTQ#p@B0I^A)=ykjZ9n zZuCNH)(60)vd&#NuMzy{z%x`0?!;%TV`LH$x)@Y#tG=pGPI zR9cisPluMUQP2JYjdxzN4xf0(HQ3mZM>ds0PriskGKGQ84lM61 zp}$l_Z$5`oI)ScS5_hccMwXl@P6J&Dfz@e?)eD341J{FJZ*W91WoV?*2`ntkhec2{ z5CN@9c*+T)@89Pet5z#;d^gnVrPr{*eNb;SP*;u`dXM6b7ZYiL4B10hXD9X@emM$a z(&qP-02wmwV+kCuR*Aqrar=outgmZ`(9EACjBJ7zUs(Q);K)M?( z+)&kd;#s+**CL3;7`N%D(Ceq!3N<)F8GS(zgaJW7q(TI-r6H7L1Y~8b=|NeMPvG{! zZe-RjN8jc(_`|ntLVwC&HG>R3*Ks+pJY!qPSvCrZBuc3?I=edY-ks}^Ph`-U&En%b z)}UYtWGQ%wutU$|xEwD`>O(%C!~E#w{6v zq~^qHRK$7^YuBvB-k0~YEfBk!ik& zRxRQ4q0F$Ra6ppEPd>LBrD6#Iv;{1ro=ZlR4;8%QDGyix;VW`pG>0HB4l~rT!!iIT z2uqcMP`qwCtnN-2#S#je*5Qvod@HstFS60-Gn?VT zWbmnM3Cgs%Fo~OQ+=v_3cTxTaPL~___zi23H#irYC$`0zpkx5b-{$jKOioQpjyv#C zsVp%6EFC)1up_p>S1X-nJiH*LY6Q{Wejve2oN~=;NdCBO6Zq)+K7rWRXiz7a<(WiIwUO> zV2M`_JY|%+K1)%}X7G0?E`yvfu7gA}f$@tI2-*-4)E^XAF~%jnoF*Z0B?e#oJWJ@u z#h;Wv{;@%<)QFbMWa@}|RWCS3c!~H@7ye5?=0iwT!jQT#>41|{V@TR5_-&Ir0#4Is zOPnIkwA57RphNgko!|gLlSDREV0xg7w8b19TCenU=p+ZQLq^9Dh^0FZw{2XB^qSQ$ zC^0pYhDc{&6*^#Kb5!XBnRFJnUb_ze#~<8P5l{G8CaE|0x)dl1EjeV-`rU$qC8(_<1L@h!*v>%pPfWNaU70|3K@bF zW1LQg3`IPePU_6^Ikhc8D%I@VTsVI1TCvoDlc!HaBM@UUj2Qc~*r<-TOX$bf{3L3{ zj|JjOsSyNVzeV`9*P@z?2}NyDM-w+}STY7U1by6=5WuN(CwY(}2_HLR`me8zydWZ= z!%PR$YPuioIFSaFQiB4e`EU$!od=>LY2dnBui+3#eOI(HR7wBLW?_^%NOZ#IOcNXL zylEqT<3qQ=rBG2XVE%Y`XcQAu^9-u@+`bL#1_$uSOQ&(?u1&aoAcKVOvIORoQ% zB!~b#-6hP<%%Wbaqf{uNv!h4l^7)(xc=g7WxOvM)low>tl(3ItIzGFi6&**v;(bR# zJ-d}LDwRq&90PIlI5v-uxCEHnRm4~A$5tz>EBH>k_K9|Cgi{AxM^_(-sIyVraSyzv|%&UwI0@a_`OP?5P$_q=v=Erb%1{ zXfe2jlE~WTh_#{;jCZ_NFurCGtJ%`RM$iOr)S{c0(=kR1gpYveOR~I;szRgR7Sb!` z2dq|vbVBqoPM$r%K|kdF^}M{^tVou#LgcyANuna|_#hoqRkGCe%oZ=XP$~%X&w-SH znx7uXrLgnY-is$6+l#M%^83hib)c)e1IF-0Ow7;Wg`r_~pcHZ$j?l}b5*Wy4v94Ia zTL)L-=H3q6)ZdL)stZ785xZYFj(cw3iq3ono7VIqY1{bE|MV#Si>^k>*OB2Wa2sc9&;^u4dOtn7~? ziQB3XwKC~hMi_7tNn4;v5efmTmKEPukysKuI&Ogi)-KLoj3l zL3ecOSPZPGEE(OA+R&rhTP6Z*T|bB^A2>1RhQ^{!#3UAiVk)S72Uc=^84h5!H{ z07*naRC>>TbS5oq@9x5#>sMpm^>N*;o4Mpv)v#d&9tKx*;{X1Wd+^+$vp7;~VB40J z*u1)m-ABi8X5MAV&voHQx>E9HcL|%XT7xH_d;uqiM^JY?UTKmYC7d5VFV&+k{=*3S z(hnI67oKlu-m$6Ntr|R)$t?>PzI5a;-hJ1*kxC}pf+Ic#alhcigr?KI}Txmbea55dz(Q1OMv>-ojC1M}|l7=erLm@0%yBVo*J=7`!I*mPO`b;m;TA5$$votsdtm$NeK+w&Gm1EX%ZsaTmS4Nu^ zo*Oxj>6wdCRj?$fZ`hH6r9%XvV=a^vGL@cw%Rnc5$3ey^V`ZLVZFQY9J<)tMkTHjX z{3!?itX#JenUsxdcWl9?u5NVJJ^a@nJc^rc-HEGi-hmgMK93|;V{CL3ljAcSG{0%^ zI%KjI&X?9=-SsAhjvm3qJqIv6Q^6Wxp=Q`9rV=dSkx9axv*0gOkWJaRaq}wNuz3~g zj*A1QMlpS63jXjo{3>O&P-cjYY_0&CYf{+w`0soOwkPo5_nu^RMwbQ9)M3=sG*M+~ zTi^7NO1AD(qQ{UEa4E@_${M7S7@wMyLI1+IG##POu}C_H6rCZ|{(mj)6I598O7{@C zVi2pyqn03d(t~|pXVb?zNlRKRp4sYie$Q{ATμ^_61SXCZm1Gb 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 z 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%0D(!L|O;l^!P*VlnS4D-`BJXbL_ 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 B Date: Sat, 22 Jan 2022 05:05:49 +0100 Subject: [PATCH 22/32] feat(boba): update contract address --- .../plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx | 3 --- packages/web3-constants/evm/ethereum.json | 2 +- packages/web3-constants/evm/explorer.json | 2 +- packages/web3-constants/evm/ito.json | 12 ++++++------ packages/web3-constants/evm/mask-box.json | 14 +++++++------- packages/web3-constants/evm/nft-red-packet.json | 16 ++++++++-------- packages/web3-constants/evm/red-packet.json | 12 ++++++------ 7 files changed, 29 insertions(+), 32 deletions(-) diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx index 6df320f0b190..70a4584ca26e 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/ClaimAllDialog.tsx @@ -236,9 +236,6 @@ export function ClaimAllDialog(props: ClaimAllDialogProps) { retry: retryAirdrop, } = useSpaceStationCampaignInfo(account, Flags.nft_airdrop_enabled) - const [chainId, setChainId] = useState( - SUPPORTED_CHAIN_ID_LIST.includes(currentChainId) ? currentChainId : ChainId.Mainnet, - ) const { value: swappedTokens, loading, retry } = useClaimAll(account) const { ITO2_CONTRACT_ADDRESS } = useITOConstants(chainId) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index acc7dbd53cb2..7ef190b36f09 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -47,7 +47,7 @@ "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", - "Boba": "0xAe5C53294003f72B27CEF476680979453193673d", + "Boba": "0xfb91c019D9F12A0f9c23B4762fa64A34F8daDb4A", "Boba_Rinkeby": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", "Fantom": "0xc119574d5fb333f5ac018658d4d8b5035e16bf39", diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index 5f950476e5a4..4f7eddaec9b1 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -32,7 +32,7 @@ "Arbitrum": "https://api.arbiscan.io/api", "Arbitrum_Rinkeby": "", "xDai": "https://blockscout.com/xdai/mainnet/api", - "Boba": "", + "Boba": "https://blockexplorer.boba.network/api", "Boba_Rinkeby": "", "Celo": "https://explorer.celo.org/api", "Fantom": "https://api.ftmscan.com/api", diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 30f65cb51b96..d75b58b87266 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -55,7 +55,7 @@ "Boba": "0x981be454a930479d92C91a0092D204b64845A5D6", "Boba_Rinkeby": "", "Celo": "0xaA5bfd7355637eA7405CB194a55303e821c4c569", - "Fantom": "", + "Fantom": "0x981be454a930479d92C91a0092D204b64845A5D6", "Aurora": "0x5de932BD252DD79231C9eDB5F2e30D488B785109", "Aurora_Testnet": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3" }, @@ -75,8 +75,8 @@ "Boba": 290600, "Boba_Rinkeby": 83114, "Celo": 10278776, - "Fantom": 0, - "Aurora": 0, + "Fantom": 25071597, + "Aurora": 57350598, "Aurora_Testnet": 77919102 }, "DEFAULT_QUALIFICATION_ADDRESS": { @@ -114,9 +114,9 @@ "xDai": "0x71834a3FDeA3E70F14a93ED85c6be70925D0CAd9", "Boba": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Boba_Rinkeby": "0xd60A384B01Ac271B68483441a06BA32b96a94ad8", - "Celo": "", - "Fantom": "", - "Aurora": "", + "Celo": "0x2cB220F925E603A04BEE05F210252120deBA29d7", + "Fantom": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", + "Aurora": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Aurora_Testnet": "" }, "SUBGRAPH_URL": { diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index 4463ef6a9f84..ea8e994215a2 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -41,7 +41,7 @@ }, "MASK_BOX_TEST_NFT": { "Mainnet": "0x56136E69A5771436a9598804c5eA792230c21181", - "Ropsten": "", + "Ropsten": "0x4c73F4DC55Ef094259570892F52717cF19c62283", "Rinkeby": "0x0c8FB5C985E00fb1D002b6B9700084492Fb4B9A8", "Kovan": "", "Gorli": "", @@ -54,17 +54,17 @@ "xDai": "", "Boba": "", "Boba_Rinkeby": "", - "Celo": "", - "Fantom": "", - "Aurora": "", + "Celo": "0x066804d9123bF2609Ed4A4a40b1177a9c5a9Ed51", + "Fantom": "0x05ee315E407C21a594f807D61d6CC11306D1F149", + "Aurora": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Aurora_Testnet": "" }, "WHITE_LIST_QUALIFICATION_CONTRACT_ADDRESS": { "Mainnet": "", - "Ropsten": "", + "Ropsten": "0x3011dF5b0Be18A56693cC062Cb61a160dca571C3", "Rinkeby": "0x996A9DCe6247cd8AaFA60de34cDD5332d9AdE702", "Kovan": "", - "Gorli": "", + "Gorli": "0xfE14631D3C2364171694EBcA05CAD08A54B2b07a", "BSC": "", "BSCT": "", "Matic": "", @@ -76,7 +76,7 @@ "Boba_Rinkeby": "", "Celo": "", "Fantom": "", - "Aurora": "", + "Aurora": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Aurora_Testnet": "" }, "SIG_VERIFY_QULIFICATION_CONTRACT_ADDRESS": { diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index d5a15e42e43a..b2d78e68cb2d 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -9,13 +9,13 @@ "BSCT": "", "Matic": "0xf6Dc042717EF4C097348bE00f4BaE688dcaDD4eA", "Mumbai": "", - "Arbitrum": "", + "Arbitrum": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", "Arbitrum_Rinkeby": "", - "xDai": "", + "xDai": "0x561c5f3a19871ecb1273D6D8eCc276BeEDa5c8b4", "Boba": "0xF9F7C1496c21bC0180f4B64daBE0754ebFc8A8c0", "Boba_Rinkeby": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3", - "Celo": "", - "Fantom": "", + "Celo": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", + "Fantom": "0xF9F7C1496c21bC0180f4B64daBE0754ebFc8A8c0", "Aurora": "0x05ee315E407C21a594f807D61d6CC11306D1F149", "Aurora_Testnet": "0x97369fEE7db34E0BfE47861f2ec44b4378d13eB4" }, @@ -29,13 +29,13 @@ "BSCT": "", "Matic": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-polygon", "Mumbai": "", - "Arbitrum": "", + "Arbitrum": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-arb-mainnet", "Arbitrum_Rinkeby": "", - "xDai": "", + "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-xdai-mainnet", "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-boba", "Boba_Rinkeby": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-boba-rinkeby", - "Celo": "", - "Fantom": "", + "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-celo-mainnet", + "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-fantom-mainnet", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-aurora", "Aurora_Testnet": "" } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index ba1dea5758a3..5065360d25be 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -74,8 +74,8 @@ "xDai": "0x54a0A221C25Fc0a347EC929cFC5db0be17fA2a2B", "Boba": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Boba_Rinkeby": "0xB4D669bc117735FdA44e90e52795132187705B21", - "Celo": "", - "Fantom": "", + "Celo": "0xab7b1be4233a04e5c43a810e75657eced8e5463b", + "Fantom": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Aurora": "0x19f179D7e0D7d9F9d5386afFF64271D98A91615B", "Aurora_Testnet": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC" }, @@ -94,8 +94,8 @@ "xDai": 18101937, "Boba": 284557, "Boba_Rinkeby": 87121, - "Celo": 0, - "Fantom": 0, + "Celo": 10413552, + "Fantom": 25112473, "Aurora": 57552338, "Aurora_Testnet": 77918765 }, @@ -114,8 +114,8 @@ "xDai": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-xdai", "Boba": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-boba", "Boba_Rinkeby": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-boba-rinkeby", - "Celo": "", - "Fantom": "", + "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-celo", + "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-fantom", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-aurora", "Aurora_Testnet": "" } From 2e6c51cfb51282b1cf386745e9072601eb9d18b8 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 27 Jan 2022 18:03:27 +0100 Subject: [PATCH 23/32] chore(boba): fixed review changes --- packages/web3-constants/evm/ethereum.json | 4 ++-- packages/web3-shared/evm/assets/chains.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 648f46d822b0..2ea05311b049 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -71,8 +71,8 @@ "Arbitrum": "0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB", "Arbitrum_Rinkeby": "0xa501c031958F579dB7676fF1CE78AD305794d579", "xDai": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", - "Boba": "0xfb91c019D9F12A0f9c23B4762fa64A34F8daDb4A", - "Boba_Rinkeby": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC", + "Boba": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", + "Boba_Rinkeby": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", "Avalanche_Fuji": "", "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index b82cc669bb18..1aa0eee981c9 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -337,7 +337,7 @@ }, { "name": "Boba Network", - "chain": "BOBA", + "chain": "Boba", "network": "mainnet", "rpc": ["https://mainnet.boba.network/"], "faucets": [], @@ -362,7 +362,7 @@ }, { "name": "Boba Network Rinkeby", - "chain": "BOBA", + "chain": "Boba", "network": "testnet", "rpc": ["https://rinkeby.boba.network/"], "faucets": [], From 6dad08a1067ef8e3ea19c710ad52102da6fbb76e Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 27 Jan 2022 21:34:45 +0100 Subject: [PATCH 24/32] chore(boba): support boba network --- packages/mask/src/plugins/ITO/base.ts | 1 + packages/mask/src/plugins/UnlockProtocol/constants.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/mask/src/plugins/ITO/base.ts b/packages/mask/src/plugins/ITO/base.ts index f2c7a9e8b218..8e6239ac2bcb 100644 --- a/packages/mask/src/plugins/ITO/base.ts +++ b/packages/mask/src/plugins/ITO/base.ts @@ -23,6 +23,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Arbitrum, ChainId.xDai, ChainId.Avalanche, + ChainId.Boba, ], }, }, diff --git a/packages/mask/src/plugins/UnlockProtocol/constants.ts b/packages/mask/src/plugins/UnlockProtocol/constants.ts index 8abca0e1cbc7..fb2d845d9322 100644 --- a/packages/mask/src/plugins/UnlockProtocol/constants.ts +++ b/packages/mask/src/plugins/UnlockProtocol/constants.ts @@ -14,6 +14,7 @@ export const graphEndpointKeyVal = { [ChainId.Matic]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/polygon', [ChainId.Boba]: 'https://api.thegraph.com/subgraphs/name/unlock-protocol/boba', [ChainId.Avalanche]: '', + [ChainId.Boba]: '', } export const keyServerEndpoint = 'https://unlock.r2d2.to/' From 2d8a4ef2db1b8b64fc14933d66548a4a81ae2e25 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 9 Feb 2022 14:42:50 +0100 Subject: [PATCH 25/32] chore(boba): fixed trader plugin and debank api --- .../src/plugins/Trader/apis/trader/index.ts | 8 +++- .../plugins/Trader/constants/swapperchan.ts | 4 +- .../src/plugins/Wallet/apis/debank.ts | 2 +- packages/web3-constants/evm/ethereum.json | 37 ------------------- packages/web3-constants/evm/trader.json | 4 +- 5 files changed, 12 insertions(+), 43 deletions(-) diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index da23bf9064ea..49ef5b362675 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -49,7 +49,13 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Fantom: return [TradeProvider.SUSHISWAP] case NetworkType.Boba: - return [TradeProvider.OOLONGSWAP, TradeProvider.DODO, TradeProvider.SWAPPERCHAN, TradeProvider.SENPAISWAP] + return [ + TradeProvider.OPENOCEAN, + TradeProvider.DODO, + TradeProvider.OOLONGSWAP, + TradeProvider.SWAPPERCHAN, + TradeProvider.SENPAISWAP, + ] case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Fuse: diff --git a/packages/mask/src/plugins/Trader/constants/swapperchan.ts b/packages/mask/src/plugins/Trader/constants/swapperchan.ts index 8c373790485c..d0b444686238 100644 --- a/packages/mask/src/plugins/Trader/constants/swapperchan.ts +++ b/packages/mask/src/plugins/Trader/constants/swapperchan.ts @@ -1,5 +1,5 @@ import { ChainId } from '@masknet/web3-shared-evm' -import { USDC, USDT, WBTC, WNATIVE, OLO, BOBA, WNATIVE_ONLY } from './trader' +import { USDC, USDT, WBTC, WNATIVE, WAIFU, BOBA, WNATIVE_ONLY } from './trader' import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' /** @@ -10,5 +10,5 @@ export const SWAPPERCHAN_CUSTOM_BASES: ERC20TokenCustomizedBase = {} export const SWAPPERCHAN_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, - [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC, OLO, BOBA].map((x) => x[ChainId.Boba]), + [ChainId.Boba]: [WNATIVE, USDC, USDT, WBTC, WAIFU, BOBA].map((x) => x[ChainId.Boba]), } diff --git a/packages/maskbook/src/plugins/Wallet/apis/debank.ts b/packages/maskbook/src/plugins/Wallet/apis/debank.ts index 5d109b1c2f77..58c6c8f434fd 100644 --- a/packages/maskbook/src/plugins/Wallet/apis/debank.ts +++ b/packages/maskbook/src/plugins/Wallet/apis/debank.ts @@ -20,7 +20,7 @@ const chainIdMap: Record = { [ChainId.xDai]: 'xdai', [ChainId.Matic]: 'matic', [ChainId.Arbitrum]: 'arb', - [ChainId.Boba]: 'bob', + [ChainId.Boba]: 'boba', } const getDebankChain = (chainId: ChainId) => { diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 2ea05311b049..110954999966 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -1,41 +1,4 @@ { - "ERC20_TOKEN_LISTS": { - "Mainnet": [ - "https://api.1inch.exchange/v3.0/1/tokens", - "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/1/tokens.json" - ], - "Ropsten": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/3/tokens.json"], - "Rinkeby": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/4/tokens.json"], - "Kovan": ["https://irhonin.github.io/kovan-token-list/kovan-token-list.json"], - "Gorli": [], - "BSC": [ - "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/56/tokens.json", - "https://api.1inch.exchange/v3.0/56/tokens" - ], - "BSCT": ["https://dimensiondev.github.io/Mask-Token-List/mask.json"], - "Matic": [ - "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/137/tokens.json", - "https://api.1inch.exchange/v3.0/137/tokens" - ], - "Mumbai": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/80001/tokens.json"], - "Arbitrum": [ - "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/42161/tokens.json" - ], - "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"], - "Boba": ["https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/288/tokens.json"], - "Boba_Rinkeby": [ - "https://raw.githubusercontent.com/DimensionDev/Mask-Token-List/gh-pages/latest/28/tokens.json" - ], - "Avalanche": [], - "Avalanche_Fuji": [], - "Celo": [], - "Fantom": [], - "Aurora": [], - "Aurora_Testnet": [] - }, "BALANCE_CHECKER_ADDRESS": { "Mainnet": "0xb1F8e55c7f64D203C1400B9D8555d050F94aDF39", "Ropsten": "0xD5C432dFbDEcB6068583BC5241D1b308D70721a4", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index e3b23800b92e..624ec589e93c 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -628,7 +628,7 @@ "Arbitrum": "", "Arbitrum_Rinkeby": "", "xDai": "", - "Boba": "", + "Boba": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "Boba_Rinkeby": "", "Avalanche": "", "Avalanche_Fuji": "", @@ -650,7 +650,7 @@ "Arbitrum": "0xA867241cDC8d3b0C07C85cC06F25a0cD3b5474d8", "Arbitrum_Rinkeby": "", "xDai": "", - "Boba": "", + "Boba": "0x55793C2c8A796cCE00EF2D1a86CCA2E0399BF285", "Boba_Rinkeby": "", "Avalanche": "", "Avalanche_Fuji": "", From abedde3559f0d9139e5bab75b8915314ebb3022a Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 9 Feb 2022 16:25:57 +0100 Subject: [PATCH 26/32] feat(boba): enable OoolongSwap, SwapperChan and SenpaiSwap --- .../Trader/trader/useAllTradeComputed.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index 085da9903ab5..eec8c5365ae9 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -247,6 +247,42 @@ export function useAllTradeComputed( const wannaswap = useUniswapTradeComputed(wannaswap_.value, inputToken, outputToken) const wannaSwapEstimateGas = useUniswapTradeGasLimit(wannaswap, TradeProvider.WANNASWAP) + // OolongSwap + const oolongswap_ = useUniswapV2Trade( + TradeProvider.OOLONGSWAP, + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.OOLONGSWAP) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.OOLONGSWAP) ? outputToken : undefined, + ) + const oolongswap = useUniswapTradeComputed(oolongswap_.value, inputToken, outputToken) + const oolongswapEstimateGas = useUniswapTradeGasLimit(oolongswap, TradeProvider.OOLONGSWAP) + + // SwapperChan + const swapperchan_ = useUniswapV2Trade( + TradeProvider.SWAPPERCHAN, + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.SWAPPERCHAN) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.SWAPPERCHAN) ? outputToken : undefined, + ) + const swapperchan = useUniswapTradeComputed(swapperchan_.value, inputToken, outputToken) + const swapperchanEstimateGas = useUniswapTradeGasLimit(swapperchan, TradeProvider.SWAPPERCHAN) + + // SenpaiSwap + const senpaiswap_ = useUniswapV2Trade( + TradeProvider.SENPAISWAP, + TradeStrategy.ExactIn, + inputAmount_, + '0', + tradeProviders.some((x) => x === TradeProvider.SENPAISWAP) ? inputToken : undefined, + tradeProviders.some((x) => x === TradeProvider.SENPAISWAP) ? outputToken : undefined, + ) + const senpaiswap = useUniswapTradeComputed(senpaiswap_.value, inputToken, outputToken) + const senpaiswapEstimateGas = useUniswapTradeGasLimit(senpaiswap, TradeProvider.SENPAISWAP) + const allTradeResult = [ { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, @@ -263,6 +299,9 @@ 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.OOLONGSWAP, ...oolongswap_, value: oolongswap, gas: oolongswapEstimateGas }, + { provider: TradeProvider.SWAPPERCHAN, ...swapperchan_, value: swapperchan, gas: swapperchanEstimateGas }, + { provider: TradeProvider.SENPAISWAP, ...senpaiswap_, value: senpaiswap, gas: senpaiswapEstimateGas }, ] return nativeToken_.value From 90ba4260365b34a0808b59612ed111991d55f4fc Mon Sep 17 00:00:00 2001 From: unclebill Date: Thu, 10 Feb 2022 11:01:11 +0800 Subject: [PATCH 27/32] fixup! feat(boba): enable OoolongSwap, SwapperChan and SenpaiSwap --- packages/web3-shared/evm/assets/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index fc7e0b0fa323..33945cdc6473 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -349,7 +349,7 @@ "logoURI": "https://raw.githubusercontent.com/sushiswap/icons/master/token/eth.jpg" }, "infoURL": "https://boba.network", - "shortName": "eth", + "shortName": "boba", "chainId": 288, "networkId": 288, "explorers": [ From ec5abefffddd1c058c6e277ef34afe166a712f23 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 10 Feb 2022 05:52:03 +0100 Subject: [PATCH 28/32] chore(boba): change BalanceChecker Address --- packages/mask/src/plugins/Trader/constants/openocean.ts | 1 - packages/web3-constants/evm/ethereum.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index c201cef801ae..e5e33273e605 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -13,7 +13,6 @@ export const networkNames: Record = { [NetworkType.Boba]: 'boba', [NetworkType.Avalanche]: 'avalanche', [NetworkType.Aurora]: 'aurora', - [NetworkType.Boba]: '', [NetworkType.Fuse]: '', [NetworkType.Metis]: '', [NetworkType.Optimistic]: '', diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index 110954999966..6b5ad12c68de 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -12,7 +12,7 @@ "Arbitrum": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Arbitrum_Rinkeby": "0xF98dC9391273c5ab9fa2c980A8d4F875ece802db", "xDai": "0x96c7D011cdFD467f551605f0f5Fce279F86F4186", - "Boba": "0xfb91c019D9F12A0f9c23B4762fa64A34F8daDb4A", + "Boba": "0xAe5C53294003f72B27CEF476680979453193673d", "Boba_Rinkeby": "0x2690906609A9AF3bF08B8384CD9A0F97A88A7E9c", "Avalanche": "0xC119574D5Fb333F5AC018658D4d8b5035E16bf39", "Avalanche_Fuji": "", From 6eecb9e512b31e423115fdfa4f7ab7dbdef7455f Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 10 Feb 2022 15:32:28 +0100 Subject: [PATCH 29/32] feat(boba): add interact with eth_sendRawTransaction for boba network --- packages/mask/package.json | 3 +- .../Trader/trader/uniswap/useTradeCallback.ts | 104 ++++++++++++++---- .../hooks/useNativeTokenTransferCallback.ts | 83 ++++++++++++-- packages/web3-shared/evm/package.json | 3 +- pnpm-lock.yaml | 29 +++-- 5 files changed, 181 insertions(+), 41 deletions(-) diff --git a/packages/mask/package.json b/packages/mask/package.json index 7e41746e9210..765491b89420 100644 --- a/packages/mask/package.json +++ b/packages/mask/package.json @@ -123,7 +123,8 @@ "web3-utils": "1.5.2", "webextension-polyfill": "^0.8.0", "z-schema": "^5.0.2", - "zod": "3.11.6" + "zod": "3.11.6", + "@ethereumjs/tx": "3.5.0" }, "devDependencies": { "@dimensiondev/webextension-shim": "0.0.3-20210823035705-4257e12", diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index 6a8a82e07e7d..f33d809f7fd0 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -7,6 +7,7 @@ import type { SwapCall, Trade, TradeComputed } from '../../types' import { swapErrorToUserReadableMessage } from '../../helpers' import type { TradeProvider } from '@masknet/public-api' import { TargetChainIdContext } from '../useTargetChainIdContext' +import { FeeMarketEIP1559Transaction } from '@ethereumjs/tx' interface FailedCall { parameters: SwapParameters @@ -122,29 +123,42 @@ export function useTradeCallback( bestCallOption = firstNoErrorCall } - return new Promise(async (resolve, reject) => { - if (!bestCallOption) { - setTradeState({ - type: TransactionStateType.FAILED, - error: new Error('Bad call options.'), - }) - return - } + // check if boba network + if (targetChainId === 288) { + return new Promise(async (resolve, reject) => { + if (!bestCallOption) { + setTradeState({ + type: TransactionStateType.FAILED, + error: new Error('Bad call options.'), + }) + return + } - const { - call: { address, calldata, value }, - } = bestCallOption + const { + call: { address, calldata, value }, + } = bestCallOption - web3.eth.sendTransaction( - { + const rawTx = { from: account, to: address, data: calldata, - ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed() } : {}), + ...('gasEstimate' in bestCallOption + ? { + gas: bestCallOption.gasEstimate.toFixed(), + gasPrice: bestCallOption.gasEstimate.toFixed(), + maxFeePerGas: bestCallOption.gasEstimate.toFixed(), + maxPriorityFeePerGas: 1, + } + : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }), ...gasConfig, - }, - async (error, hash) => { + } + + const tx = FeeMarketEIP1559Transaction.fromTxData(rawTx) + + const serializedTx = tx.serialize() + + web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), async (error, hash) => { if (error) { if ((error as any)?.code) { const error_ = new Error( @@ -170,9 +184,61 @@ export function useTradeCallback( }) resolve(hash) } - }, - ) - }) + }) + }) + } else { + return new Promise(async (resolve, reject) => { + if (!bestCallOption) { + setTradeState({ + type: TransactionStateType.FAILED, + error: new Error('Bad call options.'), + }) + return + } + + const { + call: { address, calldata, value }, + } = bestCallOption + + web3.eth.sendTransaction( + { + from: account, + to: address, + data: calldata, + ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed() } : {}), + ...(!value || /^0x0*$/.test(value) ? {} : { value }), + ...gasConfig, + }, + async (error, hash) => { + if (error) { + if ((error as any)?.code) { + const error_ = new Error( + (error as any)?.message === 'Unable to add more requests.' + ? 'Unable to add more requests.' + : 'Transaction rejected.', + ) + setTradeState({ + type: TransactionStateType.FAILED, + error: error_, + }) + reject(error_) + } else { + setTradeState({ + type: TransactionStateType.FAILED, + error: new Error(`Swap failed: ${swapErrorToUserReadableMessage(error)}`), + }) + } + } else { + setTradeState({ + type: TransactionStateType.HASH, + hash: hash, + }) + resolve(hash) + } + }, + ) + }) + } }, [web3, account, tradeParameters, gasConfig]) const resetCallback = useCallback(() => { diff --git a/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts b/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts index c2e6e3c6ece7..0157f0540d14 100644 --- a/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts +++ b/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts @@ -7,6 +7,7 @@ import { useTransactionState } from './useTransactionState' import { useWeb3 } from './useWeb3' import { isGreaterThan, isZero } from '@masknet/web3-shared-base' import { TransactionStateType, GasConfig } from '../types' +import { FeeMarketEIP1559Transaction } from '@ethereumjs/tx' export function useNativeTransferCallback() { const web3 = useWeb3() @@ -71,24 +72,84 @@ export function useNativeTransferCallback() { ...gasConfig, } - // send transaction and wait for hash - return new Promise((resolve, reject) => { - web3.eth.sendTransaction(config, (error, hash) => { - if (error) { + const configBoba = { + from: account, + to: recipient, + gas: await web3.eth + .estimateGas({ + from: account, + to: recipient, + value: amount, + data: memo ? toHex(memo) : undefined, + }) + .catch((error) => { setTransferState({ type: TransactionStateType.FAILED, error, }) - reject(error) - } else { + throw error + }), + value: amount, + data: memo ? toHex(memo) : undefined, + maxFeePerGas: await web3.eth + .estimateGas({ + from: account, + to: recipient, + value: amount, + data: memo ? toHex(memo) : undefined, + }) + .catch((error) => { setTransferState({ - type: TransactionStateType.HASH, - hash, + type: TransactionStateType.FAILED, + error, }) - resolve(hash) - } + throw error + }), + maxPriorityFeePerGas: 1, + } + + // check if boba network + if (chainId === 288) { + const tx = FeeMarketEIP1559Transaction.fromTxData(configBoba) + const serializedTx = tx.serialize() + // send transaction and wait for hash on boba network + return new Promise((resolve, reject) => { + web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), (error, hash) => { + if (error) { + setTransferState({ + type: TransactionStateType.FAILED, + error, + }) + reject(error) + } else { + setTransferState({ + type: TransactionStateType.HASH, + hash, + }) + resolve(hash) + } + }) }) - }) + } else { + // send transaction and wait for hash + return new Promise((resolve, reject) => { + web3.eth.sendTransaction(config, (error, hash) => { + if (error) { + setTransferState({ + type: TransactionStateType.FAILED, + error, + }) + reject(error) + } else { + setTransferState({ + type: TransactionStateType.HASH, + hash, + }) + resolve(hash) + } + }) + }) + } }, [web3, account, chainId], ) diff --git a/packages/web3-shared/evm/package.json b/packages/web3-shared/evm/package.json index 48dfd1d9dedc..ecf8614a57b3 100644 --- a/packages/web3-shared/evm/package.json +++ b/packages/web3-shared/evm/package.json @@ -25,7 +25,8 @@ "wallet.ts": "^1.0.1", "web3": "1.5.2", "web3-core-helpers": "1.5.2", - "web3-utils": "1.5.2" + "web3-utils": "1.5.2", + "@ethereumjs/tx": "3.5.0" }, "devDependencies": { "@types/use-subscription": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92663eed3ce5..eb37ebf55303 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -285,6 +285,7 @@ importers: '@dimensiondev/mask-wallet-core': 0.1.0-20211013082857-eb62e5f '@dimensiondev/metamask-extension-provider': 3.0.6-20210519045409-1835d4d '@dimensiondev/webextension-shim': 0.0.3-20210823035705-4257e12 + '@ethereumjs/tx': 3.5.0 '@ethersproject/abi': ^5.4.0 '@ethersproject/address': ^5.0.4 '@ethersproject/providers': ^5.0.9 @@ -421,6 +422,7 @@ importers: '@dimensiondev/holoflows-kit': 0.9.0-20210902104757-7c3d0d0_webextension-polyfill@0.8.0 '@dimensiondev/mask-wallet-core': 0.1.0-20211013082857-eb62e5f_protobufjs@6.11.2 '@dimensiondev/metamask-extension-provider': 3.0.6-20210519045409-1835d4d + '@ethereumjs/tx': 3.5.0 '@ethersproject/abi': 5.4.0 '@ethersproject/address': 5.4.0 '@ethersproject/providers': 5.4.2 @@ -1102,6 +1104,7 @@ importers: packages/web3-shared/evm: specifiers: '@ensdomains/address-encoder': ^0.2.6 + '@ethereumjs/tx': 3.5.0 '@masknet/shared-base': workspace:* '@masknet/web3-constants': workspace:* '@masknet/web3-contracts': workspace:* @@ -1125,6 +1128,7 @@ importers: web3-utils: 1.5.2 dependencies: '@ensdomains/address-encoder': 0.2.6 + '@ethereumjs/tx': 3.5.0 '@masknet/shared-base': link:../../shared-base '@masknet/web3-constants': link:../../web3-constants '@masknet/web3-contracts': link:../../web3-contracts @@ -3770,11 +3774,18 @@ packages: crc-32: 1.2.0 ethereumjs-util: 7.1.0 - /@ethereumjs/tx/3.3.0: - resolution: {integrity: sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==} + /@ethereumjs/common/2.6.2: + resolution: {integrity: sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ==} dependencies: - '@ethereumjs/common': 2.4.0 - ethereumjs-util: 7.1.3 + crc-32: 1.2.0 + ethereumjs-util: 7.1.4 + dev: false + + /@ethereumjs/tx/3.5.0: + resolution: {integrity: sha512-/+ZNbnJhQhXC83Xuvy6I9k4jT5sXiV0tMR9C+AzSSpcCV64+NB8dTE1m3x98RYMqb8+TLYWA+HML4F5lfXTlJw==} + dependencies: + '@ethereumjs/common': 2.6.2 + ethereumjs-util: 7.1.4 dev: false /@ethersproject/abi/5.0.7: @@ -13780,8 +13791,8 @@ packages: ethjs-util: 0.1.6 rlp: 2.2.7 - /ethereumjs-util/7.1.3: - resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} + /ethereumjs-util/7.1.4: + resolution: {integrity: sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==} engines: {node: '>=10.0.0'} dependencies: '@types/bn.js': 5.1.0 @@ -24122,11 +24133,11 @@ packages: resolution: {integrity: sha512-F8mtzxgEhxfLc66vPi0Gqd6mpscvvk7Ua575bsJ1p9J2X/VtuKgDgpWcU4e4LKeROQ+ouCpAG9//0j9jQuij3A==} engines: {node: '>=8.0.0'} dependencies: - '@ethereumjs/common': 2.4.0 - '@ethereumjs/tx': 3.3.0 + '@ethereumjs/common': 2.6.2 + '@ethereumjs/tx': 3.5.0 crypto-browserify: 3.12.0 eth-lib: 0.2.8 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.4 scrypt-js: 3.0.1 uuid: 3.3.2 web3-core: 1.5.2 From 0508e41e052c81712ef6f38e89bc7442ba30d541 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 10 Feb 2022 21:49:16 +0100 Subject: [PATCH 30/32] feat(boba): add rollup_gasPrices --- .../mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts | 2 -- packages/web3-shared/evm/types/index.ts | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index f33d809f7fd0..30dd17ce795f 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -145,13 +145,11 @@ export function useTradeCallback( ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed(), - gasPrice: bestCallOption.gasEstimate.toFixed(), maxFeePerGas: bestCallOption.gasEstimate.toFixed(), maxPriorityFeePerGas: 1, } : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }), - ...gasConfig, } const tx = FeeMarketEIP1559Transaction.fromTxData(rawTx) diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index e6c7645db498..bd20e542b8bd 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -367,6 +367,9 @@ export enum EthereumMethodType { MASK_REPLACE_TRANSACTION = 'mask_replaceTransaction', MASK_LOGIN_FORTMATIC = 'mask_loginFortmatic', MASK_LOGOUT_FORTMATIC = 'mask_logoutFortmatic', + + // only for boba, optimistic + ROLLUP_GAS_PRICES = 'rollup_gasPrices', } export enum EthereumErrorType { From fccba270ddbc56a3618500c976eacadf2041cf9f Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 10 Feb 2022 22:32:38 +0100 Subject: [PATCH 31/32] chore(boba): add signedTransaction --- .../src/plugins/Trader/trader/uniswap/useTradeCallback.ts | 8 ++++---- .../evm/hooks/useNativeTokenTransferCallback.ts | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index 30dd17ce795f..4add72c0a2f2 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -145,18 +145,18 @@ export function useTradeCallback( ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed(), - maxFeePerGas: bestCallOption.gasEstimate.toFixed(), - maxPriorityFeePerGas: 1, + maxFeePerGas: '1.5', + maxPriorityFeePerGas: '1.5', } : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }), } const tx = FeeMarketEIP1559Transaction.fromTxData(rawTx) - const serializedTx = tx.serialize() + const signedTransaction = await web3.eth.sign('0x' + serializedTx.toString('hex'), account) - web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), async (error, hash) => { + web3.eth.sendSignedTransaction(signedTransaction, async (error, hash) => { if (error) { if ((error as any)?.code) { const error_ = new Error( diff --git a/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts b/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts index 0157f0540d14..11d775e3140e 100644 --- a/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts +++ b/packages/web3-shared/evm/hooks/useNativeTokenTransferCallback.ts @@ -105,16 +105,17 @@ export function useNativeTransferCallback() { }) throw error }), - maxPriorityFeePerGas: 1, + maxPriorityFeePerGas: '1.5', } // check if boba network if (chainId === 288) { const tx = FeeMarketEIP1559Transaction.fromTxData(configBoba) const serializedTx = tx.serialize() + const signedTransaction = await web3.eth.sign('0x' + serializedTx.toString('hex'), account) // send transaction and wait for hash on boba network return new Promise((resolve, reject) => { - web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), (error, hash) => { + web3.eth.sendSignedTransaction(signedTransaction, (error, hash) => { if (error) { setTransferState({ type: TransactionStateType.FAILED, From fd74d7a2dd771fbfe6d267e87525f8f150d0c42e Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 21 Mar 2022 06:36:57 +0000 Subject: [PATCH 32/32] chore(boba): need rewritter web3.eth.sendSignedTransaction --- .../plugins/Trader/constants/jugglerred.ts | 13 ++++++++++++ .../Trader/trader/uniswap/useTradeCallback.ts | 21 +++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/jugglerred.ts 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..9ce8633e4f9e --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/jugglerred.ts @@ -0,0 +1,13 @@ +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.Optimistic]: [WNATIVE, DAI, USDC, USDT, WBTC].map((x) => x[ChainId.Optimistic]), +} diff --git a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts index 4add72c0a2f2..363201413dc2 100644 --- a/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/uniswap/useTradeCallback.ts @@ -1,11 +1,18 @@ import { useCallback, useState } from 'react' import BigNumber from 'bignumber.js' import type { SwapParameters } from '@uniswap/v2-sdk' -import { GasOptionConfig, TransactionState, TransactionStateType, useAccount, useWeb3 } from '@masknet/web3-shared-evm' +import { + GasOptionConfig, + TransactionState, + TransactionStateType, + useAccount, + useWeb3, + ChainId, +} from '@masknet/web3-shared-evm' import { useSwapParameters as useTradeParameters } from './useTradeParameters' import type { SwapCall, Trade, TradeComputed } from '../../types' import { swapErrorToUserReadableMessage } from '../../helpers' -import type { TradeProvider } from '@masknet/public-api' +import { TradeProvider } from '@masknet/public-api' import { TargetChainIdContext } from '../useTargetChainIdContext' import { FeeMarketEIP1559Transaction } from '@ethereumjs/tx' @@ -28,6 +35,8 @@ interface FailedCall extends SwapCallEstimate { error: Error } +const SUPPORTED_OPTMISTIC_CHAIN_ID_LIST = [ChainId.Optimistic, ChainId.Boba, ChainId.Metis] + export function useTradeCallback( trade: TradeComputed | null, tradeProvider?: TradeProvider, @@ -123,8 +132,8 @@ export function useTradeCallback( bestCallOption = firstNoErrorCall } - // check if boba network - if (targetChainId === 288) { + // check if optimistic network + if (SUPPORTED_OPTMISTIC_CHAIN_ID_LIST && !!TradeProvider.OPENOCEAN && !!TradeProvider.DODO) { return new Promise(async (resolve, reject) => { if (!bestCallOption) { setTradeState({ @@ -145,8 +154,8 @@ export function useTradeCallback( ...('gasEstimate' in bestCallOption ? { gas: bestCallOption.gasEstimate.toFixed(), - maxFeePerGas: '1.5', - maxPriorityFeePerGas: '1.5', + maxFeePerGas: gasConfig?.maxFeePerGas, + maxPriorityFeePerGas: gasConfig?.maxPriorityFeePerGas, } : {}), ...(!value || /^0x0*$/.test(value) ? {} : { value }),