diff --git a/.vscode/settings.json b/.vscode/settings.json index 2953d23077806..40a84841da864 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,6 +12,7 @@ "LINEA", "Merkl", "multicall", + "OPBNB", "pancakeswap", "vecake", "wagmi", diff --git a/apis/farms/.dev.vars b/apis/farms/.dev.vars index 7422e827c308c..ee55e0aab52be 100644 --- a/apis/farms/.dev.vars +++ b/apis/farms/.dev.vars @@ -7,3 +7,5 @@ ZKSYNC_NODE=https://mainnet.era.zksync.io ARBITRUM_ONE_NODE=https://arb1.arbitrum.io/rpc LINEA_NODE=https://rpc.linea.build BASE_NODE=https://mainnet.base.org +OPBNB_NODE=https://opbnb-mainnet-rpc.bnbchain.org +OPBNB_TESTNET_NODE=https://opbnb-testnet-rpc.bnbchain.org diff --git a/apis/farms/src/bindings.d.ts b/apis/farms/src/bindings.d.ts index b6455bfd425ea..67ecaaf631841 100644 --- a/apis/farms/src/bindings.d.ts +++ b/apis/farms/src/bindings.d.ts @@ -13,4 +13,6 @@ declare global { const ARBITRUM_ONE_NODE: string const LINEA_NODE: string const BASE_NODE: string + const OPBNB_NODE: string + const OPBNB_TESTNET_NODE: string } diff --git a/apis/farms/src/provider.ts b/apis/farms/src/provider.ts index d0ebedcc5c4f4..b1687fa272883 100644 --- a/apis/farms/src/provider.ts +++ b/apis/farms/src/provider.ts @@ -1,6 +1,17 @@ import { ChainId } from '@pancakeswap/chains' -import { createPublicClient, http, PublicClient } from 'viem' -import { bsc, bscTestnet, goerli, mainnet, zkSyncTestnet, polygonZkEvm, zkSync, arbitrum } from 'viem/chains' +import { Chain, createPublicClient, http, PublicClient } from 'viem' +import { + arbitrum, + bsc, + bscTestnet, + goerli, + mainnet, + opBNB, + opBNBTestnet, + polygonZkEvm, + zkSync, + zkSyncTestnet, +} from 'viem/chains' const requireCheck = [ ETH_NODE, @@ -12,6 +23,8 @@ const requireCheck = [ ARBITRUM_ONE_NODE, LINEA_NODE, BASE_NODE, + OPBNB_NODE, + OPBNB_TESTNET_NODE, ] const base = { @@ -150,7 +163,7 @@ const goerliClient = createPublicClient({ }) const zksyncTestnetClient = createPublicClient({ - chain: zkSyncTestnet, + chain: zkSyncTestnet as Chain, transport: http(), batch: { multicall: { @@ -182,7 +195,7 @@ const polygonZkEvmClient = createPublicClient({ }) const zksyncClient = createPublicClient({ - chain: zkSync, + chain: zkSync as Chain, transport: http(ZKSYNC_NODE), batch: { multicall: { @@ -229,6 +242,28 @@ const baseClient = createPublicClient({ pollingInterval: 6_000, }) +const opBNBClient = createPublicClient({ + chain: opBNB, + transport: http(OPBNB_NODE), + batch: { + multicall: { + batchSize: 1024 * 200, + wait: 16, + }, + }, +}) + +const opBNBTestnetClient = createPublicClient({ + chain: opBNBTestnet, + transport: http(OPBNB_TESTNET_NODE), + batch: { + multicall: { + batchSize: 1024 * 200, + wait: 16, + }, + }, +}) + export const viemProviders = ({ chainId }: { chainId?: ChainId }): PublicClient => { switch (chainId) { case ChainId.ETHEREUM: @@ -251,6 +286,10 @@ export const viemProviders = ({ chainId }: { chainId?: ChainId }): PublicClient return lineaClient case ChainId.BASE: return baseClient + case ChainId.OPBNB: + return opBNBClient + case ChainId.OPBNB_TESTNET: + return opBNBTestnetClient default: return bscClient } diff --git a/apis/farms/src/v3.ts b/apis/farms/src/v3.ts index 4c977a597086c..a0341676f5482 100644 --- a/apis/farms/src/v3.ts +++ b/apis/farms/src/v3.ts @@ -1,70 +1,40 @@ /* eslint-disable no-param-reassign, no-await-in-loop */ -import { masterChefV3Addresses, FarmV3SupportedChainId } from '@pancakeswap/farms' +import { ChainId, V3_SUBGRAPHS } from '@pancakeswap/chains' +import { FarmV3SupportedChainId, masterChefV3Addresses } from '@pancakeswap/farms' import { ERC20Token } from '@pancakeswap/sdk' -import { ChainId } from '@pancakeswap/chains' import { CurrencyAmount } from '@pancakeswap/swap-sdk-core' import { PositionMath } from '@pancakeswap/v3-sdk' -import { gql, GraphQLClient } from 'graphql-request' +import { GraphQLClient, gql } from 'graphql-request' import { Request } from 'itty-router' import { error, json } from 'itty-router-extras' -import { z } from 'zod' import { Address } from 'viem' +import { z } from 'zod' -import { viemProviders } from './provider' import { FarmKV } from './kv' +import { viemProviders } from './provider' -export const V3_SUBGRAPH_CLIENTS = { - [ChainId.ETHEREUM]: new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-eth', { - fetch, - }), - [ChainId.GOERLI]: new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-goerli', { - fetch, - }), - [ChainId.BSC]: new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc', { fetch }), - [ChainId.BSC_TESTNET]: new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-chapel', { - fetch, - }), - [ChainId.ZKSYNC_TESTNET]: new GraphQLClient( - 'https://api.studio.thegraph.com/query/45376/exchange-v3-zksync-testnet/version/latest', - { - fetch, - }, - ), - [ChainId.POLYGON_ZKEVM]: new GraphQLClient( - 'https://api.studio.thegraph.com/query/45376/exchange-v3-polygon-zkevm/version/latest', - { - fetch, - }, - ), - [ChainId.ZKSYNC]: new GraphQLClient('https://api.studio.thegraph.com/query/45376/exchange-v3-zksync/version/latest', { - fetch, - }), - [ChainId.ARBITRUM_ONE]: new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-arb', { - fetch, - }), - [ChainId.LINEA]: new GraphQLClient('https://graph-query.linea.build/subgraphs/name/pancakeswap/exchange-v3-linea', { - fetch, - }), - [ChainId.BASE]: new GraphQLClient('https://api.studio.thegraph.com/query/45376/exchange-v3-base/version/latest', { - fetch, - }), -} satisfies Record< - Exclude, - GraphQLClient -> - -const zChainId = z.enum([ - String(ChainId.BSC), - String(ChainId.ETHEREUM), - String(ChainId.GOERLI), - String(ChainId.BSC_TESTNET), - String(ChainId.ZKSYNC_TESTNET), - String(ChainId.POLYGON_ZKEVM), - String(ChainId.ZKSYNC), - String(ChainId.ARBITRUM_ONE), - String(ChainId.LINEA), - String(ChainId.BASE), -]) +export const V3_SUBGRAPH_CLIENTS_CHAIN_IDS = [ + ChainId.ETHEREUM, + ChainId.GOERLI, + ChainId.BSC, + ChainId.BSC_TESTNET, + ChainId.ZKSYNC_TESTNET, + ChainId.POLYGON_ZKEVM, + ChainId.ZKSYNC, + ChainId.ARBITRUM_ONE, + ChainId.LINEA, + ChainId.BASE, + ChainId.OPBNB, +] as const + +type SupportChainId = (typeof V3_SUBGRAPH_CLIENTS_CHAIN_IDS)[number] + +export const V3_SUBGRAPH_CLIENTS = V3_SUBGRAPH_CLIENTS_CHAIN_IDS.reduce((acc, chainId) => { + acc[chainId] = new GraphQLClient(V3_SUBGRAPHS[chainId], { fetch }) + return acc +}, {} as Record, GraphQLClient>) + +const zChainId = z.enum(V3_SUBGRAPH_CLIENTS_CHAIN_IDS.map((chainId) => String(chainId)) as [string, ...string[]]) const zAddress = z.string().regex(/^0x[a-fA-F0-9]{40}$/) @@ -176,10 +146,7 @@ const handler_ = async (req: Request, event: FetchEvent) => { } const { chainId: chainIdString, address: address_ } = parsed.data - const chainId = Number(chainIdString) as Exclude< - FarmV3SupportedChainId, - ChainId.POLYGON_ZKEVM_TESTNET | ChainId.OPBNB_TESTNET - > + const chainId = Number(chainIdString) as SupportChainId const address = address_.toLowerCase() diff --git a/apps/web/src/components/TokenImage/index.tsx b/apps/web/src/components/TokenImage/index.tsx index 1ff364697c320..956c17b0dce53 100644 --- a/apps/web/src/components/TokenImage/index.tsx +++ b/apps/web/src/components/TokenImage/index.tsx @@ -1,11 +1,11 @@ +import { ChainId } from '@pancakeswap/chains' +import { Token } from '@pancakeswap/sdk' import { + ImageProps, + TokenImage as UIKitTokenImage, TokenPairImage as UIKitTokenPairImage, TokenPairImageProps as UIKitTokenPairImageProps, - TokenImage as UIKitTokenImage, - ImageProps, } from '@pancakeswap/uikit' -import { Token } from '@pancakeswap/sdk' -import { ChainId } from '@pancakeswap/chains' interface TokenPairImageProps extends Omit { primaryToken: Token @@ -20,6 +20,7 @@ export const tokenImageChainNameMapping = { [ChainId.ARBITRUM_ONE]: 'arbitrum/', [ChainId.LINEA]: 'linea/', [ChainId.BASE]: 'base/', + [ChainId.OPBNB]: 'opbnb/', } const getImageUrlFromToken = (token: Token) => { diff --git a/apps/web/src/config/constants/tokenLists/pancake-default.tokenlist.json b/apps/web/src/config/constants/tokenLists/pancake-default.tokenlist.json index cdb11edc332f4..cc94a6abe2c6e 100644 --- a/apps/web/src/config/constants/tokenLists/pancake-default.tokenlist.json +++ b/apps/web/src/config/constants/tokenLists/pancake-default.tokenlist.json @@ -465,6 +465,14 @@ "chainId": 5611, "decimals": 18, "logoURI": "https://tokens.pancakeswap.finance/images/symbol/usdt.png" + }, + { + "name": "PancakeSwap Token", + "symbol": "CAKE", + "address": "0x2779106e4F4A8A28d77A24c18283651a2AE22D1C", + "chainId": 204, + "decimals": 18, + "logoURI": "https://tokens.pancakeswap.finance/images/symbol/cake.png" } ] } diff --git a/apps/web/src/views/TradingReward/config/pairs/index.tsx b/apps/web/src/views/TradingReward/config/pairs/index.tsx index 2df7addf14949..fd09108e56bd4 100644 --- a/apps/web/src/views/TradingReward/config/pairs/index.tsx +++ b/apps/web/src/views/TradingReward/config/pairs/index.tsx @@ -1,15 +1,16 @@ import { ChainId } from '@pancakeswap/chains' -import { ComputedFarmConfigV3, FarmV3SupportedChainId } from '@pancakeswap/farms/src' -import { farmsV3 as ethFarm } from '@pancakeswap/farms/constants/eth' -import { farmsV3 as farm5 } from '@pancakeswap/farms/constants/goerli' +import { farmsV3 as arbitrumFarm } from '@pancakeswap/farms/constants/arb' +import { farmsV3 as baseFarm } from '@pancakeswap/farms/constants/base' import { farmsV3 as bscFarm } from '@pancakeswap/farms/constants/bsc' import { farmsV3 as farm97 } from '@pancakeswap/farms/constants/bscTestnet' +import { farmsV3 as ethFarm } from '@pancakeswap/farms/constants/eth' +import { farmsV3 as farm5 } from '@pancakeswap/farms/constants/goerli' +import { farmsV3 as lineaFarm } from '@pancakeswap/farms/constants/linea' +import { farmsV3 as opBNBFarms } from '@pancakeswap/farms/constants/opBNB' +import { farmsV3 as opBNBTestnetFarms } from '@pancakeswap/farms/constants/opBnbTestnet' import { farmsV3 as zkEvmFarm } from '@pancakeswap/farms/constants/polygonZkEVM' import { farmsV3 as zkSyncFarm } from '@pancakeswap/farms/constants/zkSync' -import { farmsV3 as lineaFarm } from '@pancakeswap/farms/constants/linea' -import { farmsV3 as arbitrumFarm } from '@pancakeswap/farms/constants/arb' -import { farmsV3 as baseFarm } from '@pancakeswap/farms/constants/base' -import { farmsV3 as opBnbTestnetFarms } from '@pancakeswap/farms/constants/opBnbTestnet' +import { ComputedFarmConfigV3, FarmV3SupportedChainId } from '@pancakeswap/farms/src' import { tradingRewardV3Pair as tradingRewardV3Pair56 } from './56' export const tradingRewardPairConfigChainMap: Record = { @@ -24,5 +25,6 @@ export const tradingRewardPairConfigChainMap: Record = [ChainId.LINEA]: {}, [ChainId.BASE]: {}, [ChainId.OPBNB_TESTNET]: {}, + [ChainId.OPBNB]: {}, } diff --git a/packages/farms/constants/opBNB.ts b/packages/farms/constants/opBNB.ts new file mode 100644 index 0000000000000..d46dc3f1fd7db --- /dev/null +++ b/packages/farms/constants/opBNB.ts @@ -0,0 +1,14 @@ +import { opBnbTokens } from '@pancakeswap/tokens' +import { FeeAmount } from '@pancakeswap/v3-sdk' + +import { defineFarmV3Configs } from '../src/defineFarmV3Configs' + +export const farmsV3 = defineFarmV3Configs([ + { + pid: 1, + lpAddress: '0xc4f981189558682F15F60513158B699354B30204', + token0: opBnbTokens.wbnb, + token1: opBnbTokens.usdt, + feeAmount: FeeAmount.LOW, + }, +]) diff --git a/packages/farms/constants/v3/index.ts b/packages/farms/constants/v3/index.ts index 2979ae1ff6fb8..6817f69ef9452 100644 --- a/packages/farms/constants/v3/index.ts +++ b/packages/farms/constants/v3/index.ts @@ -9,6 +9,7 @@ import { farmsV3 as bscTestnetFarms } from '../bscTestnet' import { farmsV3 as ethFarms } from '../eth' import { farmsV3 as goerliFarms } from '../goerli' import { farmsV3 as lineaFarms } from '../linea' +import { farmsV3 as opBNBFarms } from '../opBNB' import { farmsV3 as opBnbTestnetFarms } from '../opBnbTestnet' import { farmsV3 as polygonZkEVMFarms } from '../polygonZkEVM' import { farmsV3 as polygonZkEVMTestnetFarms } from '../polygonZkEVMTestnet' @@ -28,6 +29,7 @@ export const farmsV3ConfigChainMap: Record diff --git a/packages/multicall/src/constants/gasLimit.ts b/packages/multicall/src/constants/gasLimit.ts index b808f645eaf09..44a810e93f854 100644 --- a/packages/multicall/src/constants/gasLimit.ts +++ b/packages/multicall/src/constants/gasLimit.ts @@ -7,6 +7,8 @@ export const DEFAULT_GAS_LIMIT_BY_CHAIN: { [key in ChainId]?: bigint } = { [ChainId.ZKSYNC]: 500000000n, [ChainId.POLYGON_ZKEVM]: 1500000n, [ChainId.BASE]: 60000000n, + [ChainId.OPBNB]: 100_000_000n, + [ChainId.OPBNB_TESTNET]: 100_000_000n, } export const DEFAULT_GAS_BUFFER = 3000000n diff --git a/packages/tokens/src/common.ts b/packages/tokens/src/common.ts index 1dabda1321b6e..beb1d2556f944 100644 --- a/packages/tokens/src/common.ts +++ b/packages/tokens/src/common.ts @@ -1,5 +1,5 @@ -import { ERC20Token } from '@pancakeswap/sdk' import { ChainId } from '@pancakeswap/chains' +import { ERC20Token } from '@pancakeswap/sdk' export const CAKE_MAINNET = new ERC20Token( ChainId.BSC, @@ -220,6 +220,22 @@ export const CAKE = { 'PancakeSwap Token', 'https://pancakeswap.finance/', ), + [ChainId.OPBNB]: new ERC20Token( + ChainId.OPBNB, + '0x2779106e4F4A8A28d77A24c18283651a2AE22D1C', + 18, + 'CAKE', + 'PancakeSwap Token', + 'https://pancakeswap.finance/', + ), + [ChainId.OPBNB_TESTNET]: new ERC20Token( + ChainId.OPBNB_TESTNET, + '0xa11B290B038C35711eB309268a2460754f730921', + 18, + 'CAKE', + 'PancakeSwap Token', + 'https://pancakeswap.finance/', + ), } export const USDC = {