diff --git a/package.json b/package.json index e1de02f4..ca913ac6 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,6 @@ "workspaces": [ "packages/*" ], - "resolutions": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0" - }, "license": "GPL-3.0-or-later", "devDependencies": { "@commitlint/cli": "^20.1.0", @@ -43,4 +37,4 @@ "semantic-release": "24.2.0", "semantic-release-monorepo": "^8.0.2" } -} +} \ No newline at end of file diff --git a/packages/doc/package.json b/packages/doc/package.json index 10c4fcee..68d6c969 100644 --- a/packages/doc/package.json +++ b/packages/doc/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@babel/runtime": "^7.17.0", - "@dodoex/components": "^3.0.2", + "@dodoex/components": "^3.3.0", "@emotion/styled": "^11.10.0", "@storybook/addon-docs": "^9.1.10", "@web3modal/ethers5": "^3.5.5", @@ -43,4 +43,4 @@ "eslint-plugin-storybook": "9.1.10", "@storybook/addon-docs": "^9.1.10" } -} +} \ No newline at end of file diff --git a/packages/doc/src/stories/widgets/Pool.stories.tsx b/packages/doc/src/stories/widgets/Pool.stories.tsx index a38288ad..56f385f5 100644 --- a/packages/doc/src/stories/widgets/Pool.stories.tsx +++ b/packages/doc/src/stories/widgets/Pool.stories.tsx @@ -84,7 +84,7 @@ Primary.args = { supportAMMV3: true, supportChainIds: [ 1, 42161, 137, 56, 10, 43114, 1313161554, 1030, 8453, 59144, 534352, 169, - 5000, 200901, 48900, 196, 543210, 177, 43111, 988, 421614, 53457, + 5000, 200901, 48900, 196, 543210, 177, 43111, 988, 421614, 53457, 173 ], // onlyChainId: 688689, showSubmissionSubmittedDialog: true, diff --git a/packages/dodoex-api/package.json b/packages/dodoex-api/package.json index c8728d95..ccb6a374 100644 --- a/packages/dodoex-api/package.json +++ b/packages/dodoex-api/package.json @@ -1,6 +1,6 @@ { "name": "@dodoex/api", - "version": "3.5.0", + "version": "3.7.0", "description": "DODO API Kit", "source": "src/index.ts", "types": "dist/types/index.d.ts", @@ -21,7 +21,7 @@ "release": "semantic-release", "release:local": "np --any-branch --no-cleanup --no-tests", "release.npm-publish": "npm publish --access public", - "release.npm-publish-beta": "npm publish --tag beta" + "release.npm-publish-beta": "yarn run prerelease && npm publish --tag beta" }, "author": "", "publishConfig": { @@ -103,4 +103,4 @@ "ts-jest": "^29.0.1", "typescript": "^5.6.3" } -} +} \ No newline at end of file diff --git a/packages/dodoex-api/src/chainConfig/basicToken.ts b/packages/dodoex-api/src/chainConfig/basicToken.ts index 1c07f9f0..66522e91 100644 --- a/packages/dodoex-api/src/chainConfig/basicToken.ts +++ b/packages/dodoex-api/src/chainConfig/basicToken.ts @@ -219,4 +219,12 @@ export const basicTokenMap: { wrappedTokenSymbol: 'USDT0', wrappedTokenAddress: '0x779Ded0c9e1022225f8E0630b35a9b54bE713736', }, + [ChainId.ENI]: { + ...DEFAULT_BASIC_TOKEN, + symbol: 'EGAS', + name: 'EGAS', + showDecimals: 6, + wrappedTokenSymbol: 'WEGAS', + wrappedTokenAddress: '0x6D1e851446F4D004AE2A72F9AfEd85e8829A205E', + }, }; diff --git a/packages/dodoex-api/src/chainConfig/chain.ts b/packages/dodoex-api/src/chainConfig/chain.ts index 462b2d79..7a1890ad 100644 --- a/packages/dodoex-api/src/chainConfig/chain.ts +++ b/packages/dodoex-api/src/chainConfig/chain.ts @@ -64,4 +64,6 @@ export enum ChainId { STABLE_TESTNET = 2201, STABLE = 988, + + ENI = 173, } diff --git a/packages/dodoex-api/src/chainConfig/contractConfig.ts b/packages/dodoex-api/src/chainConfig/contractConfig.ts index a3883646..d05f8433 100644 --- a/packages/dodoex-api/src/chainConfig/contractConfig.ts +++ b/packages/dodoex-api/src/chainConfig/contractConfig.ts @@ -16,6 +16,7 @@ import { pharosAtlanticTestnet, stableTestnet, stable, + eni } from '@dodoex/dodo-contract-request'; import { ChainId } from './chain'; @@ -543,6 +544,20 @@ const contractMap: { DODO_DPP_PROXY: stable.DODODppProxy, DODO_MINEV3_PROXY: stable.DODOMineV3Proxy, }, + [ChainId.ENI]: { + MULTI_CALL: eni.MulticallWithValid, + DODO_APPROVE: eni.DODOApprove, + ERC20_HELPER: eni.ERC20Helper, + + ROUTE_V2_DATA_FETCH: eni.DODOV2RouteHelper, + ROUTE_V1_DATA_FETCH: eni.DODOV1PmmHelper, + CALLEE_HELPER: eni.DODOCalleeHelper, + + DODO_PROXY: eni.DODOV2Proxy02, + DODO_DSP_PROXY: eni.DODODspProxy, + DODO_DPP_PROXY: eni.DODODppProxy, + DODO_MINEV3_PROXY: eni.DODOMineV3Proxy, + }, }; export default contractMap; diff --git a/packages/dodoex-api/src/chainConfig/platform.ts b/packages/dodoex-api/src/chainConfig/platform.ts index f75b4fa0..b45c657f 100644 --- a/packages/dodoex-api/src/chainConfig/platform.ts +++ b/packages/dodoex-api/src/chainConfig/platform.ts @@ -38,4 +38,5 @@ export const platformIdMap: { [ChainId.PHAROS_ATLANTIC_TESTNET]: 'pharos-atlantic-testnet', [ChainId.STABLE_TESTNET]: 'stable-testnet', [ChainId.STABLE]: 'stable', + [ChainId.ENI]: 'eni', }; diff --git a/packages/dodoex-api/tsconfig.json b/packages/dodoex-api/tsconfig.json index e7647f9a..cc5dd135 100644 --- a/packages/dodoex-api/tsconfig.json +++ b/packages/dodoex-api/tsconfig.json @@ -2,6 +2,8 @@ "extends": "../../tsconfig", "compilerOptions": { "declarationDir": "./dist/types", + "outDir": "./dist", + "types": ["node", "jest", "qs"], "jsx": "preserve", "target": "es2016" }, diff --git a/packages/dodoex-components/package.json b/packages/dodoex-components/package.json index 8535baf5..c33aebf5 100644 --- a/packages/dodoex-components/package.json +++ b/packages/dodoex-components/package.json @@ -1,6 +1,6 @@ { "name": "@dodoex/components", - "version": "3.2.0", + "version": "3.3.0", "description": "UI component library", "source": "src/index.ts", "types": "dist/types/index.d.ts", @@ -14,7 +14,7 @@ "prerelease": "yarn run build", "release": "semantic-release", "release:local": "np --any-branch --no-cleanup --no-tests", - "release.npm-publish-beta": "npm publish --tag beta" + "release.npm-publish-beta": "yarn run prerelease && npm publish --tag beta" }, "author": "", "publishConfig": { diff --git a/packages/dodoex-components/src/Select/index.tsx b/packages/dodoex-components/src/Select/index.tsx index f2b5e6d1..a8461734 100644 --- a/packages/dodoex-components/src/Select/index.tsx +++ b/packages/dodoex-components/src/Select/index.tsx @@ -62,6 +62,7 @@ const Listbox = styled('ul')( `, ); +// @ts-ignore const AnimatedListbox = React.forwardRef(function AnimatedListbox< Value extends {}, Multiple extends boolean, @@ -97,6 +98,7 @@ const AnimatedListbox = React.forwardRef(function AnimatedListbox< ); }); +// @ts-ignore const Button = React.forwardRef(function Button< TValue extends {}, Multiple extends boolean, @@ -187,8 +189,10 @@ const Popup = styled('div')` z-index: 10; `; -interface Props - extends SelectProps { +interface Props< + T extends {} = SelectOption, + Multiple extends boolean = false, +> extends SelectProps { options?: SelectOption[]; fullWidth?: boolean; px?: number; diff --git a/packages/dodoex-components/src/Tabs/TabsButtonGroup/TabsList.tsx b/packages/dodoex-components/src/Tabs/TabsButtonGroup/TabsList.tsx index d9a9c4bb..0af82139 100644 --- a/packages/dodoex-components/src/Tabs/TabsButtonGroup/TabsList.tsx +++ b/packages/dodoex-components/src/Tabs/TabsButtonGroup/TabsList.tsx @@ -12,7 +12,7 @@ export const TabsList = React.forwardRef< variant?: TabProps['variant']; } >(function TabsList({ sx, variant, ...props }, ref) { - const tabListRef = React.useRef(); + const tabListRef = React.useRef(null); React.useEffect(() => { if ( tabListRef.current && diff --git a/packages/dodoex-components/src/Tabs/TabsGroup/TabsList.tsx b/packages/dodoex-components/src/Tabs/TabsGroup/TabsList.tsx index 59985a7d..b40fae4d 100644 --- a/packages/dodoex-components/src/Tabs/TabsGroup/TabsList.tsx +++ b/packages/dodoex-components/src/Tabs/TabsGroup/TabsList.tsx @@ -11,7 +11,7 @@ export const TabsList = React.forwardRef< sx?: BoxProps['sx']; } >(function TabsList({ sx, ...props }, ref) { - const tabListRef = React.useRef(); + const tabListRef = React.useRef(null); const theme = useTheme(); React.useEffect(() => { if ( diff --git a/packages/dodoex-components/src/Tooltip/Tooltip.tsx b/packages/dodoex-components/src/Tooltip/Tooltip.tsx index 0d64d763..30f101ae 100644 --- a/packages/dodoex-components/src/Tooltip/Tooltip.tsx +++ b/packages/dodoex-components/src/Tooltip/Tooltip.tsx @@ -25,7 +25,7 @@ export interface TooltipProps { title: React.ReactNode | string; maxWidth?: string | number; sx?: BoxProps['sx']; - children: ReactElement>; + children: React.ReactElement>; container?: PopperUnstyledProps['container']; direction?: PopperUnstyledProps['direction']; disablePortal?: PopperUnstyledProps['disablePortal']; @@ -107,8 +107,8 @@ export default function Tooltip({ const { isMobile } = useDevices(); const enterTooltip = useRef(false); const enterTrigger = useRef(false); - const enterTimer = useRef(); - const leaveTimer = useRef(); + const enterTimer = useRef(undefined); + const leaveTimer = useRef(undefined); const [childrenRef, setChildrenRef] = useState(); const [arrowRef, setArrowRef] = useState(); diff --git a/packages/dodoex-components/src/Tooltip/TooltipToast.tsx b/packages/dodoex-components/src/Tooltip/TooltipToast.tsx index 6ae87c04..0ee4d5be 100644 --- a/packages/dodoex-components/src/Tooltip/TooltipToast.tsx +++ b/packages/dodoex-components/src/Tooltip/TooltipToast.tsx @@ -11,7 +11,7 @@ export interface TooltipToastProps { arrow?: TooltipProps['arrow']; placement?: TooltipProps['placement']; leaveDelay?: TooltipProps['leaveDelay']; - children: JSX.Element; + children: React.ReactElement; tooltipSx?: BoxProps['sx']; open?: boolean; onOpen?: () => void; diff --git a/packages/dodoex-components/tsconfig.json b/packages/dodoex-components/tsconfig.json index 701b846c..66bec565 100644 --- a/packages/dodoex-components/tsconfig.json +++ b/packages/dodoex-components/tsconfig.json @@ -1,7 +1,9 @@ { "extends": "../../tsconfig", "compilerOptions": { - "declarationDir": "./dist/types" + "declarationDir": "./dist/types", + "outDir": "./dist", + "types": ["react", "react-dom", "node", "lodash"] }, "exclude": ["node_modules", "**/*.d.mts"], "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.tsx"] diff --git a/packages/dodoex-widgets/package.json b/packages/dodoex-widgets/package.json index 1e9791f7..02aac69b 100644 --- a/packages/dodoex-widgets/package.json +++ b/packages/dodoex-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@dodoex/widgets", - "version": "3.14.0", + "version": "3.18.0", "description": "DODO Widgets", "source": "src/index.tsx", "types": "dist/types/index.d.ts", @@ -23,7 +23,7 @@ "release": "semantic-release", "release:local": "np --any-branch --no-cleanup --no-tests", "release.npm-publish": "npm publish --access public", - "release.npm-publish-beta": "npm publish --tag beta", + "release.npm-publish-beta": "yarn run prerelease && npm publish --tag beta", "test": "jest src", "test:e2e": "jest e2e" }, @@ -58,10 +58,10 @@ }, "dependencies": { "@babel/runtime": "^7.17.0", - "@dodoex/api": "3.5.0", - "@dodoex/components": "^3.2.0", + "@dodoex/api": "^3.7.0", + "@dodoex/components": "^3.3.0", "@dodoex/contract-request": "^1.3.0", - "@dodoex/dodo-contract-request": "^1.32.0", + "@dodoex/dodo-contract-request": "^1.34.0", "@dodoex/icons": "^2.1.0", "@emotion/react": "^11.10.0", "@emotion/styled": "^11.10.0", @@ -100,7 +100,7 @@ "recharts": "^2.15.0", "rmc-date-picker": "^6.0.10", "tiny-invariant": "^1.1.0", - "zustand": "^4.5.5" + "zustand": "^5.0.0" }, "peerDependencies": { "@babel/runtime": ">=7.17.0", @@ -159,4 +159,4 @@ "optionalDependencies": { "pino-pretty": "^13.1.3" } -} +} \ No newline at end of file diff --git a/packages/dodoex-widgets/rollup.config.mjs b/packages/dodoex-widgets/rollup.config.mjs index 47996d2e..333e8a02 100644 --- a/packages/dodoex-widgets/rollup.config.mjs +++ b/packages/dodoex-widgets/rollup.config.mjs @@ -48,12 +48,23 @@ const baseConfig = { watch: true, // default: false }), ], - external: [ - ...Object.keys(pkg.dependencies || {}).filter( - (key) => !['@dodoex/icons'].includes(key), - ), - ...Object.keys(pkg.peerDependencies || {}), - ], + external: (id) => { + const externals = [ + ...Object.keys(pkg.dependencies || {}).filter( + (key) => !['@dodoex/icons'].includes(key), + ), + ...Object.keys(pkg.peerDependencies || {}), + 'scheduler', + 'react-is', + 'react-reconciler', + 'konva', + 'react-konva', + ]; + + return externals.some( + (pkgName) => id === pkgName || id.startsWith(`${pkgName}/`), + ); + }, }; const localesConfig = globby.sync('src/locales/*.js').map((inputFile) => ({ diff --git a/packages/dodoex-widgets/src/assets/logo/networks/eni.svg b/packages/dodoex-widgets/src/assets/logo/networks/eni.svg new file mode 100644 index 00000000..ddaad043 --- /dev/null +++ b/packages/dodoex-widgets/src/assets/logo/networks/eni.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/dodoex-widgets/src/components/Swap/index.tsx b/packages/dodoex-widgets/src/components/Swap/index.tsx index ff8b6050..bf66ded3 100644 --- a/packages/dodoex-widgets/src/components/Swap/index.tsx +++ b/packages/dodoex-widgets/src/components/Swap/index.tsx @@ -112,8 +112,8 @@ export function Swap({ [], ); - const [fromToken, setFromTokenOrigin] = useState(null); - const [toToken, setToTokenOrigin] = useState(null); + const [fromToken, setFromToken] = useState(null); + const [toToken, setToToken] = useState(null); const [isReviewDialogOpen, setIsReviewDialogOpen] = useState(false); const [isSettingsDialogOpen, setIsSettingsDialogOpen] = useState(false); @@ -278,44 +278,27 @@ export function Swap({ [setDisplayingToAmt, debouncedSetToAmt, resetSwapRoute], ); - const setFromToken: (value: React.SetStateAction) => void = - useCallback( - (value) => { - return setFromTokenOrigin((prev) => { - const newValue = typeof value === 'function' ? value(prev) : value; - // sync redux - if (!chainId) { - // The chainId is only modified when the wallet is not connected, and the chain is specified when the wallet is connected. - useGlobalState.setState({ - fromTokenChainId: (newValue?.chainId ?? undefined) as - | ChainId - | undefined, - }); - } - // callback - if (onPayTokenChange && newValue && newValue !== prev) { - onPayTokenChange(newValue); - } + useEffect(() => { + if (!fromToken) return; - return newValue; - }); - }, - [onPayTokenChange, chainId], - ); + // sync redux + if (!chainId) { + // The chainId is only modified when the wallet is not connected, and the chain is specified when the wallet is connected. + useGlobalState.setState({ + fromTokenChainId: fromToken.chainId, + }); + } + // callback + if (onPayTokenChange) { + onPayTokenChange(fromToken); + } + }, [fromToken, chainId, onPayTokenChange]); - const setToToken: (value: React.SetStateAction) => void = - useCallback( - (value) => { - return setToTokenOrigin((prev) => { - const newValue = typeof value === 'function' ? value(prev) : value; - if (onReceiveTokenChange && newValue && newValue !== prev) { - onReceiveTokenChange(newValue); - } - return newValue; - }); - }, - [onReceiveTokenChange], - ); + useEffect(() => { + if (toToken && onReceiveTokenChange) { + onReceiveTokenChange(toToken); + } + }, [toToken, onReceiveTokenChange]); useInitDefaultToken({ fromToken, diff --git a/packages/dodoex-widgets/src/constants/chainList.ts b/packages/dodoex-widgets/src/constants/chainList.ts index 0c164dc2..0a486ac8 100644 --- a/packages/dodoex-widgets/src/constants/chainList.ts +++ b/packages/dodoex-widgets/src/constants/chainList.ts @@ -7,6 +7,7 @@ import { ReactComponent as BitlayerLogo } from '../assets/logo/networks/bitlayer import { ReactComponent as BSCLogo } from '../assets/logo/networks/bsc.svg'; import { ReactComponent as CFXLogo } from '../assets/logo/networks/cfx.svg'; import { ReactComponent as DODOchainLogo } from '../assets/logo/networks/dodochain.svg'; +import { ReactComponent as ENILogo } from '../assets/logo/networks/eni.svg'; import { ReactComponent as ETHereumLogo } from '../assets/logo/networks/eth.svg'; import { ReactComponent as HashKeyLogo } from '../assets/logo/networks/haskey.svg'; import { ReactComponent as HemiLogo } from '../assets/logo/networks/hemi.svg'; @@ -322,6 +323,14 @@ export const chainListMap: Map = new Map([ name: 'Stable', }, ], + [ + ChainId.ENI, + { + chainId: ChainId.ENI, + logo: ENILogo, + name: 'ENI Mainnet', + }, + ], ]); export const isTestNet = (chainId: ChainId) => { diff --git a/packages/dodoex-widgets/src/constants/chains.ts b/packages/dodoex-widgets/src/constants/chains.ts index 32e1f9f7..000bc848 100644 --- a/packages/dodoex-widgets/src/constants/chains.ts +++ b/packages/dodoex-widgets/src/constants/chains.ts @@ -73,6 +73,11 @@ export const rpcServerMap: { [ChainId.STABLE]: [ 'https://partners-rpc.stable.xyz/dodo.88b3272adaac2ddaa08f13c049824412d7bffe24a2c760089f6c480115ac00e1', ], + [ChainId.ENI]: [ + 'https://rpc.eniac.network', + 'https://rpc1.eniac.network', + 'https://rpc2.eniac.network', + ], }; export const getRpcSingleUrlMap = (newRpcServerMap?: { @@ -132,6 +137,7 @@ export const scanUrlDomainMap: { [ChainId.PHAROS_ATLANTIC_TESTNET]: 'atlantic.pharosscan.xyz', [ChainId.STABLE_TESTNET]: 'testnet.stablescan.xyz', [ChainId.STABLE]: 'stablescan.xyz', + [ChainId.ENI]: 'scan.eniac.network', }; export const ThegraphKeyMap: { @@ -172,6 +178,7 @@ export const ThegraphKeyMap: { [ChainId.PHAROS_ATLANTIC_TESTNET]: 'pharos-atlantic-testnet', [ChainId.STABLE_TESTNET]: 'stable-testnet', [ChainId.STABLE]: 'stable', + [ChainId.ENI]: 'eni', }; export const blockTimeMap: { @@ -212,6 +219,7 @@ export const blockTimeMap: { [ChainId.PHAROS_ATLANTIC_TESTNET]: 2777, [ChainId.STABLE_TESTNET]: 700, [ChainId.STABLE]: 988, + [ChainId.ENI]: 1000, }; export const dexKeysMap: { @@ -252,4 +260,5 @@ export const dexKeysMap: { [ChainId.PHAROS_ATLANTIC_TESTNET]: [], [ChainId.STABLE_TESTNET]: [], [ChainId.STABLE]: [], + [ChainId.ENI]: [], }; diff --git a/packages/dodoex-widgets/src/hooks/Bridge/useFetchRoutePriceBridge.ts b/packages/dodoex-widgets/src/hooks/Bridge/useFetchRoutePriceBridge.ts index a0200e2d..c51c0dc6 100644 --- a/packages/dodoex-widgets/src/hooks/Bridge/useFetchRoutePriceBridge.ts +++ b/packages/dodoex-widgets/src/hooks/Bridge/useFetchRoutePriceBridge.ts @@ -148,7 +148,8 @@ export function useFetchRoutePriceBridge({ const { account, provider } = useWeb3React(); const { defaultSlippage, loading: slippageLoading } = useDefaultSlippage(true); - const slippage = useGlobalState((state) => state.slippage || defaultSlippage); + const { slippage: stateSlippage } = useGlobalState(); + const slippage = stateSlippage || defaultSlippage; const { apikey } = useUserOptions(); const [status, setStatus] = useState( RoutePriceStatus.Initial, diff --git a/packages/dodoex-widgets/src/hooks/Swap/useFetchRoutePrice.ts b/packages/dodoex-widgets/src/hooks/Swap/useFetchRoutePrice.ts index cfa1345a..f01ca9e1 100644 --- a/packages/dodoex-widgets/src/hooks/Swap/useFetchRoutePrice.ts +++ b/packages/dodoex-widgets/src/hooks/Swap/useFetchRoutePrice.ts @@ -66,10 +66,10 @@ export function useFetchRoutePrice({ () => fromToken?.chainId || walletChainId || defaultChainId, [walletChainId, fromToken, defaultChainId], ); - const ddl = useSwapSettingStore((state) => Number(state.ddl)); - const disableIndirectRouting = useSwapSettingStore((state) => - Number(state.disableIndirectRouting), - ); + const { ddl: ddlStr, disableIndirectRouting: disableIndirectRoutingStr } = + useSwapSettingStore(); + const ddl = Number(ddlStr); + const disableIndirectRouting = Number(disableIndirectRoutingStr); const lastId = useRef(0); const [status, setStatus] = useState( RoutePriceStatus.Initial, diff --git a/packages/dodoex-widgets/src/hooks/Token/useDisabledTokenSwitch.ts b/packages/dodoex-widgets/src/hooks/Token/useDisabledTokenSwitch.ts index 468b1006..5ade27e0 100644 --- a/packages/dodoex-widgets/src/hooks/Token/useDisabledTokenSwitch.ts +++ b/packages/dodoex-widgets/src/hooks/Token/useDisabledTokenSwitch.ts @@ -9,7 +9,8 @@ export function useDisabledTokenSwitch({ fromToken: TokenInfo | undefined | null; toToken: TokenInfo | undefined | null; }) { - const tokenList = useTokenState(getAllTokenList); + const state = useTokenState(); + const tokenList = useMemo(() => getAllTokenList(state), [state]); return useMemo(() => { if ( fromToken && diff --git a/packages/dodoex-widgets/src/hooks/Token/useSelectChainList.ts b/packages/dodoex-widgets/src/hooks/Token/useSelectChainList.ts index 949e88bf..e225aed8 100644 --- a/packages/dodoex-widgets/src/hooks/Token/useSelectChainList.ts +++ b/packages/dodoex-widgets/src/hooks/Token/useSelectChainList.ts @@ -7,7 +7,8 @@ import { getAllTokenList, useTokenState } from '../useTokenState'; export function useSelectChainList(side?: 'from' | 'to') { const { chainId } = useWeb3React(); - const allTokenList = useTokenState(getAllTokenList); + const state = useTokenState(); + const allTokenList = useMemo(() => getAllTokenList(state), [state]); const { crossChain, onlyChainId } = useUserOptions(); const hasTokenChainIds = useMemo(() => { const result = new Set(); diff --git a/packages/dodoex-widgets/src/locales/en-US.po b/packages/dodoex-widgets/src/locales/en-US.po index 0c29fd65..76891b19 100644 --- a/packages/dodoex-widgets/src/locales/en-US.po +++ b/packages/dodoex-widgets/src/locales/en-US.po @@ -219,7 +219,7 @@ msgid "Pay" msgstr "Pay" #: src/components/Swap/components/ReviewDialog.tsx:336 -#: src/components/Swap/index.tsx:445 +#: src/components/Swap/index.tsx:428 msgid "Due to the market condition, market price and estimated price may have a slight difference" msgstr "Due to the market condition, market price and estimated price may have a slight difference" @@ -245,7 +245,7 @@ msgstr "{0} confirmed" msgid "Creation Time" msgstr "Creation Time" -#: src/components/Swap/index.tsx:554 +#: src/components/Swap/index.tsx:537 msgid "The current network is inconsistent with the wallet - please switch in wallet" msgstr "The current network is inconsistent with the wallet - please switch in wallet" @@ -284,7 +284,7 @@ msgstr "Max price" msgid "Staked Tokens" msgstr "Staked Tokens" -#: src/components/Swap/index.tsx:453 +#: src/components/Swap/index.tsx:436 msgid "Current price impact" msgstr "Current price impact" @@ -356,7 +356,7 @@ msgstr "Fee includes: Cross Chain fees + Swap fees. Gas fee not included." msgid "Confirm" msgstr "Confirm" -#: src/components/Swap/index.tsx:1030 +#: src/components/Swap/index.tsx:1013 msgid "Powered by DODO protocol" msgstr "Powered by DODO protocol" @@ -743,7 +743,7 @@ msgstr "Add Position" msgid "Emulator" msgstr "Emulator" -#: src/components/Swap/index.tsx:710 +#: src/components/Swap/index.tsx:693 msgid "Transaction Pending" msgstr "Transaction Pending" @@ -886,7 +886,7 @@ msgid "Price discrepancy {lqAndDodoCompareText} between liquidity pool and the q msgstr "Price discrepancy {lqAndDodoCompareText} between liquidity pool and the quote price on DODO." #: src/components/Swap/components/TokenPairPriceWithToggle.tsx:52 -#: src/components/Swap/index.tsx:575 +#: src/components/Swap/index.tsx:558 msgid "Fetching best price..." msgstr "Fetching best price..." @@ -906,7 +906,7 @@ msgstr "*Collecting fees will withdraw currently available fees for you." msgid "Related CrowdPooling" msgstr "Related CrowdPooling" -#: src/components/Swap/index.tsx:799 +#: src/components/Swap/index.tsx:782 msgid "Review Swap" msgstr "Review Swap" @@ -943,7 +943,7 @@ msgstr "Any Ratio" msgid "Once created, you can adjust the pool’s market-making price at any time. This option is suitable for assets with fluctuating pegged prices. Adjusting the pool’s market-making price allows for more competitive quotes." msgstr "Once created, you can adjust the pool’s market-making price at any time. This option is suitable for assets with fluctuating pegged prices. Adjusting the pool’s market-making price allows for more competitive quotes." -#: src/components/Swap/index.tsx:717 +#: src/components/Swap/index.tsx:700 msgid "Select Tokens" msgstr "Select Tokens" @@ -1035,13 +1035,13 @@ msgstr "My Pools" msgid "Share Of Pool" msgstr "Share Of Pool" -#: src/components/Swap/index.tsx:897 +#: src/components/Swap/index.tsx:880 msgid "The setting has been switched to swap mode" msgstr "The setting has been switched to swap mode" #: src/components/Swap/components/TokenPairPriceWithToggle.tsx:61 -#: src/components/Swap/index.tsx:630 -#: src/components/Swap/index.tsx:759 +#: src/components/Swap/index.tsx:613 +#: src/components/Swap/index.tsx:742 msgid "Quote not available" msgstr "Quote not available" @@ -1113,7 +1113,7 @@ msgstr "The area of the chart indicates the buy/sell volume of {baseSymbol} that msgid "Your position will appear here." msgstr "Your position will appear here." -#: src/components/Swap/index.tsx:744 +#: src/components/Swap/index.tsx:727 msgid "Fetching Price..." msgstr "Fetching Price..." @@ -1245,7 +1245,7 @@ msgstr "Tx" msgid "Single" msgstr "Single" -#: src/components/Swap/index.tsx:789 +#: src/components/Swap/index.tsx:772 msgid "Review Cross Chain" msgstr "Review Cross Chain" @@ -1529,7 +1529,7 @@ msgstr "Total Swap Fee" msgid "On" msgstr "On" -#: src/components/Swap/index.tsx:727 +#: src/components/Swap/index.tsx:710 #: src/hooks/Token/useGetTokenStatus.ts:60 #: src/hooks/Token/useTokenStatus.ts:134 msgid "Approve" @@ -1896,7 +1896,7 @@ msgstr "Back" msgid "Dynamic slippage is {recommendSlippage}%,the current slippage setting is higher than the dynamic slippage, which means you are willing to accept a worse final execution price." msgstr "Dynamic slippage is {recommendSlippage}%,the current slippage setting is higher than the dynamic slippage, which means you are willing to accept a worse final execution price." -#: src/components/Swap/index.tsx:733 +#: src/components/Swap/index.tsx:716 #: src/widgets/PoolWidget/AMMV3/hooks/useV3DerivedMintInfo.tsx:534 msgid "Enter an amount" msgstr "Enter an amount" @@ -1905,7 +1905,7 @@ msgstr "Enter an amount" msgid "Ratio" msgstr "Ratio" -#: src/components/Swap/index.tsx:727 +#: src/components/Swap/index.tsx:710 #: src/components/TokenPairStatusButton.tsx:45 #: src/components/TokenStatusButton.tsx:31 msgid "Approving" @@ -2170,7 +2170,7 @@ msgstr "Traders" msgid "Unable to SETTLE during the cooling-off period" msgstr "Unable to SETTLE during the cooling-off period" -#: src/components/Swap/index.tsx:895 +#: src/components/Swap/index.tsx:878 msgid "The setting has been switched to cross chain mode" msgstr "The setting has been switched to cross chain mode" @@ -2179,7 +2179,7 @@ msgid "Buy" msgstr "Buy" #. placeholder {0}: getMaxSlippageWarning(fromToken?.chainId) -#: src/components/Swap/index.tsx:520 +#: src/components/Swap/index.tsx:503 msgid "The current slippage protection coefficient set exceeds {0}%, which may result in losses." msgstr "The current slippage protection coefficient set exceeds {0}%, which may result in losses." @@ -2344,7 +2344,7 @@ msgstr "differs from the price quoted by DODO by {lqAndDodoCompareText}" msgid "Real Time" msgstr "Real Time" -#: src/components/Swap/index.tsx:591 +#: src/components/Swap/index.tsx:574 msgid "Unsupported network - switch to trade" msgstr "Unsupported network - switch to trade" @@ -2360,7 +2360,7 @@ msgstr "Paid" msgid "Failed to add" msgstr "Failed to add" -#: src/components/Swap/index.tsx:890 +#: src/components/Swap/index.tsx:873 #: src/hooks/Swap/useExecuteSwap.ts:60 msgid "Swap" msgstr "Swap" @@ -2522,7 +2522,7 @@ msgstr "OK" msgid "Total Rewards=Daily Rewards*Duration" msgstr "Total Rewards=Daily Rewards*Duration" -#: src/components/Swap/index.tsx:770 +#: src/components/Swap/index.tsx:753 #: src/components/TokenStatusButton.tsx:18 #: src/widgets/PoolWidget/PoolOperate/AddPoolOperate.tsx:146 #: src/widgets/PoolWidget/PoolOperate/RemovePoolOperate.tsx:248 diff --git a/packages/dodoex-widgets/src/locales/zh-CN.po b/packages/dodoex-widgets/src/locales/zh-CN.po index 9c0d69fb..2e7dd658 100644 --- a/packages/dodoex-widgets/src/locales/zh-CN.po +++ b/packages/dodoex-widgets/src/locales/zh-CN.po @@ -217,7 +217,7 @@ msgid "Pay" msgstr "支付" #: src/components/Swap/components/ReviewDialog.tsx:336 -#: src/components/Swap/index.tsx:445 +#: src/components/Swap/index.tsx:428 msgid "Due to the market condition, market price and estimated price may have a slight difference" msgstr "由于市场情况不同,市场价格与估算价格可能略有差异。" @@ -243,7 +243,7 @@ msgstr "{0} 已确认" msgid "Creation Time" msgstr "创建时间" -#: src/components/Swap/index.tsx:554 +#: src/components/Swap/index.tsx:537 msgid "The current network is inconsistent with the wallet - please switch in wallet" msgstr "当前网络与钱包不一致,请在钱包中切换" @@ -282,7 +282,7 @@ msgstr "最高价格" msgid "Staked Tokens" msgstr "质押代币" -#: src/components/Swap/index.tsx:453 +#: src/components/Swap/index.tsx:436 msgid "Current price impact" msgstr "当前价格冲击" @@ -354,7 +354,7 @@ msgstr "费用包括过跨链桥和交易的手续费,不包括 gas 费。" msgid "Confirm" msgstr "确认" -#: src/components/Swap/index.tsx:1030 +#: src/components/Swap/index.tsx:1013 msgid "Powered by DODO protocol" msgstr "Powered by DODO protocol" @@ -739,7 +739,7 @@ msgstr "加仓" msgid "Emulator" msgstr "模拟器" -#: src/components/Swap/index.tsx:710 +#: src/components/Swap/index.tsx:693 msgid "Transaction Pending" msgstr "交易进行中" @@ -882,7 +882,7 @@ msgid "Price discrepancy {lqAndDodoCompareText} between liquidity pool and the q msgstr "资金池报价与 DODO 智能路由价格相差 {lqAndDodoCompareText}" #: src/components/Swap/components/TokenPairPriceWithToggle.tsx:52 -#: src/components/Swap/index.tsx:575 +#: src/components/Swap/index.tsx:558 msgid "Fetching best price..." msgstr "获取最优价格中..." @@ -902,7 +902,7 @@ msgstr "*收取费用将领取当前已分配手续费。" msgid "Related CrowdPooling" msgstr "关联众筹建池" -#: src/components/Swap/index.tsx:799 +#: src/components/Swap/index.tsx:782 msgid "Review Swap" msgstr "预览交易" @@ -939,7 +939,7 @@ msgstr "任意比例" msgid "Once created, you can adjust the pool’s market-making price at any time. This option is suitable for assets with fluctuating pegged prices. Adjusting the pool’s market-making price allows for more competitive quotes." msgstr "创建完成后,您可以随时修改做市价格,适用于资产锚定价可能出现变化的情况" -#: src/components/Swap/index.tsx:717 +#: src/components/Swap/index.tsx:700 msgid "Select Tokens" msgstr "选择代币" @@ -1031,13 +1031,13 @@ msgstr "我的资金池" msgid "Share Of Pool" msgstr "资金池份额" -#: src/components/Swap/index.tsx:897 +#: src/components/Swap/index.tsx:880 msgid "The setting has been switched to swap mode" msgstr "设置已切换至闪兑模式" #: src/components/Swap/components/TokenPairPriceWithToggle.tsx:61 -#: src/components/Swap/index.tsx:630 -#: src/components/Swap/index.tsx:759 +#: src/components/Swap/index.tsx:613 +#: src/components/Swap/index.tsx:742 msgid "Quote not available" msgstr "没有报价" @@ -1109,7 +1109,7 @@ msgstr "" msgid "Your position will appear here." msgstr "你的仓位将会显示在这里" -#: src/components/Swap/index.tsx:744 +#: src/components/Swap/index.tsx:727 msgid "Fetching Price..." msgstr "获取价格中..." @@ -1241,7 +1241,7 @@ msgstr "交易哈希:" msgid "Single" msgstr "单边" -#: src/components/Swap/index.tsx:789 +#: src/components/Swap/index.tsx:772 msgid "Review Cross Chain" msgstr "预览跨链交易" @@ -1525,7 +1525,7 @@ msgstr "累计手续费" msgid "On" msgstr "在" -#: src/components/Swap/index.tsx:727 +#: src/components/Swap/index.tsx:710 #: src/hooks/Token/useGetTokenStatus.ts:60 #: src/hooks/Token/useTokenStatus.ts:134 msgid "Approve" @@ -1892,7 +1892,7 @@ msgstr "返回" msgid "Dynamic slippage is {recommendSlippage}%,the current slippage setting is higher than the dynamic slippage, which means you are willing to accept a worse final execution price." msgstr "动态滑点为 {recommendSlippage}%,当前的滑点设置高于动态滑点,这意味着你该交易的最终成交价格会比较差。" -#: src/components/Swap/index.tsx:733 +#: src/components/Swap/index.tsx:716 #: src/widgets/PoolWidget/AMMV3/hooks/useV3DerivedMintInfo.tsx:534 msgid "Enter an amount" msgstr "输入代币数量" @@ -1901,7 +1901,7 @@ msgstr "输入代币数量" msgid "Ratio" msgstr "比例" -#: src/components/Swap/index.tsx:727 +#: src/components/Swap/index.tsx:710 #: src/components/TokenPairStatusButton.tsx:45 #: src/components/TokenStatusButton.tsx:31 msgid "Approving" @@ -2166,7 +2166,7 @@ msgstr "交易用户" msgid "Unable to SETTLE during the cooling-off period" msgstr "在冷静期无法进行清算" -#: src/components/Swap/index.tsx:895 +#: src/components/Swap/index.tsx:878 msgid "The setting has been switched to cross chain mode" msgstr "设置已切换到跨链桥交易模式" @@ -2175,7 +2175,7 @@ msgid "Buy" msgstr "购买" #. placeholder {0}: getMaxSlippageWarning(fromToken?.chainId) -#: src/components/Swap/index.tsx:520 +#: src/components/Swap/index.tsx:503 msgid "The current slippage protection coefficient set exceeds {0}%, which may result in losses." msgstr "" @@ -2340,7 +2340,7 @@ msgstr "与 DODO {lqanddodocomparetext} 的报价不同。" msgid "Real Time" msgstr "实时数据" -#: src/components/Swap/index.tsx:591 +#: src/components/Swap/index.tsx:574 msgid "Unsupported network - switch to trade" msgstr "未支持网络 - 请切换后进行交易" @@ -2356,7 +2356,7 @@ msgstr "支付" msgid "Failed to add" msgstr "添加失败" -#: src/components/Swap/index.tsx:890 +#: src/components/Swap/index.tsx:873 #: src/hooks/Swap/useExecuteSwap.ts:60 msgid "Swap" msgstr "交易" @@ -2518,7 +2518,7 @@ msgstr "好的" msgid "Total Rewards=Daily Rewards*Duration" msgstr "总奖励 = 每日奖励数量 * 时长" -#: src/components/Swap/index.tsx:770 +#: src/components/Swap/index.tsx:753 #: src/components/TokenStatusButton.tsx:18 #: src/widgets/PoolWidget/PoolOperate/AddPoolOperate.tsx:146 #: src/widgets/PoolWidget/PoolOperate/RemovePoolOperate.tsx:248 diff --git a/packages/dodoex-widgets/src/providers/i18n.tsx b/packages/dodoex-widgets/src/providers/i18n.tsx index 6566a1db..1b1bb3f4 100644 --- a/packages/dodoex-widgets/src/providers/i18n.tsx +++ b/packages/dodoex-widgets/src/providers/i18n.tsx @@ -1,11 +1,12 @@ import { i18n } from '@lingui/core'; import { I18nProvider } from '@lingui/react'; -import { SupportedLang, defaultLang } from '../constants/locales'; -import { ReactNode, useEffect } from 'react'; import dayjs from 'dayjs'; -import utc from 'dayjs/plugin/utc'; import duration from 'dayjs/plugin/duration'; import LocalizedFormat from 'dayjs/plugin/localizedFormat'; +import utc from 'dayjs/plugin/utc'; +import { ReactNode, useEffect } from 'react'; +import { SupportedLang, defaultLang } from '../constants/locales'; +import { messages } from '../locales/en-US.js'; interface LangProviderProps { locale?: SupportedLang; @@ -23,12 +24,24 @@ export async function loadI18(locale: SupportedLang = defaultLang) { } catch {} i18n.activate(locale); } + +// Activate default language synchronously +i18n.load(defaultLang, messages); +i18n.activate(defaultLang); export function LangProvider({ locale, children }: LangProviderProps) { + if (!i18n.locale) { + i18n.load(defaultLang, messages); + i18n.activate(defaultLang); + } useEffect(() => { const loadLocale = async () => { await loadI18(locale); }; loadLocale(); }, [locale]); - return {children}; + return ( + + {children} + + ); } diff --git a/packages/dodoex-widgets/tsconfig.json b/packages/dodoex-widgets/tsconfig.json index f7698af7..e92521a2 100644 --- a/packages/dodoex-widgets/tsconfig.json +++ b/packages/dodoex-widgets/tsconfig.json @@ -2,6 +2,8 @@ "extends": "../../tsconfig", "compilerOptions": { "declarationDir": "./dist/types", + "outDir": "./dist", + "types": ["react", "react-dom", "node", "jest", "lodash", "d3"], "jsx": "preserve", "target": "es2016" }, diff --git a/yarn.lock b/yarn.lock index b23fe438..baf5c56b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1409,10 +1409,10 @@ ethers "^6.13.2" https-proxy-agent "^7.0.5" -"@dodoex/dodo-contract-request@^1.32.0": - version "1.32.0" - resolved "https://registry.yarnpkg.com/@dodoex/dodo-contract-request/-/dodo-contract-request-1.32.0.tgz#71fc5627d658946f75cb2f00849d7f9d618a997e" - integrity sha512-gWOdBIiHGWmZzryoV781qKqz3z6eFUfjaTe62VcO0xiBLM51aCpiXTX44jqpYvHbURdFCGgeDO9Br49ac68jUA== +"@dodoex/dodo-contract-request@^1.34.0": + version "1.34.0" + resolved "https://registry.yarnpkg.com/@dodoex/dodo-contract-request/-/dodo-contract-request-1.34.0.tgz#eec8675678aa43eccd38b5744970e4aaaf52f4dd" + integrity sha512-/vsLhH7upXPpTI97pK2Zr9sNR+FVV5nNSDSe4qnEjFWp9IJNa0YFwjoBMR2QnqDHLH7PTt5B0Q1jzFZ/8MbDEA== dependencies: typescript "^5" @@ -6936,7 +6936,12 @@ dependencies: "@types/react" "*" -"@types/react-dom@^18.0.0", "@types/react-dom@^19.0.0": +"@types/react-dom@^18.0.0": + version "18.3.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" + integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== + +"@types/react-dom@^19.0.0": version "19.2.3" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== @@ -6971,9 +6976,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^19.0.0": - version "19.2.7" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.7.tgz#84e62c0f23e8e4e5ac2cadcea1ffeacccae7f62f" - integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg== + version "19.2.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.8.tgz#307011c9f5973a6abab8e17d0293f48843627994" + integrity sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg== dependencies: csstype "^3.2.2" @@ -22402,9 +22407,14 @@ zustand@4.4.0: dependencies: use-sync-external-store "1.2.0" -zustand@^4.3.5, zustand@^4.5.5: +zustand@^4.3.5: version "4.5.7" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.7.tgz#7d6bb2026a142415dd8be8891d7870e6dbe65f55" integrity sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw== dependencies: use-sync-external-store "^1.2.2" + +zustand@^5.0.0: + version "5.0.10" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.10.tgz#4db510c0c4c25a5f1ae43227b307ddf1641a3210" + integrity sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==