From f2100ed2bd4ffac37733a10761f01e1a7484072a Mon Sep 17 00:00:00 2001 From: Nguyen Van Viet Date: Fri, 28 Jul 2023 14:04:19 +0700 Subject: [PATCH] feat: add new chain supported: Linea (#2117) * feat: add new chain supported: Linea * disable pools on Linea * revert env * fix: comment --- package.json | 4 +- .../Header/web3/NetworkModal/Networks.tsx | 2 +- src/constants/bases.ts | 5 ++ src/constants/index.ts | 2 +- src/constants/networks.ts | 5 +- src/constants/networks/index.ts | 1 + src/constants/networks/linea.ts | 73 +++++++++++++++++++ src/constants/tokens.ts | 27 ++++++- src/pages/App.tsx | 34 ++++++++- src/state/about/hooks.ts | 18 ++--- yarn.lock | 8 +- 11 files changed, 151 insertions(+), 28 deletions(-) create mode 100644 src/constants/networks/linea.ts diff --git a/package.json b/package.json index 7ff6a103a5..8ac6a94b36 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@kybernetwork/oauth2": "1.0.0", "@kyberswap/ks-sdk-classic": "^1.0.3", - "@kyberswap/ks-sdk-core": "1.0.7-rc2", + "@kyberswap/ks-sdk-core": "1.0.8", "@kyberswap/ks-sdk-elastic": "^1.1.2", "@kyberswap/ks-sdk-solana": "^1.0.2", "@lingui/loader": "~3.14.0", @@ -199,7 +199,7 @@ "vite-tsconfig-paths": "^4.0.8" }, "resolutions": { - "@kyberswap/ks-sdk-core": "1.0.7-rc2", + "@kyberswap/ks-sdk-core": "1.0.8", "react-error-overlay": "6.0.9", "@lingui/babel-plugin-extract-messages": "3.14.0", "@lingui/cli": "3.14.0", diff --git a/src/components/Header/web3/NetworkModal/Networks.tsx b/src/components/Header/web3/NetworkModal/Networks.tsx index 69e2057eb8..baedfd0f46 100644 --- a/src/components/Header/web3/NetworkModal/Networks.tsx +++ b/src/components/Header/web3/NetworkModal/Networks.tsx @@ -197,7 +197,7 @@ const Networks = ({ {name} - {key === ChainId.ZKSYNC && ( + {key === ChainId.LINEA && ( New diff --git a/src/constants/bases.ts b/src/constants/bases.ts index 6b9bb07042..90e577560f 100644 --- a/src/constants/bases.ts +++ b/src/constants/bases.ts @@ -28,6 +28,7 @@ const WETH_ONLY: ChainTokenList = { [ChainId.ZKSYNC]: [WETH[ChainId.ZKSYNC]], [ChainId.SOLANA]: [WETH[ChainId.SOLANA]], [ChainId.LINEA_TESTNET]: [WETH[ChainId.LINEA_TESTNET]], + [ChainId.LINEA]: [WETH[ChainId.LINEA]], [ChainId.SOLANA_DEVNET]: [WETH[ChainId.SOLANA_DEVNET]], } @@ -183,4 +184,8 @@ export const SUGGESTED_BASES: ChainTokenList = { USDT[ChainId.LINEA_TESTNET], DAI[ChainId.LINEA_TESTNET], ], + [ChainId.LINEA]: [ + ...WETH_ONLY[ChainId.LINEA], + new Token(ChainId.LINEA, '0x7d43aabc515c356145049227cee54b608342c0ad', 18, 'BUSD', 'BUSD'), + ], } diff --git a/src/constants/index.ts b/src/constants/index.ts index d5b001251f..7fac3ed420 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -337,7 +337,7 @@ export const CHAINS_SUPPORT_CROSS_CHAIN = ChainId.SOLANA, ] -export const TYPE_AND_SWAP_NOT_SUPPORTED_CHAINS: ChainId[] = [ChainId.ZKSYNC, ChainId.LINEA_TESTNET] +export const TYPE_AND_SWAP_NOT_SUPPORTED_CHAINS: ChainId[] = [ChainId.ZKSYNC, ChainId.LINEA_TESTNET, ChainId.LINEA] export const SWAP_FEE_RECEIVER_ADDRESS = '0x4f82e73EDb06d29Ff62C91EC8f5Ff06571bdeb29' diff --git a/src/constants/networks.ts b/src/constants/networks.ts index 1a44747bc4..b7c8da1862 100644 --- a/src/constants/networks.ts +++ b/src/constants/networks.ts @@ -14,6 +14,7 @@ import { ethereum, fantom, görli, + linea, lineaTestnet, matic, mumbai, @@ -50,6 +51,7 @@ export const NETWORKS_INFO_CONFIG: NETWORKS_INFO_CONFIG_TYPE = { [ChainId.OPTIMISM]: optimism, [ChainId.ZKSYNC]: zksync, [ChainId.LINEA_TESTNET]: lineaTestnet, + [ChainId.LINEA]: linea, [ChainId.SOLANA]: solana, [ChainId.SOLANA_DEVNET]: solanaDevnet, } as const @@ -80,8 +82,7 @@ export const MAINNET_NETWORKS = [ ChainId.VELAS, ChainId.AURORA, ChainId.ZKSYNC, - // TODO(viet-nv): update when integrating LINEA MAINNET - ChainId.LINEA_TESTNET, + ChainId.LINEA, ] as const export const EVM_NETWORKS = SUPPORTED_NETWORKS.filter(chainId => getChainType(chainId) === ChainType.EVM) as Exclude< diff --git a/src/constants/networks/index.ts b/src/constants/networks/index.ts index 7ac823d62d..352f7387a7 100644 --- a/src/constants/networks/index.ts +++ b/src/constants/networks/index.ts @@ -17,4 +17,5 @@ export { default as solana } from './solana' export { default as velas } from './velas' export { default as zksync } from './zksync' export { default as lineaTestnet } from './linea-testnet' +export { default as linea } from './linea' export { default as solanaDevnet } from './solana-devnet' diff --git a/src/constants/networks/linea.ts b/src/constants/networks/linea.ts new file mode 100644 index 0000000000..8b3f1cf19e --- /dev/null +++ b/src/constants/networks/linea.ts @@ -0,0 +1,73 @@ +import { ChainId } from '@kyberswap/ks-sdk-core' + +import EthereumLogo from 'assets/images/ethereum-logo.png' +import { KS_SETTING_API } from 'constants/env' +import { EVMNetworkInfo } from 'constants/networks/type' + +const EMPTY = '' +const EMPTY_ARRAY: any[] = [] +const NOT_SUPPORT = null + +const lineaInfo: EVMNetworkInfo = { + chainId: ChainId.LINEA, + route: 'linea', + ksSettingRoute: 'linea', + priceRoute: 'linea', + poolFarmRoute: 'linea', + aggregatorRoute: 'linea', + name: 'Linea', + icon: 'https://linea.build/apple-touch-icon.png', + iconDark: NOT_SUPPORT, + iconSelected: NOT_SUPPORT, + iconDarkSelected: NOT_SUPPORT, + defaultBlockSubgraph: '', // TODO + etherscanUrl: 'https://lineascan.build', + etherscanName: 'Linea Explorer', + tokenListUrl: `${KS_SETTING_API}/v1/tokens?chainIds=${ChainId.LINEA}&isWhitelisted=${true}`, + bridgeURL: EMPTY, + nativeToken: { + symbol: 'ETH', + name: 'LineaETH', + logo: EthereumLogo, + decimal: 18, + minForGas: 10 ** 16, + }, + defaultRpcUrl: 'https://rpc.linea.build', + multicall: '0xcA11bde05977b3631167028862bE2a173976CA11', + classic: { + defaultSubgraph: '', // TODO + static: { + zap: '', + router: '', + factory: '', + }, + oldStatic: NOT_SUPPORT, + dynamic: NOT_SUPPORT, + claimReward: NOT_SUPPORT, + fairlaunch: EMPTY_ARRAY, + fairlaunchV2: EMPTY_ARRAY, + }, + elastic: { + defaultSubgraph: '', // TODO + startBlock: 1769, + coreFactory: '0xC7a590291e07B9fe9E64b86c58fD8fC764308C4A', + nonfungiblePositionManager: '0xe222fBE074A436145b255442D919E4E3A6c6a480', + tickReader: '0x8Fd8Cb948965d9305999D767A02bf79833EADbB3', + initCodeHash: '0x00e263aaa3a2c06a89b53217a9e7aad7e15613490a72e0f95f303c4de2dc7045', + quoter: '0x4d47fd5a29904Dae0Ef51b1c450C9750F15D7856', + routers: '0xF9c2b5746c946EF883ab2660BbbB1f10A5bdeAb4', + farms: [], + }, + limitOrder: { + production: NOT_SUPPORT, + development: NOT_SUPPORT, + }, + averageBlockTimeInSeconds: 2, // TODO: check these info + coingeckoNetworkId: NOT_SUPPORT, + coingeckoNativeTokenId: NOT_SUPPORT, + deBankSlug: EMPTY, + dexToCompare: NOT_SUPPORT, + geckoTermialId: NOT_SUPPORT, +} + +export default lineaInfo diff --git a/src/constants/tokens.ts b/src/constants/tokens.ts index 3af4c91827..70561933f4 100644 --- a/src/constants/tokens.ts +++ b/src/constants/tokens.ts @@ -133,6 +133,9 @@ export const STABLE_COINS_ADDRESS: { [chainId in ChainId]: string[] } = { '0x8741Ba6225A6BF91f9D73531A98A89807857a2B3', // DAI '0x7d43AABC515C356145049227CeE54B608342c0ad', // BUSD ], + [ChainId.LINEA]: [ + '0x7d43aabc515c356145049227cee54b608342c0ad', // BUSD + ], [ChainId.SOLANA]: [ 'EjmyN6qEC1Tf1JxiG1ae7UTJhUxSwk1TCWNWqxWV4J6o', // Dai 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // usdc @@ -187,6 +190,7 @@ export const STABLE_COIN_ADDRESSES_TO_TAKE_FEE: Record = { [ChainId.BSCMAINNET]: [], [ChainId.ARBITRUM]: [], [ChainId.LINEA_TESTNET]: [], + [ChainId.LINEA]: [], [ChainId.SOLANA_DEVNET]: [], } @@ -285,6 +289,7 @@ export const SUPER_STABLE_COINS_ADDRESS: { [chainId in ChainId]: string[] } = { [ChainId.BSCTESTNET]: [], [ChainId.AVAXTESTNET]: [], [ChainId.LINEA_TESTNET]: [], + [ChainId.LINEA]: [], [ChainId.SOLANA_DEVNET]: [], } @@ -334,6 +339,7 @@ export const CORRELATED_COINS_ADDRESS: { [chainId in ChainId]: string[][] } = { [ChainId.BSCTESTNET]: [], [ChainId.AVAXTESTNET]: [], [ChainId.LINEA_TESTNET]: [], + [ChainId.LINEA]: [], [ChainId.SOLANA_DEVNET]: [], } @@ -418,6 +424,10 @@ export const DAI: { [chainId in ChainId]: Token } = { 'DAI', 'Dai', ), + + //not existing + [ChainId.LINEA]: new Token(ChainId.LINEA, '0x8741Ba6225A6BF91f9D73531A98A89807857a2B3', 18, 'DAI', 'Dai'), + //not existing on Velas [ChainId.VELAS]: new Token(ChainId.VELAS, '0xe7dC549AE8DB61BDE71F22097BEcc8dB542cA100', 18, 'DAI', 'Dai Stablecoin'), //not existing on Oasis @@ -509,6 +519,9 @@ export const USDC: { [chainId in ChainId]: Token } = { 'USDC', 'USD Coin', ), + + // not existing + [ChainId.LINEA]: new Token(ChainId.LINEA, '0xf56dc6695cF1f5c364eDEbC7Dc7077ac9B586068', 6, 'USDC', 'USD Coin'), } export const USDT: { [chainId in ChainId]: Token } = { @@ -564,6 +577,7 @@ export const USDT: { [chainId in ChainId]: Token } = { 'USDT', 'Tether USD', ), + [ChainId.LINEA_TESTNET]: new Token( ChainId.LINEA_TESTNET, '0x1990BC6dfe2ef605Bfc08f5A23564dB75642Ad73', @@ -571,6 +585,10 @@ export const USDT: { [chainId in ChainId]: Token } = { 'USDT', 'Tether USD', ), + + // not existing + [ChainId.LINEA]: new Token(ChainId.LINEA, '0x1990BC6dfe2ef605Bfc08f5A23564dB75642Ad73', 6, 'USDT', 'Tether USD'), + [ChainId.ZKSYNC]: new Token(ChainId.ZKSYNC, '0x493257fd37edb34451f62edf8d2a0c418852ba4c', 6, 'USDT', 'Tether USD'), [ChainId.SOLANA]: new Token(ChainId.SOLANA, 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', 6, 'USDT', 'Tether USD'), [ChainId.SOLANA_DEVNET]: new Token( @@ -687,14 +705,16 @@ export const KNC: { [chainId in ChainId]: Token } = { 'Kyber Network Crystal', ), - // TODO(viet-nv): + // not existing [ChainId.LINEA_TESTNET]: new Token( ChainId.LINEA_TESTNET, '0x6Cb9750a92643382e020eA9a170AbB83Df05F30B', 6, - 'USDT', - 'Tether USD', + 'KNC', + 'KNC', ), + // not existing + [ChainId.LINEA]: new Token(ChainId.LINEA, '0x6Cb9750a92643382e020eA9a170AbB83Df05F30B', 6, 'KNC', 'KNC'), } export const PINNED_PAIRS: { readonly [chainId in ChainId]?: [Token, Token][] } = { @@ -725,6 +745,7 @@ export const DEFAULT_OUTPUT_TOKEN_BY_CHAIN: Partial> = { [ChainId.GÖRLI]: KNC[ChainId.GÖRLI], [ChainId.ZKSYNC]: USDC[ChainId.ZKSYNC], [ChainId.LINEA_TESTNET]: USDC[ChainId.LINEA_TESTNET], + [ChainId.LINEA]: new Token(ChainId.LINEA, '0x7d43aabc515c356145049227cee54b608342c0ad', 18, 'BUSD', 'BUSD'), } export const DEFAULT_SWAP_FEE_STABLE_PAIRS = 4 diff --git a/src/pages/App.tsx b/src/pages/App.tsx index 2aa6c33bf5..3477844850 100644 --- a/src/pages/App.tsx +++ b/src/pages/App.tsx @@ -5,7 +5,7 @@ import * as Sentry from '@sentry/react' import { Suspense, lazy, useEffect } from 'react' import { isMobile } from 'react-device-detect' import { AlertTriangle } from 'react-feather' -import { Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom' +import { Navigate, Route, Routes, useLocation, useNavigate, useParams } from 'react-router-dom' import { useNetwork, usePrevious } from 'react-use' import { Flex, Text } from 'rebass' import styled from 'styled-components' @@ -14,6 +14,7 @@ import snow from 'assets/images/snow.png' import Popups from 'components/Announcement/Popups' import TopBanner from 'components/Announcement/Popups/TopBanner' import AppHaveUpdate from 'components/AppHaveUpdate' +import { ButtonPrimary } from 'components/Button' import ModalConfirm from 'components/ConfirmModal' import ErrorBoundary from 'components/ErrorBoundary' import Footer from 'components/Footer/Footer' @@ -45,6 +46,22 @@ import ElasticLegacyNotice from './ElasticLegacy/ElasticLegacyNotice' import Icons from './Icons' import VerifyAuth from './Verify/VerifyAuth' +// THIS IS ONLY TEMPORARY, WILL REMOVE IN NEXT VERSION +const CommingSoonModal = () => { + const navigate = useNavigate() + return ( + navigate('/')}> + + Our pools and farms will be available soon! + + navigate('/')}> + Ok + + + + ) +} + // test page for swap only through elastic const ElasticSwap = lazy(() => import('./ElasticSwap')) const SwapV2 = lazy(() => import('./SwapV2')) @@ -331,19 +348,28 @@ export default function App() { <> {/* Pools Routes */} } /> - } /> + : } + /> <> {/* Farms Routes */} } /> - } /> + : } + /> <> {/* My Pools Routes */} } /> - } /> + : } + /> <> diff --git a/src/state/about/hooks.ts b/src/state/about/hooks.ts index 8fd83d3a85..8f3274a843 100644 --- a/src/state/about/hooks.ts +++ b/src/state/about/hooks.ts @@ -53,9 +53,7 @@ export function useGlobalData() { } const getResultByChainIds = async (chainIds: readonly ChainId[]) => { // todo namgold: add aggregator API for solana - const elasticChains = chainIds - .filter(id => isEVM(id)) - .filter(id => !ELASTIC_NOT_SUPPORTED[id] && id !== ChainId.LINEA_TESTNET) + const elasticChains = chainIds.filter(id => isEVM(id)).filter(id => !ELASTIC_NOT_SUPPORTED[id]) const elasticPromises = elasticChains.map(chain => allKyberswapConfig[chain].elasticClient.query({ @@ -72,14 +70,12 @@ export function useGlobalData() { return total + parseFloat(item?.data?.factories?.[0]?.totalValueLockedUSD || '0') }, 0) - const allChainPromises = chainIds - .filter(id => isEVM(id) && id !== ChainId.LINEA_TESTNET) - .map(chain => - allKyberswapConfig[chain].classicClient.query({ - query: GLOBAL_DATA(), - fetchPolicy: 'cache-first', - }), - ) + const allChainPromises = chainIds.filter(isEVM).map(chain => + allKyberswapConfig[chain].classicClient.query({ + query: GLOBAL_DATA(), + fetchPolicy: 'cache-first', + }), + ) const queryResult = (await Promise.all(allChainPromises.map(promises => promises.catch(e => e)))).filter( res => !(res instanceof Error), diff --git a/yarn.lock b/yarn.lock index 9349def944..078f7e665b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2068,10 +2068,10 @@ tiny-warning "^1.0.3" toformat "^2.0.0" -"@kyberswap/ks-sdk-core@1.0.7-rc2", "@kyberswap/ks-sdk-core@^1.0.5": - version "1.0.7-rc2" - resolved "https://registry.yarnpkg.com/@kyberswap/ks-sdk-core/-/ks-sdk-core-1.0.7-rc2.tgz#ab707a43625bdd6b7416ad0482c94d2a25e9560a" - integrity sha512-CaWbLr7+3AXLHsF3AxMTapjvAo/AisRZQghtY664mzEk6otYfXeeizcgV3o/gML7/rW3YPdUFM4iifwHcXlOqQ== +"@kyberswap/ks-sdk-core@1.0.8", "@kyberswap/ks-sdk-core@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@kyberswap/ks-sdk-core/-/ks-sdk-core-1.0.8.tgz#11dbcbc7fd2d1243e221c5e7436be2b7735ee108" + integrity sha512-mbOr9oLcEmtKWdyXKio4pUWRBX0qkFHOrNmSet81MsXMCgIz59hMFqlZ7KSNL8j8iOJOR79j7s8deOUtghQsKA== dependencies: "@ethersproject/address" "^5.0.2" "@solana/web3.js" "^1.66.2"