diff --git a/packages/nextjs/app/v3/_components/ChooseToken.tsx b/packages/nextjs/app/v3/_components/ChooseToken.tsx index 570c82b8..3dcfb1ad 100644 --- a/packages/nextjs/app/v3/_components/ChooseToken.tsx +++ b/packages/nextjs/app/v3/_components/ChooseToken.tsx @@ -324,7 +324,6 @@ const BoostOpportunityModal = ({ const boostedVariantRateProvider = boostedVariant.priceRateProviderData?.address; const handleBoost = (enableBoost: boolean) => { - // TODO: more testing for rate provider UX updateTokenConfig(tokenIndex, { useBoostedVariant: enableBoost, rateProvider: diff --git a/packages/nextjs/app/v3/_components/ChooseTokens.tsx b/packages/nextjs/app/v3/_components/ChooseTokens.tsx index cc0d913e..1f1f34e8 100644 --- a/packages/nextjs/app/v3/_components/ChooseTokens.tsx +++ b/packages/nextjs/app/v3/_components/ChooseTokens.tsx @@ -13,7 +13,6 @@ const MAX_TOKENS = { export function ChooseTokens() { const { tokenConfigs, poolType, updatePool } = usePoolCreationStore(); const { hasAgreedToWarning, updateUserData } = useUserDataStore(); - // const isProportional = useVerifyProportionalInit(); // Beware of javascript floating point precision issues if 100 % number of tokens is not equal to zero function handleAddToken() { diff --git a/packages/nextjs/app/v3/_components/PoolDetails.tsx b/packages/nextjs/app/v3/_components/PoolDetails.tsx index 24ce82f5..82389664 100644 --- a/packages/nextjs/app/v3/_components/PoolDetails.tsx +++ b/packages/nextjs/app/v3/_components/PoolDetails.tsx @@ -258,7 +258,7 @@ function TokenDetails({ token }: { token: TokenConfig }) { )} -
{token.amount}
+
{token.amount.length > 15 ? `${token.amount.slice(0, 15)}...` : token.amount}
{token.rateProvider && token.rateProvider !== zeroAddress && ( <> diff --git a/packages/nextjs/app/v3/_components/UserExperienceAlerts.tsx b/packages/nextjs/app/v3/_components/UserExperienceAlerts.tsx new file mode 100644 index 00000000..93a8a185 --- /dev/null +++ b/packages/nextjs/app/v3/_components/UserExperienceAlerts.tsx @@ -0,0 +1,86 @@ +import { useState } from "react"; +import Link from "next/link"; +import { ArrowUpRightIcon, XMarkIcon } from "@heroicons/react/24/outline"; +import { Alert } from "~~/components/common"; +import { usePoolCreationStore } from "~~/hooks/v3"; + +export function UserExperienceAlerts() { + const [isInfoAlertVisible, setIsInfoAlertVisible] = useState(true); + const { chain } = usePoolCreationStore(); + + return ( + <> + {!chain && ( +
+
+ +
+ Make sure you switch to your desired network before beginning pool creation. You cannot switch after + selecting pool type unless you reset progress + +
+
+
+
+ )} + {isInfoAlertVisible && ( +
+
+ +
+ For tips and guidance on pool configuration and creation, check out our + + partner onboarding documentation + +
+
+ +
+
+ )} + + ); +} + +export function ConnectWalletAlert() { + return ( +
+
+ +
+ Please connect a wallet and switch to the network you wish to create a pool + +
+
+
+
+ ); +} + +export function StartedOnDifferentNetworkAlert() { + const { chain } = usePoolCreationStore(); + + return ( +
+
+ +
+ You have already begun the pool configuration process on {chain?.name}. If you wish to start creating a pool + on a different network, choose reset progress after switching back to {chain?.name}. + +
+
+
+
+ ); +} diff --git a/packages/nextjs/app/v3/_components/index.tsx b/packages/nextjs/app/v3/_components/index.tsx index abcbaed8..62e3ce0f 100644 --- a/packages/nextjs/app/v3/_components/index.tsx +++ b/packages/nextjs/app/v3/_components/index.tsx @@ -6,3 +6,4 @@ export * from "./ChooseParameters"; export * from "./ChooseInfo"; export * from "./PoolCreationManager"; export * from "./ApproveOnTokenManager"; +export * from "./UserExperienceAlerts"; diff --git a/packages/nextjs/app/v3/page.tsx b/packages/nextjs/app/v3/page.tsx index 3fbddf4d..c9be7a1a 100644 --- a/packages/nextjs/app/v3/page.tsx +++ b/packages/nextjs/app/v3/page.tsx @@ -1,17 +1,23 @@ "use client"; -import { useState } from "react"; -import Link from "next/link"; -import { PoolConfiguration, PoolDetails } from "./_components"; +import { + ConnectWalletAlert, + PoolConfiguration, + PoolDetails, + StartedOnDifferentNetworkAlert, + UserExperienceAlerts, +} from "./_components"; import type { NextPage } from "next"; -import { ArrowUpRightIcon, XMarkIcon } from "@heroicons/react/24/outline"; +import { useWalletClient } from "wagmi"; import { BalancerLogo } from "~~/components/assets/BalancerLogo"; import { Alert, ContactSupportModal, PoolStateResetModal } from "~~/components/common"; import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork"; -import { usePoolCreationStore, useUserDataStore, useValidateNetwork } from "~~/hooks/v3"; +import { usePoolCreationStore, useUserDataStore } from "~~/hooks/v3"; const BalancerV3: NextPage = () => { const { clearPoolStore, chain } = usePoolCreationStore(); + const { targetNetwork: selectedNetwork } = useTargetNetwork(); + const { data: walletClient } = useWalletClient(); const { clearUserData } = useUserDataStore(); return ( @@ -23,44 +29,50 @@ const BalancerV3: NextPage = () => {

Balancer v3

- + {!walletClient ? ( + + ) : chain && selectedNetwork.id !== chain.id ? ( + + ) : ( + <> + - <> -
- +
+ -
-
-
Pool Preview
- {chain && ( -
- {chain?.name} -
- )} -
- -
- -
·
- { - clearPoolStore(); - clearUserData(); - }} - /> +
+
+
Pool Preview
+ {chain && ( +
+ {chain?.name} +
+ )} +
+ +
+ +
·
+ { + clearPoolStore(); + clearUserData(); + }} + /> +
-
-
- -
Pool creation not available on mobile
-
-
- +
+ +
Pool creation not available on mobile
+
+
+ + )}
@@ -68,86 +80,3 @@ const BalancerV3: NextPage = () => { }; export default BalancerV3; - -function UserExperienceAlerts() { - const { targetNetwork: selectedNetwork } = useTargetNetwork(); - const [isInfoAlertVisible, setIsInfoAlertVisible] = useState(true); - const { isWrongNetwork, isWalletConnected } = useValidateNetwork(); - const { chain } = usePoolCreationStore(); - - return !isWalletConnected ? ( -
-
- -
- Please connect a wallet and switch to the network you wish to create a pool - -
-
-
-
- ) : isWrongNetwork ? ( -
-
- -
- You are connected to an unsupported network. To continue, please switch to Sepolia, Ethereum, or Gnosis - -
-
-
-
- ) : chain && selectedNetwork.id !== chain.id ? ( -
-
- -
- You have already begun the pool configuration process. Please switch back to {chain.name} - -
-
-
-
- ) : ( - <> - {!chain && ( -
-
- -
- Make sure you switch to your desired network before beginning pool creation. You cannot switch after - selecting pool type unless you reset progress - -
-
-
-
- )} - {isInfoAlertVisible && ( -
-
- -
- For tips and guidance on pool configuration and creation, check out our - - partner onboarding documentation - -
-
- -
-
- )} - - ); -} diff --git a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx index ad29f323..ec05fa61 100644 --- a/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx +++ b/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx @@ -1,4 +1,3 @@ -import { usePathname } from "next/navigation"; import { useTheme } from "next-themes"; import { useAccount, useSwitchChain } from "wagmi"; import { ArrowsRightLeftIcon } from "@heroicons/react/24/solid"; @@ -17,17 +16,9 @@ export const NetworkOptions = ({ hidden = false }: NetworkOptionsProps) => { const { resolvedTheme } = useTheme(); const isDarkMode = resolvedTheme === "dark"; - // TODO: Update this as v3 adds more network support - const pathname = usePathname(); - // Filter out base and arbitrum for v3 pool creation page - const filteredAllowedNetworks = - pathname === "/v3" - ? allowedNetworks.filter(network => network.id !== 42161 && network.id !== 8453) - : allowedNetworks; - return ( <> - {filteredAllowedNetworks + {allowedNetworks .filter(allowedNetwork => allowedNetwork.id !== chain?.id) .map(allowedNetwork => (
  • diff --git a/packages/nextjs/hooks/balancer/useApiConfig.ts b/packages/nextjs/hooks/balancer/useApiConfig.ts index 29df1fb7..db3ec881 100644 --- a/packages/nextjs/hooks/balancer/useApiConfig.ts +++ b/packages/nextjs/hooks/balancer/useApiConfig.ts @@ -18,6 +18,7 @@ export const useApiConfig = () => { return { url, chainName }; }; +// TODO: Will need to update this as v3 is deployed to more chains export const CHAIN_NAMES: { [key: number]: string } = { 1: "MAINNET", 100: "GNOSIS", diff --git a/packages/nextjs/hooks/v3/index.ts b/packages/nextjs/hooks/v3/index.ts index 482784e8..de31a640 100644 --- a/packages/nextjs/hooks/v3/index.ts +++ b/packages/nextjs/hooks/v3/index.ts @@ -2,9 +2,7 @@ export * from "./usePoolCreationStore"; export * from "./useCreatePool"; export * from "./useInitializePool"; export * from "./useValidatePoolCreationInput"; -export * from "./useValidateNetwork"; export * from "./useMultiSwap"; -export * from "./useVerifyProportionalInit"; export * from "./useBoostableWhitelist"; export * from "./useValidateHooksContract"; export * from "./useValidateRateProvider"; diff --git a/packages/nextjs/hooks/v3/useCreatePool.ts b/packages/nextjs/hooks/v3/useCreatePool.ts index e6d79c75..af0a5195 100644 --- a/packages/nextjs/hooks/v3/useCreatePool.ts +++ b/packages/nextjs/hooks/v3/useCreatePool.ts @@ -56,9 +56,9 @@ export const useCreatePool = () => { name, symbol, swapFeePercentage: parseUnits(swapFeePercentage, SWAP_FEE_PERCENTAGE_DECIMALS), - swapFeeManager: swapFeeManager === "" ? zeroAddress : swapFeeManager, - pauseManager: pauseManager === "" ? zeroAddress : pauseManager, - poolHooksContract: poolHooksContract === "" ? zeroAddress : poolHooksContract, + swapFeeManager: swapFeeManager === "" ? zeroAddress : (swapFeeManager as `0x${string}`), + pauseManager: pauseManager === "" ? zeroAddress : (pauseManager as `0x${string}`), + poolHooksContract: poolHooksContract === "" ? zeroAddress : (poolHooksContract as `0x${string}`), enableDonation, disableUnbalancedLiquidity, }; diff --git a/packages/nextjs/hooks/v3/useInitializePool.ts b/packages/nextjs/hooks/v3/useInitializePool.ts index 16290852..41ca05e8 100644 --- a/packages/nextjs/hooks/v3/useInitializePool.ts +++ b/packages/nextjs/hooks/v3/useInitializePool.ts @@ -1,10 +1,9 @@ -import { BALANCER_ROUTER, InitPool, InitPoolDataProvider, InitPoolInput, balancerRouterAbi } from "@balancer/sdk"; +import { InitPool, InitPoolDataProvider, InitPoolInput, Permit2Helper, PublicWalletClient } from "@balancer/sdk"; import { useMutation } from "@tanstack/react-query"; -import { getContract, parseUnits } from "viem"; +import { parseUnits, publicActions, walletActions } from "viem"; import { usePublicClient, useWalletClient } from "wagmi"; import { useTransactor } from "~~/hooks/scaffold-eth"; import { useBoostableWhitelist, usePoolCreationStore } from "~~/hooks/v3"; -import { createPermit2 } from "~~/utils/permit2Helper"; /** * Handles sending the init pool transaction @@ -25,21 +24,14 @@ export const useInitializePool = () => { if (!chainId) throw new Error("Chain Id missing"); if (!poolType) throw new Error("Pool type missing"); if (!walletClient) throw new Error("Wallet client missing"); + if (!walletClient.account) throw new Error("Wallet account missing"); - const initPoolDataProvider = new InitPoolDataProvider(chainId, rpcUrl); - const poolState = await initPoolDataProvider.getInitPoolData(poolAddress, poolType, protocolVersion); - const initPool = new InitPool(); - - // Make sure all tokenConfigs have decimals and address - tokenConfigs.forEach(token => { - if (token.tokenInfo?.decimals === null || token.address === "") { - throw new Error(`Token ${token.address} is missing tokenInfo.decimals`); - } - }); - + // Build init pool input using pool creation store const amountsIn = tokenConfigs .map(token => { + if (!token.address) throw new Error(`Token is missing address`); if (!token.tokenInfo?.decimals) throw new Error(`Token ${token.address} is missing tokenInfo.decimals`); + const boostedToken = boostableWhitelist?.[token.address]; const address = token.useBoostedVariant ? boostedToken?.address : token.address; const decimals = token.useBoostedVariant ? boostedToken?.decimals : token.tokenInfo?.decimals; @@ -58,33 +50,37 @@ export const useInitializePool = () => { chainId, }; - const { callData: encodedInitData } = initPool.buildCall(initPoolInput, poolState); - - // Setup permit2 stuffs for permitBatchAndCall - const balancerRouterAddress = BALANCER_ROUTER[chainId]; - const client = { public: publicClient, wallet: walletClient }; + // Fetch the necessary pool state + const initPoolDataProvider = new InitPoolDataProvider(chainId, rpcUrl); + const poolState = await initPoolDataProvider.getInitPoolData( + poolAddress as `0x${string}`, + poolType, + protocolVersion, + ); - const { batch, signature } = await createPermit2({ - chainId, - tokens: amountsIn.map(token => ({ address: token.address, amount: token.rawAmount })), - client, - spender: balancerRouterAddress, + const permit2 = await Permit2Helper.signInitPoolApproval({ + ...initPoolInput, + client: walletClient.extend(publicActions).extend(walletActions) as unknown as PublicWalletClient, // TODO: upgrade viem/wagmi to match SDK version of viem to fix type casting + owner: walletClient.account.address as `0x${string}`, }); - const router = getContract({ - address: balancerRouterAddress, - abi: balancerRouterAbi, - client, - }); + const initPool = new InitPool(); - const args = [[], [], batch, signature, [encodedInitData]] as const; - console.log("router.permitBatchAndCall args for initialize pool", args); + const call = initPool.buildCallWithPermit2(initPoolInput, poolState, permit2); - const hash = await writeTx(() => router.write.permitBatchAndCall(args), { - // callbacks to save tx hash's to store - onSafeTxHash: safeHash => updatePool({ initPoolTx: { ...initPoolTx, safeHash } }), - onWagmiTxHash: wagmiHash => updatePool({ initPoolTx: { ...initPoolTx, wagmiHash } }), - }); + const hash = await writeTx( + () => + walletClient.sendTransaction({ + account: walletClient.account, + data: call.callData, + to: call.to, + }), + { + // callbacks to save tx hash's to store + onSafeTxHash: safeHash => updatePool({ initPoolTx: { ...initPoolTx, safeHash } }), + onWagmiTxHash: wagmiHash => updatePool({ initPoolTx: { ...initPoolTx, wagmiHash } }), + }, + ); if (!hash) throw new Error("Missing init pool transaction hash"); return hash; diff --git a/packages/nextjs/hooks/v3/useMultiSwap.ts b/packages/nextjs/hooks/v3/useMultiSwap.ts index 0c9ec9ff..2f428196 100644 --- a/packages/nextjs/hooks/v3/useMultiSwap.ts +++ b/packages/nextjs/hooks/v3/useMultiSwap.ts @@ -53,7 +53,7 @@ export const useMultiSwap = () => { const exactAmountIn = parseUnits(token.amount, token.tokenInfo.decimals); return { - tokenIn: token.address, + tokenIn: token.address as `0x${string}`, steps: [ { pool: boostedToken.address, diff --git a/packages/nextjs/hooks/v3/usePoolCreationStore.ts b/packages/nextjs/hooks/v3/usePoolCreationStore.ts index 71ac7728..67cde520 100644 --- a/packages/nextjs/hooks/v3/usePoolCreationStore.ts +++ b/packages/nextjs/hooks/v3/usePoolCreationStore.ts @@ -1,5 +1,4 @@ import { useEffect } from "react"; -// import { ALLOWED_NETWORKS } from "./useValidateNetwork"; import { PoolType } from "@balancer/sdk"; import { TokenType } from "@balancer/sdk"; import { Address, zeroAddress } from "viem"; @@ -84,10 +83,10 @@ export const initialPoolCreationState = { poolType: undefined, tokenConfigs: [initialTokenConfig, initialTokenConfig], amplificationParameter: "", // only used for stable pools - swapFeePercentage: "", // store as human readable % to be converted later - swapFeeManager: "", - pauseManager: "", - poolHooksContract: "", + swapFeePercentage: "" as const, // store as human readable % to be converted later + swapFeeManager: "" as const, + pauseManager: "" as const, + poolHooksContract: "" as const, disableUnbalancedLiquidity: false, enableDonation: false, // isSuccess is only flipped to true after parsing tx receipt for status diff --git a/packages/nextjs/hooks/v3/useValidateNetwork.ts b/packages/nextjs/hooks/v3/useValidateNetwork.ts deleted file mode 100644 index 6eaf382d..00000000 --- a/packages/nextjs/hooks/v3/useValidateNetwork.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { gnosis, mainnet, sepolia } from "viem/chains"; -import { useWalletClient } from "wagmi"; - -export const ALLOWED_NETWORKS = [sepolia.id, mainnet.id, gnosis.id] as const; - -export function useValidateNetwork() { - const { data: walletClient } = useWalletClient(); - const chainId = walletClient?.chain.id; - const isWalletConnected = !!walletClient; - const isWrongNetwork = - isWalletConnected && chainId !== undefined && !ALLOWED_NETWORKS.includes(chainId as typeof sepolia.id); - - return { isWalletConnected, isWrongNetwork, chainId }; -} diff --git a/packages/nextjs/hooks/v3/useValidatePoolCreationInput.ts b/packages/nextjs/hooks/v3/useValidatePoolCreationInput.ts index 5624f0b4..639ddc4b 100644 --- a/packages/nextjs/hooks/v3/useValidatePoolCreationInput.ts +++ b/packages/nextjs/hooks/v3/useValidatePoolCreationInput.ts @@ -1,11 +1,10 @@ import { PoolType, TokenType } from "@balancer/sdk"; import { isAddress, parseUnits } from "viem"; import { useWalletClient } from "wagmi"; -import { usePoolCreationStore, useUserDataStore, useValidateHooksContract, useValidateNetwork } from "~~/hooks/v3"; +import { usePoolCreationStore, useUserDataStore, useValidateHooksContract } from "~~/hooks/v3"; import { MAX_POOL_NAME_LENGTH, MAX_POOL_SYMBOL_LENGTH } from "~~/utils/constants"; export function useValidatePoolCreationInput() { - const { isWrongNetwork } = useValidateNetwork(); const { data: walletClient } = useWalletClient(); const { userTokenBalances, hasAgreedToWarning } = useUserDataStore(); @@ -24,7 +23,7 @@ export function useValidatePoolCreationInput() { poolHooksContract, } = usePoolCreationStore(); - const isTypeValid = poolType !== undefined && !isWrongNetwork; + const isTypeValid = poolType !== undefined; const isValidTokenWeights = poolType !== PoolType.Weighted || diff --git a/packages/nextjs/hooks/v3/useVerifyProportionalInit.ts b/packages/nextjs/hooks/v3/useVerifyProportionalInit.ts deleted file mode 100644 index 7d5316b7..00000000 --- a/packages/nextjs/hooks/v3/useVerifyProportionalInit.ts +++ /dev/null @@ -1,12 +0,0 @@ -// import { useFetchTokenPrices } from "~~/hooks/token"; -// import { usePoolCreationStore } from "~~/hooks/v3"; - -export const useVerifyProportionalInit = () => { - // const { tokenConfigs } = usePoolCreationStore(); - // const { data: tokenPrices } = useFetchTokenPrices(); - - // console.log("TODO: verify if token usd values match weights from tokenConfig"); - // console.log("tokenConfigs", tokenConfigs); - // console.log("tokenPrices", tokenPrices); - return true; -}; diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index edf336a6..852be152 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -14,7 +14,7 @@ "vercel:yolo": "vercel --build-env NEXT_PUBLIC_IGNORE_BUILD_ERROR=true" }, "dependencies": { - "@balancer/sdk": "^0.33.3", + "@balancer/sdk": "^1.4.0", "@heroicons/react": "^2.0.11", "@rainbow-me/rainbowkit": "2.1.2", "@safe-global/safe-apps-provider": "^0.18.5", diff --git a/packages/nextjs/utils/permit2Helper.ts b/packages/nextjs/utils/permit2Helper.ts index 8054f1a6..02d830a5 100644 --- a/packages/nextjs/utils/permit2Helper.ts +++ b/packages/nextjs/utils/permit2Helper.ts @@ -8,13 +8,13 @@ import { PermitDetails, permit2Abi, } from "@balancer/sdk"; -import { Address, PublicClient, WalletClient, getContract } from "viem"; +import { PublicClient, WalletClient, getContract } from "viem"; export type CreatePermit2 = { chainId: number; - tokens: { address: string; amount: bigint }[]; + tokens: { address: `0x${string}`; amount: bigint }[]; client: { public: PublicClient; wallet: WalletClient }; - spender: Address; + spender: `0x${string}`; }; export const createPermit2 = async ({ client, chainId, tokens, spender }: CreatePermit2) => { @@ -55,7 +55,10 @@ export const createPermit2 = async ({ client, chainId, tokens, spender }: Create message: { ...values, }, - domain, + domain: { + ...domain, + chainId: Number(domain.chainId), + }, primaryType: "PermitBatch", types, }); diff --git a/yarn.lock b/yarn.lock index 93ca3b0e..deefeb9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -286,14 +286,14 @@ __metadata: languageName: node linkType: hard -"@balancer/sdk@npm:^0.33.3": - version: 0.33.3 - resolution: "@balancer/sdk@npm:0.33.3" +"@balancer/sdk@npm:^1.4.0": + version: 1.4.0 + resolution: "@balancer/sdk@npm:1.4.0" dependencies: decimal.js-light: ^2.5.1 lodash.clonedeep: ^4.5.0 - viem: ^2.12.1 - checksum: c0d4cd284d8e5ccabfbcb4215477ea2bd87102c65fb4a856fe4fdc9863c7ecc2fda6e662d1bceab4b7781443ad2adb07826acd5e4585cbae35b6fda152dd6b8e + viem: ^2.22.3 + checksum: 0128b7dd6f59e0a145d91d945a52073ef27de5aa9c7de14f9a7cca2203eff12c97bf76177ba5645dc7147ab7c7f48cf894ec62507917e45a04d23aa2ebc1db27 languageName: node linkType: hard @@ -1659,7 +1659,7 @@ __metadata: version: 0.0.0-use.local resolution: "@se-2/nextjs@workspace:packages/nextjs" dependencies: - "@balancer/sdk": ^0.33.3 + "@balancer/sdk": ^1.4.0 "@heroicons/react": ^2.0.11 "@rainbow-me/rainbowkit": 2.1.2 "@safe-global/safe-apps-provider": ^0.18.5 @@ -8016,6 +8016,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.6.5": + version: 0.6.5 + resolution: "ox@npm:0.6.5" + dependencies: + "@adraffy/ens-normalize": ^1.10.1 + "@noble/curves": ^1.6.0 + "@noble/hashes": ^1.5.0 + "@scure/bip32": ^1.5.0 + "@scure/bip39": ^1.4.0 + abitype: ^1.0.6 + eventemitter3: 5.0.1 + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 2ad755c09652561c71f5d76e8af1d106fb2c09a2a61c3e606fb107dea5e436027438884968f995f4a5d2a8dc5608bd44c54931a2f4385c9db63340f7e1138e21 + languageName: node + linkType: hard + "p-finally@npm:^2.0.0": version: 2.0.1 resolution: "p-finally@npm:2.0.1" @@ -10527,25 +10547,24 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.12.1": - version: 2.18.2 - resolution: "viem@npm:2.18.2" +"viem@npm:^2.22.3": + version: 2.22.10 + resolution: "viem@npm:2.22.10" dependencies: - "@adraffy/ens-normalize": 1.10.0 - "@noble/curves": 1.4.0 - "@noble/hashes": 1.4.0 - "@scure/bip32": 1.4.0 - "@scure/bip39": 1.3.0 - abitype: 1.0.5 - isows: 1.0.4 - webauthn-p256: 0.0.5 - ws: 8.17.1 + "@noble/curves": 1.7.0 + "@noble/hashes": 1.6.1 + "@scure/bip32": 1.6.0 + "@scure/bip39": 1.5.0 + abitype: 1.0.7 + isows: 1.0.6 + ox: 0.6.5 + ws: 8.18.0 peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true - checksum: e7cd42d0a5c94d3ad5ee1d0fcf42520b904f2ca863b859c0e836ebf3ecc137375b22cd4ceb108c2d725d3e694d90d42e145e0c9adb4f4a512aae6095f052a619 + checksum: 6e32423899b816e9ab976f032ff39ca85f147daaceb96e1139d82889b28cb2d476d43b933b4330e02575c11b15dffcc6c934353d83ead5dbddd22f9aaca48dcd languageName: node linkType: hard @@ -10595,16 +10614,6 @@ __metadata: languageName: node linkType: hard -"webauthn-p256@npm:0.0.5": - version: 0.0.5 - resolution: "webauthn-p256@npm:0.0.5" - dependencies: - "@noble/curves": ^1.4.0 - "@noble/hashes": ^1.4.0 - checksum: 2837188d1e6d947c87c5728374fb6aec96387cb766f78e7a04d5903774264feb278d68a639748f09997f591e5278796c662bb5c4e8b8286b0f22254694023584 - languageName: node - linkType: hard - "webextension-polyfill@npm:>=0.10.0 <1.0, webextension-polyfill@npm:^0.10.0": version: 0.10.0 resolution: "webextension-polyfill@npm:0.10.0"