From 6a01e900ab5ad599de3d21852c9fd18bc6f02e2d Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 29 Jul 2024 18:00:15 +0200 Subject: [PATCH 01/46] init connext bridge --- src/components/bridge/BridgeContent.tsx | 11 ++++ .../bridge/connext/ConnextBridge.tsx | 41 ++++++++++++++ .../LiFiBridgeWidget.tsx} | 56 +++++++++++++++++-- src/components/farms/GAlcxWrapper.tsx | 11 +--- src/components/farms/LiquidityMigration.tsx | 11 +--- src/components/vaults/Vaults.tsx | 11 +--- .../vaults/common_actions/Borrow.tsx | 11 +--- src/lib/motion/motion.ts | 9 +++ src/routes/bridge.lazy.tsx | 4 +- 9 files changed, 126 insertions(+), 39 deletions(-) create mode 100644 src/components/bridge/BridgeContent.tsx create mode 100644 src/components/bridge/connext/ConnextBridge.tsx rename src/components/bridge/{BridgeWidget.tsx => lifi/LiFiBridgeWidget.tsx} (59%) create mode 100644 src/lib/motion/motion.ts diff --git a/src/components/bridge/BridgeContent.tsx b/src/components/bridge/BridgeContent.tsx new file mode 100644 index 00000000..cd3a5e0c --- /dev/null +++ b/src/components/bridge/BridgeContent.tsx @@ -0,0 +1,11 @@ +import { ConnextBridge } from "./connext/ConnextBridge"; +import { LiFiBridgeWidget } from "./lifi/LiFiBridgeWidget"; + +export const BridgeContent = () => { + return ( +
+ + +
+ ); +}; diff --git a/src/components/bridge/connext/ConnextBridge.tsx b/src/components/bridge/connext/ConnextBridge.tsx new file mode 100644 index 00000000..b9e47b55 --- /dev/null +++ b/src/components/bridge/connext/ConnextBridge.tsx @@ -0,0 +1,41 @@ +import { Button } from "@/components/ui/button"; +import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; +import { AnimatePresence, m } from "framer-motion"; +import { EyeIcon, EyeOffIcon } from "lucide-react"; +import { useState } from "react"; + +export const ConnextBridge = () => { + const [open, setOpen] = useState(true); + const handleOpen = () => setOpen(!open); + return ( +
+
+

Connext Bridge

+ +
+ + {open && ( + +
+
+ )} +
+
+ ); +}; diff --git a/src/components/bridge/BridgeWidget.tsx b/src/components/bridge/lifi/LiFiBridgeWidget.tsx similarity index 59% rename from src/components/bridge/BridgeWidget.tsx rename to src/components/bridge/lifi/LiFiBridgeWidget.tsx index 0ec58438..5656ff1d 100644 --- a/src/components/bridge/BridgeWidget.tsx +++ b/src/components/bridge/lifi/LiFiBridgeWidget.tsx @@ -1,8 +1,16 @@ -import { LiFiWidget, WidgetConfig } from "@lifi/widget"; +import { WidgetConfig } from "@lifi/widget"; import { arbitrum, mainnet, optimism } from "viem/chains"; import { useConnectModal } from "@rainbow-me/rainbowkit"; -import { useMemo } from "react"; -import { useTheme } from "../providers/ThemeProvider"; +import { Suspense, lazy, useMemo, useState } from "react"; +import { useTheme } from "@/components/providers/ThemeProvider"; +import { Button } from "@/components/ui/button"; +import { EyeIcon, EyeOffIcon } from "lucide-react"; +import { AnimatePresence, m } from "framer-motion"; +import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; + +const LiFiWidget = lazy(() => + import("@lifi/widget").then((mod) => ({ default: mod.LiFiWidget })), +); const widgetConfig = { integrator: "Alchemix", @@ -63,7 +71,9 @@ const widgetConfig = { }, } satisfies WidgetConfig; -export const BridgeWidget = () => { +export const LiFiBridgeWidget = () => { + const [open, setOpen] = useState(false); + const { darkMode } = useTheme(); const { openConnectModal } = useConnectModal(); @@ -97,5 +107,41 @@ export const BridgeWidget = () => { } satisfies WidgetConfig; }, [darkMode, openConnectModal]); - return ; + const handleOpen = () => setOpen(!open); + + return ( +
+
+

LiFi Bridge

+ +
+ + {open && ( + +
+ + + +
+
+ )} +
+
+ ); }; diff --git a/src/components/farms/GAlcxWrapper.tsx b/src/components/farms/GAlcxWrapper.tsx index 490fbf16..2c6feb96 100644 --- a/src/components/farms/GAlcxWrapper.tsx +++ b/src/components/farms/GAlcxWrapper.tsx @@ -19,6 +19,7 @@ import { toast } from "sonner"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; import { EyeOffIcon, EyeIcon } from "lucide-react"; import { AnimatePresence, m } from "framer-motion"; +import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; export const GAlcsWrapper = () => { const chain = useChain(); @@ -192,14 +193,8 @@ export const GAlcsWrapper = () => { initial="collapsed" animate="open" exit="collapsed" - variants={{ - open: { opacity: 1, height: "auto" }, - collapsed: { opacity: 0, height: 0 }, - }} - transition={{ - duration: 0.2, - ease: "easeOut", - }} + variants={accordionVariants} + transition={accordionTransition} >
diff --git a/src/components/farms/LiquidityMigration.tsx b/src/components/farms/LiquidityMigration.tsx index e600a4bc..5849ea5c 100644 --- a/src/components/farms/LiquidityMigration.tsx +++ b/src/components/farms/LiquidityMigration.tsx @@ -36,6 +36,7 @@ import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutati import { useChain } from "@/hooks/useChain"; import { EyeOffIcon, EyeIcon } from "lucide-react"; import { AnimatePresence, m } from "framer-motion"; +import { accordionTransition, accordionVariants } from "@/lib/motion/motion"; const TOKENS_FROM = ["SLP"] as const; const TOKENS_TO = ["AURA", "BALANCER"] as const; @@ -169,14 +170,8 @@ export const LiquidityMigration = () => { initial="collapsed" animate="open" exit="collapsed" - variants={{ - open: { opacity: 1, height: "auto" }, - collapsed: { opacity: 0, height: 0 }, - }} - transition={{ - duration: 0.2, - ease: "easeOut", - }} + variants={accordionVariants} + transition={accordionTransition} >
diff --git a/src/components/vaults/Vaults.tsx b/src/components/vaults/Vaults.tsx index f7d8823a..94c29749 100644 --- a/src/components/vaults/Vaults.tsx +++ b/src/components/vaults/Vaults.tsx @@ -15,6 +15,7 @@ import { Button } from "../ui/button"; import { m, AnimatePresence } from "framer-motion"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { ScrollArea, ScrollBar } from "../ui/scroll-area"; +import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; type SynthFilter = "all" | SynthAsset; type UsedFilter = "all" | "used" | "unused"; @@ -176,14 +177,8 @@ export const Vaults = () => { initial="collapsed" animate="open" exit="collapsed" - variants={{ - open: { opacity: 1, height: "auto" }, - collapsed: { opacity: 0, height: 0 }, - }} - transition={{ - duration: 0.2, - ease: "easeOut", - }} + variants={accordionVariants} + transition={accordionTransition} > {actionTab === "Borrow" && } {actionTab === "Repay" && } diff --git a/src/components/vaults/common_actions/Borrow.tsx b/src/components/vaults/common_actions/Borrow.tsx index c7f066dd..c5f19859 100644 --- a/src/components/vaults/common_actions/Borrow.tsx +++ b/src/components/vaults/common_actions/Borrow.tsx @@ -28,6 +28,7 @@ import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutati import { Switch } from "@/components/ui/switch"; import { AnimatePresence, m } from "framer-motion"; import { Input } from "@/components/ui/input"; +import { accordionTransition, accordionVariants } from "@/lib/motion/motion"; export const Borrow = () => { const queryClient = useQueryClient(); @@ -197,14 +198,8 @@ export const Borrow = () => { initial="collapsed" animate="open" exit="collapsed" - variants={{ - open: { opacity: 1, height: "auto" }, - collapsed: { opacity: 0, height: 0 }, - }} - transition={{ - duration: 0.2, - ease: "easeOut", - }} + variants={accordionVariants} + transition={accordionTransition} className="space-y-4" >
diff --git a/src/lib/motion/motion.ts b/src/lib/motion/motion.ts new file mode 100644 index 00000000..957794e6 --- /dev/null +++ b/src/lib/motion/motion.ts @@ -0,0 +1,9 @@ +export const accordionVariants = { + open: { opacity: 1, height: "auto" }, + collapsed: { opacity: 0, height: 0 }, +}; + +export const accordionTransition = { + duration: 0.2, + ease: "easeOut", +}; diff --git a/src/routes/bridge.lazy.tsx b/src/routes/bridge.lazy.tsx index 229b1c7e..5a5efeb1 100644 --- a/src/routes/bridge.lazy.tsx +++ b/src/routes/bridge.lazy.tsx @@ -1,6 +1,6 @@ import { createLazyFileRoute } from "@tanstack/react-router"; import { Page } from "@/components/common/Page"; -import { BridgeWidget } from "@/components/bridge/BridgeWidget"; +import { BridgeContent } from "@/components/bridge/BridgeContent"; export const Route = createLazyFileRoute("/bridge")({ component: BridgeRoute, @@ -13,7 +13,7 @@ function BridgeRoute() { description="Transfer your tokens to other chains" iconUri="/images/icons/swap_thin.svg" > - + ); } From 0b58bea830d9e8d1847d1246fdfb689970fede82 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 29 Jul 2024 18:07:31 +0200 Subject: [PATCH 02/46] code consistency --- src/components/bridge/{BridgeContent.tsx => Bridge.tsx} | 2 +- src/routes/bridge.lazy.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/components/bridge/{BridgeContent.tsx => Bridge.tsx} (86%) diff --git a/src/components/bridge/BridgeContent.tsx b/src/components/bridge/Bridge.tsx similarity index 86% rename from src/components/bridge/BridgeContent.tsx rename to src/components/bridge/Bridge.tsx index cd3a5e0c..f37023e7 100644 --- a/src/components/bridge/BridgeContent.tsx +++ b/src/components/bridge/Bridge.tsx @@ -1,7 +1,7 @@ import { ConnextBridge } from "./connext/ConnextBridge"; import { LiFiBridgeWidget } from "./lifi/LiFiBridgeWidget"; -export const BridgeContent = () => { +export const Bridge = () => { return (
diff --git a/src/routes/bridge.lazy.tsx b/src/routes/bridge.lazy.tsx index 5a5efeb1..abb32a52 100644 --- a/src/routes/bridge.lazy.tsx +++ b/src/routes/bridge.lazy.tsx @@ -1,6 +1,6 @@ import { createLazyFileRoute } from "@tanstack/react-router"; import { Page } from "@/components/common/Page"; -import { BridgeContent } from "@/components/bridge/BridgeContent"; +import { Bridge } from "@/components/bridge/Bridge"; export const Route = createLazyFileRoute("/bridge")({ component: BridgeRoute, @@ -13,7 +13,7 @@ function BridgeRoute() { description="Transfer your tokens to other chains" iconUri="/images/icons/swap_thin.svg" > - + ); } From 8fc3fcf9837f8f765ffd3abade6a2b31dbe520bc Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 5 Aug 2024 19:15:25 +0200 Subject: [PATCH 03/46] adjust withdraw amounts for aave yield bearing tokens --- src/abi/staticTokenAdapter.ts | 6 +++ .../common/input/VaultWithdrawTokenInput.tsx | 29 +++++++++++++- src/components/vaults/row/Withdraw.tsx | 5 ++- src/lib/mutations/useWithdraw.ts | 39 +++++++++++++++---- 4 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 src/abi/staticTokenAdapter.ts diff --git a/src/abi/staticTokenAdapter.ts b/src/abi/staticTokenAdapter.ts new file mode 100644 index 00000000..634337f7 --- /dev/null +++ b/src/abi/staticTokenAdapter.ts @@ -0,0 +1,6 @@ +import { parseAbi } from "viem"; + +export const staticTokenAdapterAbi = parseAbi([ + "function staticToDynamicAmount(uint256 amount) external view returns (uint256 dynamicAmount)", + "function dynamicToStaticAmount(uint256 amount) external view returns (uint256 staticAmount)", +]); diff --git a/src/components/common/input/VaultWithdrawTokenInput.tsx b/src/components/common/input/VaultWithdrawTokenInput.tsx index 732983de..fc104774 100644 --- a/src/components/common/input/VaultWithdrawTokenInput.tsx +++ b/src/components/common/input/VaultWithdrawTokenInput.tsx @@ -6,6 +6,7 @@ import { formatEther, formatUnits, parseUnits, zeroAddress } from "viem"; import { useWatchQuery } from "@/hooks/useWatchQuery"; import { useMemo } from "react"; import { TokenInput } from "./TokenInput"; +import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; export const VaultWithdrawTokenInput = ({ amount, @@ -131,8 +132,34 @@ export const VaultWithdrawTokenInput = ({ }, }); + /** + * Adjusted for Aave token adapters. + * So that when withdrawing Aave yield bearing token, you get exactly what you input. + * Used in conjunction with `dynamicToStaticAmount` read in `useWithdraw.tsx`. + * It is safe to assume that static adapter has same decimals as yield token (it inherits from it). + */ + const { data: balanceForYieldTokenAdapter } = useReadContract({ + address: vault.yieldToken, + chainId: chain.id, + abi: staticTokenAdapterAbi, + functionName: "staticToDynamicAmount", + args: [ + parseUnits(balanceForYieldToken ?? "0", vault.yieldTokenParams.decimals), + ], + query: { + enabled: + balanceForYieldToken !== undefined && + isSelectedTokenYieldToken && + !!vault.metadata.yieldTokenOverride, + select: (balance) => + formatUnits(balance, vault.yieldTokenParams.decimals), + }, + }); + const balance = isSelectedTokenYieldToken - ? balanceForYieldToken + ? vault.metadata.yieldTokenOverride + ? balanceForYieldTokenAdapter + : balanceForYieldToken : balanceForUnderlying; return ( diff --git a/src/components/vaults/row/Withdraw.tsx b/src/components/vaults/row/Withdraw.tsx index f2a924a5..d9c5086a 100644 --- a/src/components/vaults/row/Withdraw.tsx +++ b/src/components/vaults/row/Withdraw.tsx @@ -46,7 +46,7 @@ export const Withdraw = ({ const token = selection.find((token) => token.address === tokenAddress)!; - const isSelecedTokenYieldToken = + const isSelectedTokenYieldToken = token.address.toLowerCase() === yieldTokenData.address.toLowerCase(); const { isApprovalNeeded, writeApprove, writeWithdraw, isFetching } = @@ -57,6 +57,7 @@ export const Withdraw = ({ slippage, yieldToken: yieldTokenData, setAmount, + isSelectedTokenYieldToken, }); const onCtaClick = useCallback(() => { @@ -102,7 +103,7 @@ export const Withdraw = ({ setAmount={setAmount} tokenSymbol={token.symbol} tokenDecimals={token.decimals} - isSelectedTokenYieldToken={isSelecedTokenYieldToken} + isSelectedTokenYieldToken={isSelectedTokenYieldToken} vault={vault} />
diff --git a/src/lib/mutations/useWithdraw.ts b/src/lib/mutations/useWithdraw.ts index f098a5c1..557ce162 100644 --- a/src/lib/mutations/useWithdraw.ts +++ b/src/lib/mutations/useWithdraw.ts @@ -18,6 +18,8 @@ import { wethGatewayAbi } from "@/abi/wethGateway"; import { calculateMinimumOut } from "@/utils/helpers/minAmountWithSlippage"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; +import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; +import { isInputZero } from "@/utils/inputNotZero"; export const useWithdraw = ({ vault, @@ -26,6 +28,7 @@ export const useWithdraw = ({ slippage, yieldToken, setAmount, + isSelectedTokenYieldToken, }: { amount: string; slippage: string; @@ -33,6 +36,7 @@ export const useWithdraw = ({ selectedToken: Token; yieldToken: Token; setAmount: (amount: string) => void; + isSelectedTokenYieldToken: boolean; }) => { const chain = useChain(); const queryClient = useQueryClient(); @@ -45,17 +49,38 @@ export const useWithdraw = ({ const { address } = useAccount(); - const isSelecedTokenYieldToken = - selectedToken.address.toLowerCase() === yieldToken.address.toLowerCase(); + /** + * Adjusted for Aave token adapters. + * So that when withdrawing Aave yield bearing token, you get exactly what you input. + * Used in conjunction with `staticToDynamic` read in `VaultWithdrawTokenInput.tsx`. + * It is safe to assume that static adapter has same decimals as yield token (it inherits from it). + */ + const { data: aaveAdjustedAmount } = useReadContract({ + address: vault.yieldToken, + abi: staticTokenAdapterAbi, + functionName: "dynamicToStaticAmount", + args: [parseUnits(amount, selectedToken.decimals)], + query: { + enabled: + !isInputZero(amount) && + isSelectedTokenYieldToken && + !!vault.metadata.yieldTokenOverride, + }, + }); + + const withdrawAmount = + isSelectedTokenYieldToken && !!vault.metadata.yieldTokenOverride + ? aaveAdjustedAmount + : parseUnits(amount, selectedToken.decimals); const { data: sharesFromYieldToken } = useReadContract({ address: vault.alchemist.address, abi: alchemistV2Abi, chainId: chain.id, functionName: "convertYieldTokensToShares", - args: [vault.yieldToken, parseUnits(amount, selectedToken.decimals)], + args: [vault.yieldToken, withdrawAmount ?? 0n], query: { - enabled: isSelecedTokenYieldToken, + enabled: isSelectedTokenYieldToken && !isInputZero(amount), }, }); @@ -66,15 +91,15 @@ export const useWithdraw = ({ functionName: "convertUnderlyingTokensToShares", args: [vault.yieldToken, parseUnits(amount, selectedToken.decimals)], query: { - enabled: !isSelecedTokenYieldToken, + enabled: !isSelectedTokenYieldToken && !isInputZero(amount), }, }); - const shares = isSelecedTokenYieldToken + const shares = isSelectedTokenYieldToken ? sharesFromYieldToken : sharesFromUnderlyingToken; - const minimumOutUnderlying = !isSelecedTokenYieldToken + const minimumOutUnderlying = !isSelectedTokenYieldToken ? calculateMinimumOut( parseUnits(amount, selectedToken.decimals), parseUnits(slippage, 2), From c334484da0aef96e8619ab2531df8c518424cc25 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 5 Aug 2024 19:23:30 +0200 Subject: [PATCH 04/46] add comment for yieldTokenOverride --- src/lib/config/metadataTypes.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/config/metadataTypes.ts b/src/lib/config/metadataTypes.ts index 6227c034..cee1ebc7 100644 --- a/src/lib/config/metadataTypes.ts +++ b/src/lib/config/metadataTypes.ts @@ -56,6 +56,12 @@ export interface VaultMetadata { wethGateway?: Address; gateway?: Address; migrator?: Address; + /** + * This is the address of the actual yield bearing aave token, + * the regular yield token address in this case becomes a static token adapter, + * that we use for the vaults. + * If it exists, means the vault is using static token adapter. + */ yieldTokenOverride?: Address; strategy?: string; beta?: boolean; From 855ca04845eea36573dc76799ec5869028820fb2 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Tue, 6 Aug 2024 17:00:25 +0200 Subject: [PATCH 05/46] connext bridge logic --- package.json | 2 + pnpm-lock.yaml | 2856 ++++++++++++++++- .../bridge/connext/ConnextBridge.tsx | 16 +- .../bridge/connext/ConnextBridgeWidget.tsx | 304 ++ src/hooks/useEthersSigner.ts | 26 + src/lib/queries/queriesSchema.ts | 2 + 6 files changed, 3195 insertions(+), 11 deletions(-) create mode 100644 src/components/bridge/connext/ConnextBridgeWidget.tsx create mode 100644 src/hooks/useEthersSigner.ts diff --git a/package.json b/package.json index 97446ded..69d4da69 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "preview": "vite preview" }, "dependencies": { + "@connext/sdk": "^2.4.1", "@lifi/widget": "^3.0.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-dialog": "^1.1.1", @@ -29,6 +30,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "dayjs": "^1.11.12", + "ethers": "5", "framer-motion": "^11.3.19", "graphql": "^16.9.0", "graphql-request": "^7.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72c46188..732ffbc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@connext/sdk': + specifier: ^2.4.1 + version: 2.4.1(bufferutil@4.0.8)(sinon@18.0.0)(utf-8-validate@5.0.10) '@lifi/widget': specifier: ^3.0.0 version: 3.0.0(o3fmjrcam7fnahpcul2ssh6cbq) @@ -62,6 +65,9 @@ importers: dayjs: specifier: ^1.11.12 version: 1.11.12 + ethers: + specifier: '5' + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) framer-motion: specifier: ^11.3.19 version: 11.3.19(@emotion/is-prop-valid@1.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -956,6 +962,12 @@ packages: '@coinbase/wallet-sdk@4.0.4': resolution: {integrity: sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==} + '@connext/nxtp-utils@2.4.1': + resolution: {integrity: sha512-XlSLKvA3wWXU2VIdd/93+OeK5en3mQ/8Xyh2TPOZhgyEFGMRPuWg19hYpNwwMOzduKU1ovekBMxqgo4T2YsaFg==} + + '@connext/sdk@2.4.1': + resolution: {integrity: sha512-1joMuZHL+1BjDs130wC+PQ5cS5HxLsSPp4EGBAGP64AehfcKMKU3s4ZYZW0l/qjs5Wovzaaho/X+cvnvPPgFYA==} + '@emotion/babel-plugin@11.12.0': resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} @@ -1184,6 +1196,12 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ethereumjs/block@3.6.3': + resolution: {integrity: sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==} + + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + '@ethereumjs/common@3.2.0': resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} @@ -1192,6 +1210,9 @@ packages: engines: {node: '>=14'} hasBin: true + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -1200,6 +1221,96 @@ packages: resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@floating-ui/core@1.6.4': resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} @@ -1342,6 +1453,15 @@ packages: '@lit/reactive-element@1.6.3': resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@maticnetwork/maticjs-web3@1.0.4': + resolution: {integrity: sha512-cMnp42jjGNfVZRL80yUYfD9abcyUC2VpKvjFQtU44A3A0M9sbCtOOMMkE4k8FWoccxIPi891rtc+nowdNahKxg==} + peerDependencies: + '@maticnetwork/maticjs': ^3.2.0 + + '@maticnetwork/maticjs@3.6.6': + resolution: {integrity: sha512-VhbK9yHdRgQl9GWt1XwasHTDEImd0ApmHFG0yCN8xjPz0YvXgsSPb+p+M5JzQYEgLQGZ3L/K3nnVYHBTiRIhPA==} + engines: {node: '>=8.0.0'} + '@metamask/eth-json-rpc-provider@1.0.1': resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} @@ -2358,15 +2478,34 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.25.21': + resolution: {integrity: sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@11.2.2': + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + + '@sinonjs/samsam@8.0.0': + resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + + '@sinonjs/text-encoding@0.7.2': + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -2569,6 +2708,14 @@ packages: '@swc/helpers@0.5.12': resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@tanstack/eslint-plugin-query@5.51.12': resolution: {integrity: sha512-vzUXXIVzDP2c6wVSJ+1imPGaKQ2ILuWnta64FJc/JnQ5WunfO17bQJSk6uKDbzTQG/YKgPYBMG3C9qFA4b7Ayg==} peerDependencies: @@ -2647,6 +2794,9 @@ packages: '@tanstack/virtual-core@3.8.1': resolution: {integrity: sha512-uNtAwenT276M9QYCjTBoHZ8X3MUeCRoGK59zPi92hMIxdfS9AyHjkDWJ94WroDxnv48UE+hIeo21BU84jKc8aQ==} + '@types/abstract-leveldown@7.2.5': + resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2659,6 +2809,12 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -2671,6 +2827,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -2680,6 +2839,15 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/level-errors@3.0.2': + resolution: {integrity: sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==} + + '@types/levelup@4.3.3': + resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -2698,6 +2866,9 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -2710,6 +2881,9 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} @@ -3004,6 +3178,17 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + + abstract-leveldown@6.2.3: + resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} + engines: {node: '>=6'} + + abstract-leveldown@6.3.0: + resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} + engines: {node: '>=6'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3018,13 +3203,27 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + alge@0.8.1: resolution: {integrity: sha512-kiV9nTt+XIauAXsowVygDxMZLplZxDWt0W8plE/nB32/V2ziM/P/TxDbSVK7FYIUt2Xo16h3/htDh199LNPCKQ==} @@ -3089,6 +3288,9 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -3123,6 +3325,16 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3141,6 +3353,9 @@ packages: async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -3156,6 +3371,15 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.1: + resolution: {integrity: sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==} + + axios@1.3.3: + resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==} + babel-core@7.0.0-bridge.0: resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: @@ -3198,10 +3422,19 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} engines: {node: '>= 10.0.0'} + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -3212,12 +3445,25 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} @@ -3237,6 +3483,9 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + browserslist@4.23.1: resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3253,12 +3502,24 @@ packages: bs58@5.0.0: resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + + buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -3273,10 +3534,26 @@ packages: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -3315,6 +3592,22 @@ packages: caniuse-lite@1.0.30001643: resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chai-as-promised@7.1.1: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + + chai-subset@1.6.0: + resolution: {integrity: sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==} + engines: {node: '>=4'} + + chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -3331,6 +3624,9 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -3339,6 +3635,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chrome-launcher@0.15.2: resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} engines: {node: '>=12.13.0'} @@ -3351,9 +3650,20 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -3380,6 +3690,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -3416,6 +3729,10 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} @@ -3455,6 +3772,17 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -3464,12 +3792,26 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -3492,6 +3834,12 @@ packages: engines: {node: '>=0.8'} hasBin: true + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} @@ -3510,6 +3858,9 @@ packages: uWebSockets.js: optional: true + crypto-js@3.3.0: + resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -3522,6 +3873,14 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -3575,6 +3934,18 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -3592,6 +3963,14 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + deferred-leveldown@5.3.0: + resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} + engines: {node: '>=6'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3611,6 +3990,10 @@ packages: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} @@ -3639,6 +4022,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -3660,6 +4047,9 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -3669,6 +4059,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + eciesjs@0.3.19: resolution: {integrity: sha512-b+PkRDZ3ym7HEcnbxc22CMVCpgsnr8+gGgST3U5PtgeX1luvINgfXW7efOyUtmn/jFtA/lg5ywBi/Uazf4oeaA==} @@ -3681,6 +4074,9 @@ packages: electron-to-chromium@1.5.2: resolution: {integrity: sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==} + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.6: resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} @@ -3697,6 +4093,10 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encoding-down@6.3.0: + resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} + engines: {node: '>=6'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -3716,6 +4116,10 @@ packages: engines: {node: '>=4'} hasBin: true + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -3757,12 +4161,23 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -3817,6 +4232,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3856,19 +4275,48 @@ packages: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + eth-json-rpc-filters@6.0.1: resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} engines: {node: '>=14.0.0'} + eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + + eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} eth-rpc-errors@4.0.3: resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -3876,6 +4324,9 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -3886,6 +4337,9 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3894,10 +4348,24 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} @@ -3954,6 +4422,10 @@ packages: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -3987,6 +4459,15 @@ packages: resolution: {integrity: sha512-82yKXpz7iWknWFsognZUf5a6mBQLnVrYoYSU9Nbu7FTOpKlu3v9ehpiI9mYXuaIO3J0ojX1b83M/InXvld9HUw==} engines: {node: '>=0.4.0'} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3994,6 +4475,24 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -4015,10 +4514,16 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -4034,6 +4539,9 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4063,6 +4571,10 @@ packages: get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4075,6 +4587,9 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4092,6 +4607,9 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -4116,6 +4634,14 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4145,6 +4671,15 @@ packages: h3@1.12.0: resolution: {integrity: sha512-Zi/CcNeWBXDrFNlV0hUBJQR9F7a96RjMeAZweW/ZWkR9fuXrMcvKnSA63f/zZ9l0GgQOZDVHGvXivNN9PWOwhA==} + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -4171,6 +4706,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -4206,14 +4745,32 @@ packages: html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -4225,15 +4782,26 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperid@3.1.1: + resolution: {integrity: sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==} + i18next-browser-languagedetector@7.1.0: resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} i18next@23.11.5: resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -4246,6 +4814,12 @@ packages: engines: {node: '>=16.x'} hasBin: true + immediate@3.2.3: + resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} + + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -4269,9 +4843,16 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + interval-promise@1.4.0: + resolution: {integrity: sha512-PUwEmGqUglJhb6M01JNvMDvxr4DA8FCeYoYCLHPEcBBZiq/8yOpCchfs1VJui7fXj69l170gAxzF1FeSA0nSlg==} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -4346,6 +4927,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -4354,6 +4938,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -4423,6 +5011,9 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -4467,6 +5058,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + isomorphic-unfetch@3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} @@ -4480,6 +5074,9 @@ packages: peerDependencies: ws: '*' + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -4530,6 +5127,12 @@ packages: js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4541,6 +5144,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} @@ -4581,6 +5187,12 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4599,10 +5211,17 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -4621,6 +5240,42 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + level-codec@9.0.2: + resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} + engines: {node: '>=6'} + + level-concat-iterator@2.0.1: + resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} + engines: {node: '>=6'} + + level-errors@2.0.1: + resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} + engines: {node: '>=6'} + + level-iterator-stream@4.0.2: + resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} + engines: {node: '>=6'} + + level-mem@5.0.1: + resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} + engines: {node: '>=6'} + + level-packager@5.1.1: + resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} + engines: {node: '>=6'} + + level-supports@1.0.1: + resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} + engines: {node: '>=6'} + + level-ws@2.0.0: + resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} + engines: {node: '>=6'} + + levelup@4.4.0: + resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} + engines: {node: '>=6'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -4674,6 +5329,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} @@ -4701,12 +5359,23 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.3.0: resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} engines: {node: 14 || >=16.14} @@ -4717,6 +5386,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + lucide-react@0.408.0: resolution: {integrity: sha512-8kETAAeWmOvtGIr7HPHm51DXoxlfkNncQ5FZWXR+abX8saQwMYXANWIkUstaYtcKSo/imOe/q+tVFA8ANzdSVA==} peerDependencies: @@ -4735,12 +5407,26 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memdown@5.1.0: + resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} + engines: {node: '>=6'} + memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -4752,6 +5438,17 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + merkle-patricia-tree@4.2.4: + resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} + + merkletreejs@0.3.9: + resolution: {integrity: sha512-NjlATjJr4NEn9s8v/VEHhgwRWaE1eA/Une07d9SEqKzULJi1Wsh0Y3svwJdP2bYLMmgSBHzOrNydMWM1NN9VeQ==} + engines: {node: '>= 7.6.0'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + metro-babel-transformer@0.80.9: resolution: {integrity: sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==} engines: {node: '>=18'} @@ -4855,6 +5552,17 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -4871,10 +5579,16 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + mipd@0.0.7: resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: @@ -4886,6 +5600,11 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -4898,6 +5617,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + modern-ahocorasick@1.0.1: resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} @@ -4917,12 +5639,34 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4938,6 +5682,12 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + nise@6.0.0: + resolution: {integrity: sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -5002,6 +5752,10 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -5013,6 +5767,13 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + ob1@0.80.9: resolution: {integrity: sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==} engines: {node: '>=18'} @@ -5052,6 +5813,9 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + ofetch@1.3.4: resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} @@ -5061,6 +5825,10 @@ packages: on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -5107,6 +5875,14 @@ packages: outdent@0.8.0: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -5138,6 +5914,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -5177,6 +5956,12 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5184,10 +5969,20 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -5214,13 +6009,23 @@ packages: pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@1.0.0: + resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} + pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino@7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true + pino@8.10.0: + resolution: {integrity: sha512-ODfIe+giJtQGsvNAEj5/sHHpL3TFBg161JBH4W62Hc0l0PJjsDFD1R7meLI4PZ2aoHDJznxFNShkJcaG/qJToQ==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -5363,6 +6168,13 @@ packages: process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + process-warning@2.3.2: + resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -5373,12 +6185,29 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -5398,6 +6227,18 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -5416,13 +6257,24 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + react-devtools-core@5.3.1: resolution: {integrity: sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==} @@ -5556,6 +6408,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -5571,6 +6427,10 @@ packages: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recast@0.21.5: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} @@ -5610,13 +6470,25 @@ packages: remeda@1.61.0: resolution: {integrity: sha512-caKfSz9rDeSKBQQnlJnVW3mbVdFgxgGWQKq1XlFokqjf+hQD5gxutLGTTY2A/x24UxVyJe9gH5fAkFI63ULw4A==} + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -5633,6 +6505,9 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -5651,6 +6526,13 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + rollup-plugin-visualizer@5.12.0: resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} engines: {node: '>=14'} @@ -5690,12 +6572,22 @@ packages: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + secp256k1@5.0.0: resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} engines: {node: '>=14.0.0'} @@ -5704,6 +6596,10 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semaphore-async-await@1.5.1: + resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} + engines: {node: '>=4.1'} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -5734,6 +6630,10 @@ packages: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} + servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -5745,6 +6645,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -5781,6 +6684,21 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + + sinon-chai@3.7.0: + resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} + peerDependencies: + chai: ^4.0.0 + sinon: '>=4.0.0' + + sinon@18.0.0: + resolution: {integrity: sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5806,6 +6724,9 @@ packages: sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + sonner@1.5.0: resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} peerDependencies: @@ -5842,6 +6763,11 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -5870,6 +6796,10 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -5930,6 +6860,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5971,6 +6905,9 @@ packages: svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -5988,6 +6925,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -6017,6 +6958,9 @@ packages: thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -6026,6 +6970,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -6062,9 +7010,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -6083,6 +7039,12 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6103,6 +7065,13 @@ packages: resolution: {integrity: sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==} engines: {node: '>=16'} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -6119,6 +7088,9 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript@5.5.3: resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} @@ -6133,6 +7105,9 @@ packages: uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -6239,6 +7214,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + use-callback-ref@1.3.2: resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} @@ -6273,6 +7251,9 @@ packages: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6283,10 +7264,18 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid-parse@1.1.0: + resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} + uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -6307,10 +7296,17 @@ packages: react: optional: true + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + viem@2.18.4: resolution: {integrity: sha512-JGdN+PgBnZMbm7fc9o0SfHvL0CKyfrlhBUtaz27V+PeHO43Kgc9Zd4WyIbM8Brafq4TvVcnriRFW/FVGOzwEJw==} peerDependencies: @@ -6406,6 +7402,90 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + + web3-eth-abi@1.10.4: + resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} + engines: {node: '>=8.0.0'} + + web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + webauthn-p256@0.0.5: resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} @@ -6422,6 +7502,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} + whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -6478,6 +7562,17 @@ packages: write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@6.2.3: resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} peerDependencies: @@ -6489,6 +7584,18 @@ packages: utf-8-validate: optional: true + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -6525,6 +7632,15 @@ packages: utf-8-validate: optional: true + xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + + xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} @@ -6540,6 +7656,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -7637,6 +8757,45 @@ snapshots: preact: 10.23.1 sha.js: 2.4.11 + '@connext/nxtp-utils@2.4.1(bufferutil@4.0.8)(sinon@18.0.0)(utf-8-validate@5.0.10)': + dependencies: + '@maticnetwork/maticjs': 3.6.6 + '@maticnetwork/maticjs-web3': 1.0.4(@maticnetwork/maticjs@3.6.6)(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@sinclair/typebox': 0.25.21 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + axios: 1.3.3 + chai: 4.3.7 + chai-as-promised: 7.1.1(chai@4.3.7) + chai-subset: 1.6.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hyperid: 3.1.1 + interval-promise: 1.4.0 + merkletreejs: 0.3.9 + pino: 8.10.0 + secp256k1: 4.0.3 + sinon-chai: 3.7.0(chai@4.3.7)(sinon@18.0.0) + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - sinon + - supports-color + - utf-8-validate + + '@connext/sdk@2.4.1(bufferutil@4.0.8)(sinon@18.0.0)(utf-8-validate@5.0.10)': + dependencies: + '@connext/nxtp-utils': 2.4.1(bufferutil@4.0.8)(sinon@18.0.0)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + isomorphic-fetch: 3.0.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - sinon + - supports-color + - utf-8-validate + '@emotion/babel-plugin@11.12.0': dependencies: '@babel/helper-module-imports': 7.24.7 @@ -7830,6 +8989,18 @@ snapshots: '@eslint/js@8.57.0': {} + '@ethereumjs/block@3.6.3': + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + ethereumjs-util: 7.1.5 + merkle-patricia-tree: 4.2.4 + + '@ethereumjs/common@2.6.5': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + '@ethereumjs/common@3.2.0': dependencies: '@ethereumjs/util': 8.1.0 @@ -7837,6 +9008,11 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} + '@ethereumjs/tx@3.5.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 @@ -7850,6 +9026,261 @@ snapshots: ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@floating-ui/core@1.6.4': dependencies: '@floating-ui/utils': 0.2.4 @@ -8020,6 +9451,25 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.2.0 + '@maticnetwork/maticjs-web3@1.0.4(@maticnetwork/maticjs@3.6.6)(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@maticnetwork/maticjs': 3.6.6 + web3: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@maticnetwork/maticjs@3.6.6': + dependencies: + '@ethereumjs/block': 3.6.3 + ethereumjs-util: 7.1.5 + merkle-patricia-tree: 4.2.4 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + '@metamask/eth-json-rpc-provider@1.0.1': dependencies: '@metamask/json-rpc-engine': 7.3.3 @@ -9286,9 +10736,17 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox@0.25.21': {} + '@sinclair/typebox@0.27.8': {} - '@sinonjs/commons@3.0.1': + '@sindresorhus/is@4.6.0': {} + + '@sinonjs/commons@2.0.0': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -9296,6 +10754,18 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@11.2.2': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/samsam@8.0.0': + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.0.8 + + '@sinonjs/text-encoding@0.7.2': {} + '@socket.io/component-emitter@3.1.2': {} '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.1.3(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': @@ -9599,6 +11069,14 @@ snapshots: dependencies: tslib: 2.6.3 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + '@tanstack/eslint-plugin-query@5.51.12(eslint@8.57.0)(typescript@5.5.3)': dependencies: '@typescript-eslint/utils': 8.0.0-alpha.30(eslint@8.57.0)(typescript@5.5.3) @@ -9690,6 +11168,8 @@ snapshots: '@tanstack/virtual-core@3.8.1': {} + '@types/abstract-leveldown@7.2.5': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.7 @@ -9711,6 +11191,17 @@ snapshots: dependencies: '@babel/types': 7.24.7 + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 22.0.0 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.0.0 + '@types/responselike': 1.0.3 + '@types/connect@3.4.38': dependencies: '@types/node': 22.0.0 @@ -9723,6 +11214,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/http-cache-semantics@4.0.4': {} + '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -9733,6 +11226,18 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.0.0 + + '@types/level-errors@3.0.2': {} + + '@types/levelup@4.3.3': + dependencies: + '@types/abstract-leveldown': 7.2.5 + '@types/level-errors': 3.0.2 + '@types/node': 22.0.0 + '@types/ms@0.7.34': {} '@types/node-forge@1.3.11': @@ -9751,6 +11256,10 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 22.0.0 + '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': @@ -9766,6 +11275,10 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.0.0 + '@types/secp256k1@4.0.6': dependencies: '@types/node': 22.0.0 @@ -10391,6 +11904,24 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abortcontroller-polyfill@1.7.5: {} + + abstract-leveldown@6.2.3: + dependencies: + buffer: 5.7.1 + immediate: 3.2.3 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + + abstract-leveldown@6.3.0: + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -10402,10 +11933,16 @@ snapshots: acorn@8.12.1: {} + aes-js@3.0.0: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: + ajv: 8.12.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -10413,6 +11950,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + alge@0.8.1: dependencies: lodash.ismatch: 4.4.0 @@ -10472,6 +12016,8 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-flatten@1.1.1: {} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 @@ -10534,6 +12080,14 @@ snapshots: asap@2.0.6: {} + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assertion-error@1.1.0: {} + assertion-error@2.0.1: {} ast-types@0.15.2: @@ -10548,6 +12102,8 @@ snapshots: dependencies: tslib: 2.6.3 + asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} autoprefixer@10.4.19(postcss@8.4.39): @@ -10564,6 +12120,18 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 + aws-sign2@0.7.0: {} + + aws4@1.13.1: {} + + axios@1.3.3: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + babel-core@7.0.0-bridge.0(@babel/core@7.24.7): dependencies: '@babel/core': 7.24.7 @@ -10623,10 +12191,18 @@ snapshots: base64-js@1.5.1: {} + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bech32@1.1.4: {} + bigint-buffer@1.1.5: dependencies: bindings: 1.5.0 + bignumber.js@9.1.2: {} + binary-extensions@2.3.0: {} bindings@1.5.0: @@ -10639,10 +12215,33 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + blakejs@1.2.1: {} + + bluebird@3.7.2: {} + + bn.js@4.11.6: {} + bn.js@4.12.0: {} bn.js@5.2.1: {} + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + borsh@0.7.0: dependencies: bn.js: 5.2.1 @@ -10666,6 +12265,15 @@ snapshots: brorand@1.1.0: {} + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + browserslist@4.23.1: dependencies: caniuse-lite: 1.0.30001640 @@ -10688,12 +12296,24 @@ snapshots: dependencies: base-x: 4.0.0 + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + bser@2.1.1: dependencies: node-int64: 0.4.0 buffer-from@1.1.2: {} + buffer-reverse@1.0.1: {} + + buffer-to-arraybuffer@0.0.5: {} + + buffer-xor@1.0.3: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -10710,8 +12330,24 @@ snapshots: bytes@3.0.0: {} + bytes@3.1.2: {} + cac@6.7.14: {} + cacheable-lookup@5.0.4: {} + + cacheable-lookup@6.1.0: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -10742,6 +12378,25 @@ snapshots: caniuse-lite@1.0.30001643: {} + caseless@0.12.0: {} + + chai-as-promised@7.1.1(chai@4.3.7): + dependencies: + chai: 4.3.7 + check-error: 1.0.3 + + chai-subset@1.6.0: {} + + chai@4.3.7: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -10763,6 +12418,10 @@ snapshots: chalk@5.3.0: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + check-error@2.1.1: {} chokidar@3.6.0: @@ -10777,6 +12436,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + chrome-launcher@0.15.2: dependencies: '@types/node': 22.0.0 @@ -10790,10 +12451,25 @@ snapshots: ci-info@3.9.0: {} + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + citty@0.1.6: dependencies: consola: 3.2.3 + class-is@1.1.0: {} + class-variance-authority@0.7.0: dependencies: clsx: 2.0.0 @@ -10828,6 +12504,10 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clone@1.0.4: {} clsx@1.2.1: {} @@ -10852,6 +12532,10 @@ snapshots: colorette@1.4.0: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + command-exists@1.2.9: {} commander@2.20.3: {} @@ -10893,18 +12577,41 @@ snapshots: consola@3.2.3: {} + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-hash@2.5.2: + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + + content-type@1.0.5: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} cookie-es@1.2.2: {} + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.2 + core-util-is@1.0.2: {} + core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -10931,6 +12638,23 @@ snapshots: crc-32@1.2.2: {} + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 @@ -10951,12 +12675,23 @@ snapshots: crossws@0.2.4: {} + crypto-js@3.3.0: {} + css-what@6.1.0: {} cssesc@3.0.0: {} csstype@3.1.3: {} + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -10997,6 +12732,18 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -11009,6 +12756,13 @@ snapshots: dependencies: clone: 1.0.4 + defer-to-connect@2.0.1: {} + + deferred-leveldown@5.3.0: + dependencies: + abstract-leveldown: 6.2.3 + inherits: 2.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -11027,6 +12781,8 @@ snapshots: delay@5.0.0: {} + delayed-stream@1.0.0: {} + denodeify@1.2.1: {} depd@2.0.0: {} @@ -11043,6 +12799,8 @@ snapshots: didyoumean@1.2.2: {} + diff@5.2.0: {} + dijkstrajs@1.0.3: {} dir-glob@3.0.1: @@ -11064,6 +12822,8 @@ snapshots: '@babel/runtime': 7.25.0 csstype: 3.1.3 + dom-walk@0.1.2: {} + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -11078,6 +12838,11 @@ snapshots: eastasianwidth@0.2.0: {} + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + eciesjs@0.3.19: dependencies: '@types/secp256k1': 4.0.6 @@ -11090,6 +12855,16 @@ snapshots: electron-to-chromium@1.5.2: {} + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + elliptic@6.5.6: dependencies: bn.js: 4.12.0 @@ -11108,6 +12883,13 @@ snapshots: encodeurl@1.0.2: {} + encoding-down@6.3.0: + dependencies: + abstract-leveldown: 6.3.0 + inherits: 2.0.4 + level-codec: 9.0.2 + level-errors: 2.0.1 + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -11130,6 +12912,10 @@ snapshots: envinfo@7.13.0: {} + errno@0.1.8: + dependencies: + prr: 1.0.1 + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -11235,12 +13021,30 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + es6-promise@4.2.8: {} es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -11358,6 +13162,13 @@ snapshots: transitivePeerDependencies: - supports-color + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + espree@9.6.1: dependencies: acorn: 8.12.1 @@ -11396,6 +13207,11 @@ snapshots: transitivePeerDependencies: - supports-color + eth-ens-namehash@2.0.8: + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + eth-json-rpc-filters@6.0.1: dependencies: '@metamask/safe-event-emitter': 3.1.1 @@ -11404,6 +13220,25 @@ snapshots: json-rpc-engine: 6.1.0 pify: 5.0.0 + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.6 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + eth-lib@0.2.8: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.6 + xhr-request-promise: 0.1.3 + eth-query@2.1.2: dependencies: json-rpc-random-id: 1.0.1 @@ -11413,6 +13248,28 @@ snapshots: dependencies: fast-safe-stringify: 2.1.1 + ethereum-bloom-filters@1.2.0: + dependencies: + '@noble/hashes': 1.4.0 + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + ethereum-cryptography@2.2.1: dependencies: '@noble/curves': 1.4.2 @@ -11420,16 +13277,77 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} + eventemitter3@4.0.4: {} + eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} events@3.3.0: {} + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -11454,11 +13372,55 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend@3.0.2: {} + extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + extsprintf@1.3.0: {} + eyes@0.1.8: {} fast-deep-equal@3.1.3: {} @@ -11517,14 +13479,26 @@ snapshots: transitivePeerDependencies: - supports-color - find-cache-dir@2.1.0: + finalhandler@1.2.0: dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - - find-root@1.1.0: {} - + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-root@1.1.0: {} + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -11551,6 +13525,8 @@ snapshots: flow-parser@0.241.0: {} + follow-redirects@1.15.6: {} + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -11560,6 +13536,24 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + forever-agent@0.6.1: {} + + form-data-encoder@1.7.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + fraction.js@4.3.7: {} framer-motion@11.3.19(@emotion/is-prop-valid@1.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -11572,12 +13566,22 @@ snapshots: fresh@0.5.2: {} + fs-extra@4.0.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 + fs-minipass@1.2.7: + dependencies: + minipass: 2.9.0 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -11592,6 +13596,8 @@ snapshots: es-abstract: 1.23.3 functions-have-names: 1.2.3 + functional-red-black-tree@1.0.1: {} + functions-have-names@1.2.3: {} futoin-hkdf@1.5.3: {} @@ -11614,6 +13620,10 @@ snapshots: get-port-please@3.1.2: {} + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -11624,6 +13634,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11650,6 +13664,11 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + globals@11.12.0: {} globals@13.24.0: @@ -11678,6 +13697,36 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + got@12.1.0: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -11706,6 +13755,13 @@ snapshots: transitivePeerDependencies: - uWebSockets.js + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -11724,6 +13780,12 @@ snapshots: dependencies: has-symbols: 1.0.3 + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + hash.js@1.1.7: dependencies: inherits: 2.0.4 @@ -11765,6 +13827,8 @@ snapshots: dependencies: void-elements: 3.1.0 + http-cache-semantics@4.1.1: {} + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -11773,8 +13837,26 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-https@1.0.0: {} + http-shutdown@1.2.2: {} + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -11783,6 +13865,11 @@ snapshots: dependencies: ms: 2.1.3 + hyperid@3.1.1: + dependencies: + uuid: 8.3.2 + uuid-parse: 1.1.0 + i18next-browser-languagedetector@7.1.0: dependencies: '@babel/runtime': 7.25.0 @@ -11791,8 +13878,16 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} + idna-uts46-hx@2.3.1: + dependencies: + punycode: 2.1.0 + ieee754@1.2.1: {} ignore@5.3.1: {} @@ -11801,6 +13896,10 @@ snapshots: dependencies: queue: 6.0.2 + immediate@3.2.3: {} + + immediate@3.3.0: {} + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 @@ -11826,10 +13925,14 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + interval-promise@1.4.0: {} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 + ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} is-arguments@1.1.1: @@ -11891,6 +13994,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-function@1.0.2: {} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 @@ -11899,6 +14004,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hex-prefixed@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -11951,6 +14058,8 @@ snapshots: dependencies: which-typed-array: 1.1.15 + is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} is-weakmap@2.0.2: {} @@ -11986,6 +14095,13 @@ snapshots: isobject@3.0.1: {} + isomorphic-fetch@3.0.0: + dependencies: + node-fetch: 2.7.0 + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + isomorphic-unfetch@3.1.0: dependencies: node-fetch: 2.7.0 @@ -12001,6 +14117,8 @@ snapshots: dependencies: ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + isstream@0.1.2: {} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -12099,6 +14217,10 @@ snapshots: js-base64@3.7.7: {} + js-sha3@0.5.7: {} + + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -12110,6 +14232,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@0.1.1: {} + jsc-android@250231.0.0: {} jsc-safe-url@0.2.4: {} @@ -12158,6 +14282,10 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json-stringify-safe@5.0.1: {} @@ -12170,6 +14298,13 @@ snapshots: jsonparse@1.3.1: {} + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -12177,6 +14312,8 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + just-extend@6.2.0: {} + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 @@ -12193,6 +14330,50 @@ snapshots: kleur@3.0.3: {} + level-codec@9.0.2: + dependencies: + buffer: 5.7.1 + + level-concat-iterator@2.0.1: {} + + level-errors@2.0.1: + dependencies: + errno: 0.1.8 + + level-iterator-stream@4.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + level-mem@5.0.1: + dependencies: + level-packager: 5.1.1 + memdown: 5.1.0 + + level-packager@5.1.1: + dependencies: + encoding-down: 6.3.0 + levelup: 4.4.0 + + level-supports@1.0.1: + dependencies: + xtend: 4.0.2 + + level-ws@2.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + levelup@4.4.0: + dependencies: + deferred-leveldown: 5.3.0 + level-errors: 2.0.1 + level-iterator-stream: 4.0.2 + level-supports: 1.0.1 + xtend: 4.0.2 + leven@3.1.0: {} levn@0.4.1: @@ -12269,6 +14450,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.get@4.4.2: {} + lodash.isequal@4.5.0: {} lodash.ismatch@4.4.0: {} @@ -12294,6 +14477,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -12302,6 +14489,10 @@ snapshots: dependencies: tslib: 2.6.3 + lowercase-keys@2.0.0: {} + + lowercase-keys@3.0.0: {} + lru-cache@10.3.0: {} lru-cache@10.4.3: {} @@ -12310,6 +14501,8 @@ snapshots: dependencies: yallist: 3.1.1 + ltgt@2.2.1: {} + lucide-react@0.408.0(react@18.3.1): dependencies: react: 18.3.1 @@ -12329,12 +14522,31 @@ snapshots: marky@1.2.5: {} + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + media-query-parser@2.0.2: dependencies: '@babel/runtime': 7.24.7 + media-typer@0.3.0: {} + + memdown@5.1.0: + dependencies: + abstract-leveldown: 6.2.3 + functional-red-black-tree: 1.0.1 + immediate: 3.2.3 + inherits: 2.0.4 + ltgt: 2.2.1 + safe-buffer: 5.2.1 + memoize-one@5.2.1: {} + merge-descriptors@1.0.1: {} + merge-options@3.0.4: dependencies: is-plain-obj: 2.1.0 @@ -12344,6 +14556,25 @@ snapshots: merge2@1.4.1: {} + merkle-patricia-tree@4.2.4: + dependencies: + '@types/levelup': 4.3.3 + ethereumjs-util: 7.1.5 + level-mem: 5.0.1 + level-ws: 2.0.0 + readable-stream: 3.6.2 + semaphore-async-await: 1.5.1 + + merkletreejs@0.3.9: + dependencies: + bignumber.js: 9.1.2 + buffer-reverse: 1.0.1 + crypto-js: 3.3.0 + treeify: 1.1.0 + web3-utils: 1.10.4 + + methods@1.1.2: {} + metro-babel-transformer@0.80.9: dependencies: '@babel/core': 7.24.7 @@ -12538,6 +14769,14 @@ snapshots: mimic-fn@4.0.0: {} + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -12552,14 +14791,27 @@ snapshots: minimist@1.2.8: {} + minipass@2.9.0: + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + minipass@7.1.2: {} + minizlib@1.3.3: + dependencies: + minipass: 2.9.0 + mipd@0.0.7(typescript@5.5.3): optionalDependencies: typescript: 5.5.3 mitt@3.0.1: {} + mkdirp-promise@5.0.1: + dependencies: + mkdirp: 1.0.4 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -12573,6 +14825,8 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.4 + mock-fs@4.14.0: {} + modern-ahocorasick@1.0.1: {} motion@10.16.2: @@ -12592,14 +14846,41 @@ snapshots: ms@2.1.3: {} + multibase@0.6.1: + dependencies: + base-x: 3.0.10 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.10 + buffer: 5.7.1 + + multicodec@0.5.7: + dependencies: + varint: 5.0.2 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + multiformats@9.9.0: {} + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + nano-json-stream-parser@0.1.2: {} + nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -12608,6 +14889,16 @@ snapshots: neo-async@2.6.2: {} + next-tick@1.1.0: {} + + nise@6.0.0: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 6.2.0 + path-to-regexp: 6.2.2 + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -12649,6 +14940,8 @@ snapshots: normalize-range@0.1.2: {} + normalize-url@6.1.0: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -12659,6 +14952,13 @@ snapshots: nullthrows@1.1.1: {} + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + + oauth-sign@0.9.0: {} + ob1@0.80.9: {} obj-multiplex@1.0.0: @@ -12701,6 +15001,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + oboe@2.1.5: + dependencies: + http-https: 1.0.0 + ofetch@1.3.4: dependencies: destr: 2.0.3 @@ -12711,6 +15015,8 @@ snapshots: on-exit-leak-free@0.2.0: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -12771,6 +15077,10 @@ snapshots: outdent@0.8.0: {} + p-cancelable@2.1.1: {} + + p-cancelable@3.0.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -12799,6 +15109,8 @@ snapshots: dependencies: callsites: 3.1.0 + parse-headers@2.0.5: {} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -12830,12 +15142,28 @@ snapshots: lru-cache: 10.3.0 minipass: 7.1.2 + path-to-regexp@0.1.7: {} + + path-to-regexp@6.2.2: {} + path-type@4.0.0: {} pathe@1.1.2: {} + pathval@1.1.1: {} + pathval@2.0.0: {} + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + performance-now@2.1.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -12853,8 +15181,15 @@ snapshots: duplexify: 4.1.3 split2: 4.2.0 + pino-abstract-transport@1.0.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + pino-std-serializers@4.0.0: {} + pino-std-serializers@6.2.2: {} + pino@7.11.0: dependencies: atomic-sleep: 1.0.0 @@ -12869,6 +15204,20 @@ snapshots: sonic-boom: 2.8.0 thread-stream: 0.15.2 + pino@8.10.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.0.0 + pino-std-serializers: 6.2.2 + process-warning: 2.3.2 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + pirates@4.0.6: {} pkg-dir@3.0.0: @@ -12951,6 +15300,10 @@ snapshots: process-warning@1.0.0: {} + process-warning@2.3.2: {} + + process@0.11.10: {} + promise@8.3.0: dependencies: asap: 2.0.6 @@ -12966,13 +15319,26 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-compare@2.5.1: {} + proxy-from-env@1.1.0: {} + + prr@1.0.1: {} + + psl@1.9.0: {} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + punycode@2.1.0: {} + punycode@2.3.1: {} qr-code-styling@1.6.0-rc.1: @@ -12990,6 +15356,18 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + qs@6.5.3: {} + + query-string@5.1.1: + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 @@ -13007,10 +15385,23 @@ snapshots: quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} + radix3@1.1.2: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + range-parser@1.2.1: {} + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + react-devtools-core@5.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.1 @@ -13189,6 +15580,14 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -13199,6 +15598,8 @@ snapshots: real-require@0.1.0: {} + real-require@0.2.0: {} + recast@0.21.5: dependencies: ast-types: 0.15.2 @@ -13252,10 +15653,37 @@ snapshots: remeda@1.61.0: {} + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.1 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + resolve-alpn@1.2.1: {} + resolve-from@3.0.0: {} resolve-from@4.0.0: {} @@ -13272,6 +15700,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -13287,6 +15719,15 @@ snapshots: dependencies: glob: 7.2.3 + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.1 + rollup-plugin-visualizer@5.12.0(rollup@4.18.0): dependencies: open: 8.4.2 @@ -13354,6 +15795,8 @@ snapshots: safe-stable-stringify@2.4.3: {} + safer-buffer@2.1.2: {} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -13362,6 +15805,14 @@ snapshots: dependencies: loose-envify: 1.4.0 + scrypt-js@3.0.1: {} + + secp256k1@4.0.3: + dependencies: + elliptic: 6.5.6 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.1 + secp256k1@5.0.0: dependencies: elliptic: 6.5.6 @@ -13373,6 +15824,8 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.1 + semaphore-async-await@1.5.1: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -13410,6 +15863,16 @@ snapshots: transitivePeerDependencies: - supports-color + servify@0.1.12: + dependencies: + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.19.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -13428,6 +15891,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} sha.js@2.4.11: @@ -13460,6 +15925,28 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@2.8.2: + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + + sinon-chai@3.7.0(chai@4.3.7)(sinon@18.0.0): + dependencies: + chai: 4.3.7 + sinon: 18.0.0 + + sinon@18.0.0: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/samsam': 8.0.0 + diff: 5.2.0 + nise: 6.0.0 + supports-color: 7.2.0 + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -13497,6 +15984,10 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + sonner@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -13521,6 +16012,18 @@ snapshots: sprintf-js@1.0.3: {} + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -13541,6 +16044,8 @@ snapshots: stream-shift@1.0.3: {} + strict-uri-encode@1.1.0: {} + strict-uri-encode@2.0.0: {} string-length@6.0.0: @@ -13622,6 +16127,10 @@ snapshots: strip-final-newline@3.0.0: {} + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + strip-json-comments@3.1.1: {} strnum@1.0.5: {} @@ -13658,6 +16167,24 @@ snapshots: svg-parser@2.0.4: {} + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + system-architecture@0.1.0: {} tailwind-merge@2.4.0: {} @@ -13693,6 +16220,16 @@ snapshots: transitivePeerDependencies: - ts-node + tar@4.4.19: + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + temp-dir@2.0.0: {} temp@0.8.4: @@ -13722,6 +16259,10 @@ snapshots: dependencies: real-require: 0.1.0 + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + throat@5.0.0: {} through2@2.0.5: @@ -13731,6 +16272,8 @@ snapshots: through@2.3.8: {} + timed-out@4.0.1: {} + tiny-invariant@1.3.3: {} tiny-warning@1.0.3: {} @@ -13753,8 +16296,15 @@ snapshots: toidentifier@1.0.1: {} + tough-cookie@2.5.0: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + tr46@0.0.3: {} + treeify@1.1.0: {} + ts-api-utils@1.3.0(typescript@5.5.3): dependencies: typescript: 5.5.3 @@ -13767,6 +16317,12 @@ snapshots: tslib@2.6.3: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -13779,6 +16335,13 @@ snapshots: type-fest@4.21.0: {} + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type@2.7.3: {} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -13811,6 +16374,10 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typescript@5.5.3: {} ua-parser-js@1.0.38: {} @@ -13821,6 +16388,8 @@ snapshots: dependencies: multiformats: 9.9.0 + ultron@1.1.1: {} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -13907,6 +16476,8 @@ snapshots: dependencies: punycode: 2.3.1 + url-set-query@1.0.0: {} + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): dependencies: react: 18.3.1 @@ -13934,6 +16505,8 @@ snapshots: dependencies: node-gyp-build: 4.8.1 + utf8@3.0.0: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -13946,8 +16519,12 @@ snapshots: utils-merge@1.0.1: {} + uuid-parse@1.1.0: {} + uuid@10.0.0: {} + uuid@3.4.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -13960,8 +16537,16 @@ snapshots: '@types/react': 18.3.3 react: 18.3.1 + varint@5.0.2: {} + vary@1.1.2: {} + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + viem@2.18.4(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 @@ -14099,6 +16684,213 @@ snapshots: dependencies: defaults: 1.0.4 + web3-bzz@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-core-helpers@1.10.4: + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + + web3-core-method@1.10.4: + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + + web3-core-promievent@1.10.4: + dependencies: + eventemitter3: 4.0.4 + + web3-core-requestmanager@1.10.4: + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4 + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core-subscriptions@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + + web3-core@1.10.4: + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-abi@1.10.4: + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.4 + + web3-eth-accounts@1.10.4: + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-contract@1.10.4: + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-ens@1.10.4: + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-iban@1.10.4: + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.4 + + web3-eth-personal@1.10.4: + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth@1.10.4: + dependencies: + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4 + web3-eth-contract: 1.10.4 + web3-eth-ens: 1.10.4 + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-net@1.10.4: + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-providers-http@1.10.4: + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@1.10.4: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + + web3-providers-ws@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.35 + transitivePeerDependencies: + - supports-color + + web3-shh@1.10.4: + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-utils@1.10.4: + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + + web3@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.10.4 + web3-eth: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-shh: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + webauthn-p256@0.0.5: dependencies: '@noble/curves': 1.4.0 @@ -14112,6 +16904,17 @@ snapshots: webpack-virtual-modules@0.6.2: {} + websocket@1.0.35: + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + whatwg-fetch@3.6.20: {} whatwg-url@5.0.0: @@ -14196,6 +16999,15 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + ws@6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 @@ -14203,6 +17015,11 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 @@ -14218,6 +17035,27 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + xhr-request-promise@0.1.3: + dependencies: + xhr-request: 1.1.0 + + xhr-request@1.1.0: + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + + xhr@2.6.0: + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + xmlhttprequest-ssl@2.0.0: {} xtend@4.0.2: {} @@ -14226,6 +17064,8 @@ snapshots: y18n@5.0.8: {} + yaeti@0.0.6: {} + yallist@3.1.1: {} yaml@1.10.2: {} diff --git a/src/components/bridge/connext/ConnextBridge.tsx b/src/components/bridge/connext/ConnextBridge.tsx index b9e47b55..4128e13c 100644 --- a/src/components/bridge/connext/ConnextBridge.tsx +++ b/src/components/bridge/connext/ConnextBridge.tsx @@ -2,10 +2,16 @@ import { Button } from "@/components/ui/button"; import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; import { AnimatePresence, m } from "framer-motion"; import { EyeIcon, EyeOffIcon } from "lucide-react"; -import { useState } from "react"; +import { Suspense, lazy, useState } from "react"; + +const ConnextBridgeWidget = lazy(() => + import("./ConnextBridgeWidget").then((module) => ({ + default: module.ConnextBridgeWidget, + })), +); export const ConnextBridge = () => { - const [open, setOpen] = useState(true); + const [open, setOpen] = useState(false); const handleOpen = () => setOpen(!open); return (
@@ -32,7 +38,11 @@ export const ConnextBridge = () => { variants={accordionVariants} transition={accordionTransition} > -
+
+ + + +
)} diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx new file mode 100644 index 00000000..da519e17 --- /dev/null +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -0,0 +1,304 @@ +// NOTE: We import this whole module lazily. +// This would not cause a bundle size increase. +// Type imports also get eliminated during compilation. +import type { SdkConfig } from "@connext/sdk"; +import { useEthersSigner } from "@/hooks/useEthersSigner"; + +import { QueryKeys } from "@/lib/queries/queriesSchema"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { useAccount } from "wagmi"; +import { useCallback, useState } from "react"; +import { parseUnits } from "viem"; +import { toast } from "sonner"; +import { arbitrum, mainnet, optimism } from "viem/chains"; + +const sdkConfig = { + network: "mainnet", + chains: { + // ETH + 6648936: { + chainId: 1, + }, + // OP + 1869640809: { + chainId: 10, + }, + // ARB + 1634886255: { + chainId: 42161, + }, + }, + // Turn down connext sdk logs in production. + logLevel: import.meta.env.PROD ? "silent" : "info", +} as const satisfies SdkConfig; + +const chainIdToDomainMapping = { + [mainnet.id]: "6648936", + [optimism.id]: "1869640809", + [arbitrum.id]: "1634886255", +}; + +export const ConnextBridgeWidget = () => { + const [originChainId, setOriginChainId] = useState(mainnet.id); + const originDomain = chainIdToDomainMapping[originChainId]; + + const [destinationChainId, setDestinationChainId] = useState(arbitrum.id); + const destinationDomain = chainIdToDomainMapping[destinationChainId]; + + const [originTokenAddress, setOriginTokenAddress] = useState(""); + const [amount, setAmount] = useState(""); + const [slippage, setSlippage] = useState(""); + + const { data: relayerFee } = useRelayerFee({ + originDomain, + destinationDomain, + }); + const { data: amountOut } = useAmountOut({ + originDomain, + destinationDomain, + originTokenAddress, + amount, + }); + const { data: approveData } = useConnextApproval({ + originDomain, + originTokenAddress, + amount, + }); + + const { mutate: writeApprove } = useApprove(); + const { mutate: writeBridge } = useBridge(); + + const approve = useCallback(() => { + if (!approveData) return; + if (!approveData.isApprovalNeeded) return; + writeApprove({ approveData }); + }, [approveData, writeApprove]); + + const bridge = useCallback(() => { + if (!relayerFee) throw new Error("Relayer fee not ready"); + writeBridge({ + originDomain, + destinationDomain, + originTokenAddress, + amount, + slippage, + relayerFee, + }); + }, [ + amount, + destinationDomain, + originDomain, + originTokenAddress, + relayerFee, + slippage, + writeBridge, + ]); + + return

WIP.

; +}; + +const useConnextSdk = () => { + return useQuery({ + queryKey: [QueryKeys.ConnextSdk("init")], + queryFn: async () => { + const create = await import("@connext/sdk").then((mod) => mod.create); + const sdk = await create(sdkConfig); + return sdk.sdkBase; + }, + staleTime: Infinity, + }); +}; + +const useRelayerFee = ({ + originDomain, + destinationDomain, +}: { + originDomain: string; + destinationDomain: string; +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("relayerFee"), + connextSdk, + originDomain, + destinationDomain, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const relayerFeeBN = await connextSdk.estimateRelayerFee({ + originDomain, + destinationDomain, + }); + const relayerFee = relayerFeeBN.toString(); + return relayerFee; + }, + enabled: !!connextSdk, + staleTime: Infinity, + }); +}; + +const useAmountOut = ({ + originDomain, + destinationDomain, + originTokenAddress, + amount, +}: { + originDomain: string; + destinationDomain: string; + originTokenAddress: string; + amount: string; // uint256 in string +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("amountOut"), + connextSdk, + originDomain, + destinationDomain, + originTokenAddress, + amount, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const { amountReceived, routerFee } = + await connextSdk.calculateAmountReceived( + originDomain, + destinationDomain, + originTokenAddress, + amount, + ); + + return { + amountReceived: BigInt(amountReceived.toString()), + routerFee: BigInt(routerFee.toString()), + }; + }, + enabled: !!connextSdk, + }); +}; + +const useConnextApproval = ({ + originDomain, + originTokenAddress, + amount, +}: { + originDomain: string; + originTokenAddress: string; + amount: string; // uint256 in string +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("approval"), + connextSdk, + originDomain, + originTokenAddress, + amount, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const approveTx = await connextSdk.approveIfNeeded( + originDomain, + originTokenAddress, + amount, + ); + if (!approveTx) + return { + isApprovalNeeded: false, + approveTx: undefined, + } as const; + return { + isApprovalNeeded: true, + approveTx, + } as const; + }, + enabled: !!connextSdk, + }); +}; + +const useApprove = () => { + const signer = useEthersSigner(); + return useMutation({ + mutationFn: async ({ + approveData, + }: { + approveData: ReturnType["data"] | undefined; + }) => { + if (!signer) throw new Error("Signer not ready"); + if (!approveData) throw new Error("Approval data not ready"); + if (!approveData.isApprovalNeeded) throw new Error("Approval not needed"); + const approveTxReq = approveData.approveTx; + const approveTx = await signer.sendTransaction(approveTxReq); + toast.promise( + new Promise((resolve, reject) => + approveTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), + { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }, + ); + await approveTx.wait(); + }, + }); +}; + +const useBridge = () => { + const { address } = useAccount(); + const signer = useEthersSigner(); + + const { data: connextSdk } = useConnextSdk(); + return useMutation({ + mutationFn: async ({ + originDomain, + destinationDomain, + originTokenAddress, + amount, + slippage, + relayerFee, + }: { + originDomain: string; + destinationDomain: string; + originTokenAddress: string; + amount: string; // uint256 in string + slippage: string; // in % + relayerFee: string; // in wei + }) => { + if (!connextSdk) throw new Error("SDK not ready"); + if (!address) throw new Error("Not connected"); + if (!signer) throw new Error("Signer not ready"); + if (!relayerFee) throw new Error("Relayer fee not ready"); + const bridgeTxParams = { + origin: originDomain, + destination: destinationDomain, + to: address, + asset: originTokenAddress, + delegate: address, + amount, + callData: "0x", + relayerFee, + // in BPS + slippage: parseUnits(slippage, 2), + }; + const xcallTxReq = await connextSdk.xcall(bridgeTxParams); + const xcallTx = await signer.sendTransaction(xcallTxReq); + toast.promise( + new Promise((resolve, reject) => + xcallTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), + { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }, + ); + await xcallTx.wait(); + }, + }); +}; diff --git a/src/hooks/useEthersSigner.ts b/src/hooks/useEthersSigner.ts new file mode 100644 index 00000000..5c27e2e3 --- /dev/null +++ b/src/hooks/useEthersSigner.ts @@ -0,0 +1,26 @@ +import { providers } from "ethers"; +import { useMemo } from "react"; +import type { Chain, Client, Transport, Account } from "viem"; +import { Config, useConnectorClient } from "wagmi"; + +/** + * Ethers signer + */ + +export function clientToSigner(client: Client) { + const { account, chain, transport } = client; + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + }; + const provider = new providers.Web3Provider(transport, network); + const signer = provider.getSigner(account.address); + return signer; +} + +/** Hook to convert a Viem Client to an ethers.js Signer. */ +export function useEthersSigner({ chainId }: { chainId?: number } = {}) { + const { data: client } = useConnectorClient({ chainId }); + return useMemo(() => (client ? clientToSigner(client) : undefined), [client]); +} diff --git a/src/lib/queries/queriesSchema.ts b/src/lib/queries/queriesSchema.ts index 13daed4b..b029cceb 100644 --- a/src/lib/queries/queriesSchema.ts +++ b/src/lib/queries/queriesSchema.ts @@ -17,6 +17,8 @@ export const QueryKeys = { Migration: (v: string) => `migrate-${v}`, VotesForAddress: "votesForAddress", Farms: (type: "internal" | "sushi" | "curve") => `farms-${type}`, + ConnextSdk: (type: "init" | "relayerFee" | "amountOut" | "approval") => + `connextSdk-${type}`, } as const; // TODO: We can split alchemists, vaults, tokens, transmuters etc into separate queries From 72bd9dbe392a7f6c1218616593baf7ee242f2546 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Tue, 6 Aug 2024 19:29:49 +0200 Subject: [PATCH 06/46] populate connext bridge ui --- src/components/bridge/BridgeFallback.tsx | 9 + .../bridge/connext/ConnextBridge.tsx | 3 +- .../bridge/connext/ConnextBridgeWidget.tsx | 356 +++++++++++++++--- .../bridge/lifi/LiFiBridgeWidget.tsx | 3 +- src/lib/config/synths.ts | 16 + src/lib/constants.ts | 7 +- src/lib/queries/useTokensQuery.ts | 22 +- 7 files changed, 361 insertions(+), 55 deletions(-) create mode 100644 src/components/bridge/BridgeFallback.tsx diff --git a/src/components/bridge/BridgeFallback.tsx b/src/components/bridge/BridgeFallback.tsx new file mode 100644 index 00000000..64e8b125 --- /dev/null +++ b/src/components/bridge/BridgeFallback.tsx @@ -0,0 +1,9 @@ +import { LoadingBar } from "../common/LoadingBar"; + +export const BridgeFallback = () => { + return ( +
+ +
+ ); +}; diff --git a/src/components/bridge/connext/ConnextBridge.tsx b/src/components/bridge/connext/ConnextBridge.tsx index 4128e13c..75c4f5a0 100644 --- a/src/components/bridge/connext/ConnextBridge.tsx +++ b/src/components/bridge/connext/ConnextBridge.tsx @@ -3,6 +3,7 @@ import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; import { AnimatePresence, m } from "framer-motion"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { Suspense, lazy, useState } from "react"; +import { BridgeFallback } from "../BridgeFallback"; const ConnextBridgeWidget = lazy(() => import("./ConnextBridgeWidget").then((module) => ({ @@ -39,7 +40,7 @@ export const ConnextBridge = () => { transition={accordionTransition} >
- + }>
diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index da519e17..4a4bbe30 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -6,11 +6,38 @@ import { useEthersSigner } from "@/hooks/useEthersSigner"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { useMutation, useQuery } from "@tanstack/react-query"; -import { useAccount } from "wagmi"; +import { useAccount, useSwitchChain } from "wagmi"; import { useCallback, useState } from "react"; -import { parseUnits } from "viem"; +import { + formatEther, + isAddress, + parseEther, + parseUnits, + zeroAddress, +} from "viem"; import { toast } from "sonner"; import { arbitrum, mainnet, optimism } from "viem/chains"; +import { useTokensQuery } from "@/lib/queries/useTokensQuery"; +import { + ALCX_MAINNET_ADDRESS, + ALCX_ARBITRUM_ADDRESS, + ALCX_OPTIMISM_ADDRESS, +} from "@/lib/constants"; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "@/components/ui/select"; +import { Input } from "@/components/ui/input"; +import { TokenInput } from "@/components/common/input/TokenInput"; +import { SlippageInput } from "@/components/common/input/SlippageInput"; +import { Button } from "@/components/ui/button"; +import { isInputZero } from "@/utils/inputNotZero"; +import { SYNTH_ASSETS_ADDRESSES } from "@/lib/config/synths"; +import { useChain } from "@/hooks/useChain"; +import { formatNumber } from "@/utils/number"; const sdkConfig = { network: "mainnet", @@ -18,64 +45,166 @@ const sdkConfig = { // ETH 6648936: { chainId: 1, + providers: ["https://ethereum-rpc.publicnode.com"], }, // OP 1869640809: { chainId: 10, + providers: ["https://optimism-rpc.publicnode.com"], }, // ARB 1634886255: { chainId: 42161, + providers: ["https://arbitrum-one.publicnode.com"], }, }, // Turn down connext sdk logs in production. - logLevel: import.meta.env.PROD ? "silent" : "info", + logLevel: "silent", } as const satisfies SdkConfig; const chainIdToDomainMapping = { - [mainnet.id]: "6648936", - [optimism.id]: "1869640809", - [arbitrum.id]: "1634886255", + [mainnet.id.toString()]: "6648936", + [optimism.id.toString()]: "1869640809", + [arbitrum.id.toString()]: "1634886255", +} as const; + +const chainToAvailableTokensMapping = { + [mainnet.id.toString()]: [ + ALCX_MAINNET_ADDRESS, + SYNTH_ASSETS_ADDRESSES[mainnet.id].alETH, + SYNTH_ASSETS_ADDRESSES[mainnet.id].alUSD, + ].map((t) => t.toLowerCase()), + + [optimism.id.toString()]: [ + ALCX_OPTIMISM_ADDRESS, + SYNTH_ASSETS_ADDRESSES[optimism.id].alETH, + SYNTH_ASSETS_ADDRESSES[optimism.id].alUSD, + ].map((t) => t.toLowerCase()), + + [arbitrum.id.toString()]: [ + ALCX_ARBITRUM_ADDRESS, + SYNTH_ASSETS_ADDRESSES[arbitrum.id].alETH, + SYNTH_ASSETS_ADDRESSES[arbitrum.id].alUSD, + ].map((t) => t.toLowerCase()), }; +const bridgeChains = [mainnet, optimism, arbitrum]; + export const ConnextBridgeWidget = () => { - const [originChainId, setOriginChainId] = useState(mainnet.id); + const chain = useChain(); + + const [originChainId, setOriginChainId] = useState(chain.id.toString()); const originDomain = chainIdToDomainMapping[originChainId]; + const originChain = bridgeChains.find( + (c) => c.id.toString() === originChainId, + ); - const [destinationChainId, setDestinationChainId] = useState(arbitrum.id); + const [destinationChainId, setDestinationChainId] = useState( + bridgeChains.find((c) => c.id.toString() !== originChainId)!.id.toString(), + ); const destinationDomain = chainIdToDomainMapping[destinationChainId]; + const destinationChain = bridgeChains.find( + (c) => c.id.toString() === destinationChainId, + ); + + const { data: tokens } = useTokensQuery(); + const [originTokenAddress, setOriginTokenAddress] = useState( + chainToAvailableTokensMapping[originChainId][0], + ); + const token = tokens?.find( + (t) => t.address.toLowerCase() === originTokenAddress.toLowerCase(), + ); + const selection = tokens?.filter((t) => + chainToAvailableTokensMapping[originChainId].includes( + t.address.toLowerCase(), + ), + ); - const [originTokenAddress, setOriginTokenAddress] = useState(""); const [amount, setAmount] = useState(""); - const [slippage, setSlippage] = useState(""); + const [slippage, setSlippage] = useState("0.5"); const { data: relayerFee } = useRelayerFee({ originDomain, destinationDomain, }); - const { data: amountOut } = useAmountOut({ + const { data: amountOut, isFetching: isFetchingAmountOut } = useAmountOut({ originDomain, destinationDomain, originTokenAddress, amount, }); + const { data: approveData } = useConnextApproval({ originDomain, originTokenAddress, amount, }); - const { mutate: writeApprove } = useApprove(); - const { mutate: writeBridge } = useBridge(); + const notReady = + isFetchingAmountOut || + approveData === undefined || + relayerFee === undefined || + amountOut === undefined; - const approve = useCallback(() => { - if (!approveData) return; - if (!approveData.isApprovalNeeded) return; - writeApprove({ approveData }); - }, [approveData, writeApprove]); + const { mutate: writeApprove, isPending: isApproving } = useApprove(); + const { mutate: writeBridge, isPending: isBridging } = useBridge(); + + const { switchChain } = useSwitchChain(); - const bridge = useCallback(() => { - if (!relayerFee) throw new Error("Relayer fee not ready"); + const handleOriginChainSelect = useCallback( + (chainId: string) => { + setOriginChainId(chainId); + const newChainTokenAddress = chainToAvailableTokensMapping[chainId][0]; + if (isAddress(newChainTokenAddress)) { + setOriginTokenAddress(newChainTokenAddress); + } + setAmount(""); + if (chainId === destinationChainId) { + const newDestinationChainId = bridgeChains + .find((c) => c.id.toString() !== chainId) + ?.id.toString(); + if (newDestinationChainId) { + setDestinationChainId(newDestinationChainId); + } + } + switchChain({ + chainId: Number(chainId), + }); + }, + [destinationChainId, switchChain], + ); + + const handleDestinationChainSelect = useCallback( + (chainId: string) => { + setDestinationChainId(chainId); + setAmount(""); + if (chainId === originChainId) { + const newOriginChainId = bridgeChains + .find((c) => c.id.toString() !== chainId) + ?.id.toString(); + if (newOriginChainId) { + setOriginChainId(newOriginChainId); + switchChain({ + chainId: Number(newOriginChainId), + }); + const newChainTokenAddress = + chainToAvailableTokensMapping[newOriginChainId][0]; + if (isAddress(newChainTokenAddress)) { + setOriginTokenAddress(newChainTokenAddress); + } + } + } + }, + [originChainId, switchChain], + ); + + const onCtaClick = useCallback(() => { + if (!approveData) return; + if (approveData?.isApprovalNeeded === true) { + writeApprove({ approveData }); + return; + } + if (!relayerFee) return; writeBridge({ originDomain, destinationDomain, @@ -86,23 +215,150 @@ export const ConnextBridgeWidget = () => { }); }, [ amount, + approveData, destinationDomain, originDomain, originTokenAddress, relayerFee, slippage, + writeApprove, writeBridge, ]); - return

WIP.

; + return ( +
+
+
+

Origin chain:

+ +
+
+

Target chain:

+ +
+
+

Router fee:

+ +
+
+

Relayer fee:

+ +
+
+

You receive:

+ +
+
+
+ + +
+ + +
+ ); }; const useConnextSdk = () => { + const { address } = useAccount(); return useQuery({ - queryKey: [QueryKeys.ConnextSdk("init")], + queryKey: [QueryKeys.ConnextSdk("init"), address], queryFn: async () => { const create = await import("@connext/sdk").then((mod) => mod.create); - const sdk = await create(sdkConfig); + const sdk = await create({ ...sdkConfig, signerAddress: address }); return sdk.sdkBase; }, staleTime: Infinity, @@ -130,7 +386,7 @@ const useRelayerFee = ({ originDomain, destinationDomain, }); - const relayerFee = relayerFeeBN.toString(); + const relayerFee = formatEther(BigInt(relayerFeeBN.toString())); return relayerFee; }, enabled: !!connextSdk, @@ -147,7 +403,7 @@ const useAmountOut = ({ originDomain: string; destinationDomain: string; originTokenAddress: string; - amount: string; // uint256 in string + amount: string; }) => { const { data: connextSdk } = useConnextSdk(); return useQuery({ @@ -166,15 +422,16 @@ const useAmountOut = ({ originDomain, destinationDomain, originTokenAddress, - amount, + // uint256 in string + parseEther(amount).toString(), ); return { - amountReceived: BigInt(amountReceived.toString()), - routerFee: BigInt(routerFee.toString()), + amountReceived: formatEther(BigInt(amountReceived.toString())), + routerFee: formatEther(BigInt(routerFee.toString())), }; }, - enabled: !!connextSdk, + enabled: !!connextSdk && !isInputZero(amount), }); }; @@ -185,7 +442,7 @@ const useConnextApproval = ({ }: { originDomain: string; originTokenAddress: string; - amount: string; // uint256 in string + amount: string; }) => { const { data: connextSdk } = useConnextSdk(); return useQuery({ @@ -201,7 +458,10 @@ const useConnextApproval = ({ const approveTx = await connextSdk.approveIfNeeded( originDomain, originTokenAddress, - amount, + // uint256 in string + parseEther(amount).toString(), + // fixes approval + false, ); if (!approveTx) return { @@ -213,7 +473,7 @@ const useConnextApproval = ({ approveTx, } as const; }, - enabled: !!connextSdk, + enabled: !!connextSdk && !isInputZero(amount), }); }; @@ -231,11 +491,12 @@ const useApprove = () => { const approveTxReq = approveData.approveTx; const approveTx = await signer.sendTransaction(approveTxReq); toast.promise( - new Promise((resolve, reject) => - approveTx - .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), + () => + new Promise((resolve, reject) => + approveTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), { loading: "Bridging...", success: "Bridge success!", @@ -278,20 +539,23 @@ const useBridge = () => { to: address, asset: originTokenAddress, delegate: address, - amount, callData: "0x", - relayerFee, - // in BPS - slippage: parseUnits(slippage, 2), + // uint256 in string + amount: parseEther(amount).toString(), + // uint256 in string + relayerFee: parseEther(relayerFee).toString(), + // in BPS (basis points) in string + slippage: parseUnits(slippage, 2).toString(), }; const xcallTxReq = await connextSdk.xcall(bridgeTxParams); const xcallTx = await signer.sendTransaction(xcallTxReq); toast.promise( - new Promise((resolve, reject) => - xcallTx - .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), + () => + new Promise((resolve, reject) => + xcallTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), { loading: "Bridging...", success: "Bridge success!", diff --git a/src/components/bridge/lifi/LiFiBridgeWidget.tsx b/src/components/bridge/lifi/LiFiBridgeWidget.tsx index 5656ff1d..f37a2521 100644 --- a/src/components/bridge/lifi/LiFiBridgeWidget.tsx +++ b/src/components/bridge/lifi/LiFiBridgeWidget.tsx @@ -7,6 +7,7 @@ import { Button } from "@/components/ui/button"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { AnimatePresence, m } from "framer-motion"; import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; +import { BridgeFallback } from "../BridgeFallback"; const LiFiWidget = lazy(() => import("@lifi/widget").then((mod) => ({ default: mod.LiFiWidget })), @@ -135,7 +136,7 @@ export const LiFiBridgeWidget = () => { transition={accordionTransition} >
- + }>
diff --git a/src/lib/config/synths.ts b/src/lib/config/synths.ts index bb3f2c2c..3dd1abe0 100644 --- a/src/lib/config/synths.ts +++ b/src/lib/config/synths.ts @@ -1,4 +1,5 @@ import { SynthAssetMetadata } from "@/lib/config/metadataTypes"; +import { arbitrum, mainnet, optimism } from "viem/chains"; export const SYNTH_ASSETS = { ALUSD: "alUSD", @@ -17,3 +18,18 @@ export const SYNTH_ASSETS_METADATA = { icon: "/images/icons/aleth_med.svg", }, } as const satisfies SynthAssetMetadata; + +export const SYNTH_ASSETS_ADDRESSES = { + [mainnet.id]: { + [SYNTH_ASSETS.ALUSD]: "0xBC6DA0FE9aD5f3b0d58160288917AA56653660E9", + [SYNTH_ASSETS.ALETH]: "0x0100546F2cD4C9D97f798fFC9755E47865FF7Ee6", + }, + [optimism.id]: { + [SYNTH_ASSETS.ALUSD]: "0xCB8FA9a76b8e203D8C3797bF438d8FB81Ea3326A", + [SYNTH_ASSETS.ALETH]: "0x3E29D3A9316dAB217754d13b28646B76607c5f04", + }, + [arbitrum.id]: { + [SYNTH_ASSETS.ALUSD]: "0xCB8FA9a76b8e203D8C3797bF438d8FB81Ea3326A", + [SYNTH_ASSETS.ALETH]: "0x17573150d67d820542EFb24210371545a4868B03", + }, +} as const; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 33497b3f..d7eecaac 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -5,8 +5,7 @@ export const GAS_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; export const ONE_MINUTE_IN_MS = 60 * 1000; export const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; -// Addresses used in the app. These are the addresses of the contracts on the Ethereum mainnet, -// so we do not create chain mappings for them. +// Addresses used in the app export const DELEGATE_REGISTRY_ADDRESS = "0x469788fE6E9E9681C6ebF3bF78e7Fd26Fc015446"; export const WETH_MAINNET_ADDRESS = @@ -18,6 +17,10 @@ export const G_ALCX_MAINNET_ADDRESS = export const SUSHI_MAINNET_ADDRESS = "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2"; export const CRV_MAINNET_ADDRESS = "0xd533a949740bb3306d119cc777fa900ba034cd52"; +export const ALCX_ARBITRUM_ADDRESS = + "0x27b58D226fe8f792730a795764945Cf146815AA7"; +export const ALCX_OPTIMISM_ADDRESS = + "0xE974B9b31dBFf4369b94a1bAB5e228f35ed44125"; // Number constants export const MAX_UINT256_BN = BigInt(Math.pow(2, 256)) - 1n; diff --git a/src/lib/queries/useTokensQuery.ts b/src/lib/queries/useTokensQuery.ts index 8ffc6a76..cd8876bb 100644 --- a/src/lib/queries/useTokensQuery.ts +++ b/src/lib/queries/useTokensQuery.ts @@ -3,16 +3,21 @@ import { useQuery } from "@tanstack/react-query"; import { lsService } from "@/lib/localStorage"; import { useAlchemists } from "./useAlchemists"; import { VAULTS } from "@/lib/config/vaults"; -import { mainnet } from "viem/chains"; +import { arbitrum, mainnet, optimism } from "viem/chains"; import { erc20Abi, zeroAddress } from "viem"; import { useAccount, usePublicClient } from "wagmi"; import { Token } from "@/lib/types"; -import { GAS_ADDRESS, ONE_DAY_IN_MS } from "@/lib/constants"; +import { + ALCX_ARBITRUM_ADDRESS, + ALCX_MAINNET_ADDRESS, + ALCX_OPTIMISM_ADDRESS, + GAS_ADDRESS, + G_ALCX_MAINNET_ADDRESS, + ONE_DAY_IN_MS, +} from "@/lib/constants"; import { wagmiConfig } from "@/lib/wagmi/wagmiConfig"; import { QueryKeys } from "./queriesSchema"; -const gALCXAddress = "0x93Dede06AE3B5590aF1d4c111BC54C3f717E4b35"; - export const useTokensQuery = () => { const { address: userAddress = zeroAddress } = useAccount(); const chain = useChain(); @@ -43,7 +48,14 @@ export const useTokensQuery = () => { .filter((token) => token !== undefined) as `0x${string}`[]; tokensAddresses.push(...tokensAddressesFromVaultOverries); if (chain.id === mainnet.id) { - tokensAddresses.push(gALCXAddress); + tokensAddresses.push(G_ALCX_MAINNET_ADDRESS); + tokensAddresses.push(ALCX_MAINNET_ADDRESS); + } + if (chain.id === arbitrum.id) { + tokensAddresses.push(ALCX_ARBITRUM_ADDRESS); + } + if (chain.id === optimism.id) { + tokensAddresses.push(ALCX_OPTIMISM_ADDRESS); } const calls = tokensAddresses.flatMap( From b6724a5f18ad9377d7482780d0b1a58d90569d34 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Tue, 6 Aug 2024 20:00:01 +0200 Subject: [PATCH 07/46] refactor code structure --- .../bridge/connext/ConnextBridgeWidget.tsx | 285 ++---------------- src/components/bridge/connext/lib/connext.ts | 247 +++++++++++++++ 2 files changed, 268 insertions(+), 264 deletions(-) create mode 100644 src/components/bridge/connext/lib/connext.ts diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index 4a4bbe30..935fac51 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -1,21 +1,6 @@ -// NOTE: We import this whole module lazily. -// This would not cause a bundle size increase. -// Type imports also get eliminated during compilation. -import type { SdkConfig } from "@connext/sdk"; -import { useEthersSigner } from "@/hooks/useEthersSigner"; - -import { QueryKeys } from "@/lib/queries/queriesSchema"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { useAccount, useSwitchChain } from "wagmi"; +import { useSwitchChain } from "wagmi"; import { useCallback, useState } from "react"; -import { - formatEther, - isAddress, - parseEther, - parseUnits, - zeroAddress, -} from "viem"; -import { toast } from "sonner"; +import { isAddress, zeroAddress } from "viem"; import { arbitrum, mainnet, optimism } from "viem/chains"; import { useTokensQuery } from "@/lib/queries/useTokensQuery"; import { @@ -38,29 +23,13 @@ import { isInputZero } from "@/utils/inputNotZero"; import { SYNTH_ASSETS_ADDRESSES } from "@/lib/config/synths"; import { useChain } from "@/hooks/useChain"; import { formatNumber } from "@/utils/number"; - -const sdkConfig = { - network: "mainnet", - chains: { - // ETH - 6648936: { - chainId: 1, - providers: ["https://ethereum-rpc.publicnode.com"], - }, - // OP - 1869640809: { - chainId: 10, - providers: ["https://optimism-rpc.publicnode.com"], - }, - // ARB - 1634886255: { - chainId: 42161, - providers: ["https://arbitrum-one.publicnode.com"], - }, - }, - // Turn down connext sdk logs in production. - logLevel: "silent", -} as const satisfies SdkConfig; +import { + useConnextRelayerFee, + useConnextAmountOut, + useConnextApproval, + useConnextWriteApprove, + useConnextWriteBridge, +} from "./lib/connext"; const chainIdToDomainMapping = { [mainnet.id.toString()]: "6648936", @@ -123,16 +92,17 @@ export const ConnextBridgeWidget = () => { const [amount, setAmount] = useState(""); const [slippage, setSlippage] = useState("0.5"); - const { data: relayerFee } = useRelayerFee({ + const { data: relayerFee } = useConnextRelayerFee({ originDomain, destinationDomain, }); - const { data: amountOut, isFetching: isFetchingAmountOut } = useAmountOut({ - originDomain, - destinationDomain, - originTokenAddress, - amount, - }); + const { data: amountOut, isFetching: isFetchingAmountOut } = + useConnextAmountOut({ + originDomain, + destinationDomain, + originTokenAddress, + amount, + }); const { data: approveData } = useConnextApproval({ originDomain, @@ -146,8 +116,10 @@ export const ConnextBridgeWidget = () => { relayerFee === undefined || amountOut === undefined; - const { mutate: writeApprove, isPending: isApproving } = useApprove(); - const { mutate: writeBridge, isPending: isBridging } = useBridge(); + const { mutate: writeApprove, isPending: isApproving } = + useConnextWriteApprove(); + const { mutate: writeBridge, isPending: isBridging } = + useConnextWriteBridge(); const { switchChain } = useSwitchChain(); @@ -351,218 +323,3 @@ export const ConnextBridgeWidget = () => {
); }; - -const useConnextSdk = () => { - const { address } = useAccount(); - return useQuery({ - queryKey: [QueryKeys.ConnextSdk("init"), address], - queryFn: async () => { - const create = await import("@connext/sdk").then((mod) => mod.create); - const sdk = await create({ ...sdkConfig, signerAddress: address }); - return sdk.sdkBase; - }, - staleTime: Infinity, - }); -}; - -const useRelayerFee = ({ - originDomain, - destinationDomain, -}: { - originDomain: string; - destinationDomain: string; -}) => { - const { data: connextSdk } = useConnextSdk(); - return useQuery({ - queryKey: [ - QueryKeys.ConnextSdk("relayerFee"), - connextSdk, - originDomain, - destinationDomain, - ], - queryFn: async () => { - if (!connextSdk) throw new Error("SDK not ready"); - const relayerFeeBN = await connextSdk.estimateRelayerFee({ - originDomain, - destinationDomain, - }); - const relayerFee = formatEther(BigInt(relayerFeeBN.toString())); - return relayerFee; - }, - enabled: !!connextSdk, - staleTime: Infinity, - }); -}; - -const useAmountOut = ({ - originDomain, - destinationDomain, - originTokenAddress, - amount, -}: { - originDomain: string; - destinationDomain: string; - originTokenAddress: string; - amount: string; -}) => { - const { data: connextSdk } = useConnextSdk(); - return useQuery({ - queryKey: [ - QueryKeys.ConnextSdk("amountOut"), - connextSdk, - originDomain, - destinationDomain, - originTokenAddress, - amount, - ], - queryFn: async () => { - if (!connextSdk) throw new Error("SDK not ready"); - const { amountReceived, routerFee } = - await connextSdk.calculateAmountReceived( - originDomain, - destinationDomain, - originTokenAddress, - // uint256 in string - parseEther(amount).toString(), - ); - - return { - amountReceived: formatEther(BigInt(amountReceived.toString())), - routerFee: formatEther(BigInt(routerFee.toString())), - }; - }, - enabled: !!connextSdk && !isInputZero(amount), - }); -}; - -const useConnextApproval = ({ - originDomain, - originTokenAddress, - amount, -}: { - originDomain: string; - originTokenAddress: string; - amount: string; -}) => { - const { data: connextSdk } = useConnextSdk(); - return useQuery({ - queryKey: [ - QueryKeys.ConnextSdk("approval"), - connextSdk, - originDomain, - originTokenAddress, - amount, - ], - queryFn: async () => { - if (!connextSdk) throw new Error("SDK not ready"); - const approveTx = await connextSdk.approveIfNeeded( - originDomain, - originTokenAddress, - // uint256 in string - parseEther(amount).toString(), - // fixes approval - false, - ); - if (!approveTx) - return { - isApprovalNeeded: false, - approveTx: undefined, - } as const; - return { - isApprovalNeeded: true, - approveTx, - } as const; - }, - enabled: !!connextSdk && !isInputZero(amount), - }); -}; - -const useApprove = () => { - const signer = useEthersSigner(); - return useMutation({ - mutationFn: async ({ - approveData, - }: { - approveData: ReturnType["data"] | undefined; - }) => { - if (!signer) throw new Error("Signer not ready"); - if (!approveData) throw new Error("Approval data not ready"); - if (!approveData.isApprovalNeeded) throw new Error("Approval not needed"); - const approveTxReq = approveData.approveTx; - const approveTx = await signer.sendTransaction(approveTxReq); - toast.promise( - () => - new Promise((resolve, reject) => - approveTx - .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), - { - loading: "Bridging...", - success: "Bridge success!", - error: "Bridge failed.", - }, - ); - await approveTx.wait(); - }, - }); -}; - -const useBridge = () => { - const { address } = useAccount(); - const signer = useEthersSigner(); - - const { data: connextSdk } = useConnextSdk(); - return useMutation({ - mutationFn: async ({ - originDomain, - destinationDomain, - originTokenAddress, - amount, - slippage, - relayerFee, - }: { - originDomain: string; - destinationDomain: string; - originTokenAddress: string; - amount: string; // uint256 in string - slippage: string; // in % - relayerFee: string; // in wei - }) => { - if (!connextSdk) throw new Error("SDK not ready"); - if (!address) throw new Error("Not connected"); - if (!signer) throw new Error("Signer not ready"); - if (!relayerFee) throw new Error("Relayer fee not ready"); - const bridgeTxParams = { - origin: originDomain, - destination: destinationDomain, - to: address, - asset: originTokenAddress, - delegate: address, - callData: "0x", - // uint256 in string - amount: parseEther(amount).toString(), - // uint256 in string - relayerFee: parseEther(relayerFee).toString(), - // in BPS (basis points) in string - slippage: parseUnits(slippage, 2).toString(), - }; - const xcallTxReq = await connextSdk.xcall(bridgeTxParams); - const xcallTx = await signer.sendTransaction(xcallTxReq); - toast.promise( - () => - new Promise((resolve, reject) => - xcallTx - .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), - { - loading: "Bridging...", - success: "Bridge success!", - error: "Bridge failed.", - }, - ); - await xcallTx.wait(); - }, - }); -}; diff --git a/src/components/bridge/connext/lib/connext.ts b/src/components/bridge/connext/lib/connext.ts new file mode 100644 index 00000000..455d25ff --- /dev/null +++ b/src/components/bridge/connext/lib/connext.ts @@ -0,0 +1,247 @@ +import { useAccount } from "wagmi"; +import { toast } from "sonner"; +import { formatEther, parseEther, parseUnits } from "viem"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import type { SdkConfig } from "@connext/sdk"; + +import { QueryKeys } from "@/lib/queries/queriesSchema"; +import { useEthersSigner } from "@/hooks/useEthersSigner"; +import { isInputZero } from "@/utils/inputNotZero"; + +const sdkConfig = { + network: "mainnet", + chains: { + // ETH + 6648936: { + chainId: 1, + providers: ["https://ethereum-rpc.publicnode.com"], + }, + // OP + 1869640809: { + chainId: 10, + providers: ["https://optimism-rpc.publicnode.com"], + }, + // ARB + 1634886255: { + chainId: 42161, + providers: ["https://arbitrum-one.publicnode.com"], + }, + }, + // Turn down connext sdk logs in production. + logLevel: "silent", +} as const satisfies SdkConfig; + +export const useConnextSdk = () => { + const { address } = useAccount(); + return useQuery({ + queryKey: [QueryKeys.ConnextSdk("init"), address], + queryFn: async () => { + const create = await import("@connext/sdk").then((mod) => mod.create); + const sdk = await create({ ...sdkConfig, signerAddress: address }); + return sdk.sdkBase; + }, + staleTime: Infinity, + }); +}; + +export const useConnextRelayerFee = ({ + originDomain, + destinationDomain, +}: { + originDomain: string; + destinationDomain: string; +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("relayerFee"), + connextSdk, + originDomain, + destinationDomain, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const relayerFeeBN = await connextSdk.estimateRelayerFee({ + originDomain, + destinationDomain, + }); + const relayerFee = formatEther(BigInt(relayerFeeBN.toString())); + return relayerFee; + }, + enabled: !!connextSdk, + staleTime: Infinity, + }); +}; + +export const useConnextAmountOut = ({ + originDomain, + destinationDomain, + originTokenAddress, + amount, +}: { + originDomain: string; + destinationDomain: string; + originTokenAddress: string; + amount: string; +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("amountOut"), + connextSdk, + originDomain, + destinationDomain, + originTokenAddress, + amount, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const { amountReceived, routerFee } = + await connextSdk.calculateAmountReceived( + originDomain, + destinationDomain, + originTokenAddress, + // uint256 in string + parseEther(amount).toString(), + ); + + return { + amountReceived: formatEther(BigInt(amountReceived.toString())), + routerFee: formatEther(BigInt(routerFee.toString())), + }; + }, + enabled: !!connextSdk && !isInputZero(amount), + }); +}; + +export const useConnextApproval = ({ + originDomain, + originTokenAddress, + amount, +}: { + originDomain: string; + originTokenAddress: string; + amount: string; +}) => { + const { data: connextSdk } = useConnextSdk(); + return useQuery({ + queryKey: [ + QueryKeys.ConnextSdk("approval"), + connextSdk, + originDomain, + originTokenAddress, + amount, + ], + queryFn: async () => { + if (!connextSdk) throw new Error("SDK not ready"); + const approveTx = await connextSdk.approveIfNeeded( + originDomain, + originTokenAddress, + // uint256 in string + parseEther(amount).toString(), + // fixes approval + false, + ); + if (!approveTx) + return { + isApprovalNeeded: false, + approveTx: undefined, + } as const; + return { + isApprovalNeeded: true, + approveTx, + } as const; + }, + enabled: !!connextSdk && !isInputZero(amount), + }); +}; + +export const useConnextWriteApprove = () => { + const signer = useEthersSigner(); + return useMutation({ + mutationFn: async ({ + approveData, + }: { + approveData: ReturnType["data"] | undefined; + }) => { + if (!signer) throw new Error("Signer not ready"); + if (!approveData) throw new Error("Approval data not ready"); + if (!approveData.isApprovalNeeded) throw new Error("Approval not needed"); + const approveTxReq = approveData.approveTx; + const approveTx = await signer.sendTransaction(approveTxReq); + toast.promise( + () => + new Promise((resolve, reject) => + approveTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), + { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }, + ); + await approveTx.wait(); + }, + }); +}; + +export const useConnextWriteBridge = () => { + const { address } = useAccount(); + const signer = useEthersSigner(); + + const { data: connextSdk } = useConnextSdk(); + return useMutation({ + mutationFn: async ({ + originDomain, + destinationDomain, + originTokenAddress, + amount, + slippage, + relayerFee, + }: { + originDomain: string; + destinationDomain: string; + originTokenAddress: string; + amount: string; // uint256 in string + slippage: string; // in % + relayerFee: string; // in wei + }) => { + if (!connextSdk) throw new Error("SDK not ready"); + if (!address) throw new Error("Not connected"); + if (!signer) throw new Error("Signer not ready"); + if (!relayerFee) throw new Error("Relayer fee not ready"); + const bridgeTxParams = { + origin: originDomain, + destination: destinationDomain, + to: address, + asset: originTokenAddress, + delegate: address, + callData: "0x", + // uint256 in string + amount: parseEther(amount).toString(), + // uint256 in string + relayerFee: parseEther(relayerFee).toString(), + // in BPS (basis points) in string + slippage: parseUnits(slippage, 2).toString(), + }; + const xcallTxReq = await connextSdk.xcall(bridgeTxParams); + const xcallTx = await signer.sendTransaction(xcallTxReq); + toast.promise( + () => + new Promise((resolve, reject) => + xcallTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), + { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }, + ); + await xcallTx.wait(); + }, + }); +}; From b02c2bb385cd0094c974afb93e5131c8c243cd46 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Wed, 7 Aug 2024 16:08:23 +0200 Subject: [PATCH 08/46] refactor, switch ethers for ethersproject/providers, fix approvals for alchemix gateways --- package.json | 2 +- pnpm-lock.yaml | 6 +- .../bridge/connext/ConnextBridgeWidget.tsx | 56 +--- src/components/bridge/connext/lib/connext.ts | 299 +++++++++++++----- src/hooks/useEthersSigner.ts | 4 +- src/lib/config/bridge.ts | 6 + 6 files changed, 249 insertions(+), 124 deletions(-) create mode 100644 src/lib/config/bridge.ts diff --git a/package.json b/package.json index 8b6c83b8..c9e8fff2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@connext/sdk": "^2.4.1", + "@ethersproject/providers": "^5.7.2", "@lifi/widget": "^3.0.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-dialog": "^1.1.1", @@ -30,7 +31,6 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "dayjs": "^1.11.12", - "ethers": "5", "dnum": "^2.13.1", "framer-motion": "^11.3.21", "graphql": "^16.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d3371b3..62bbc8f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@connext/sdk': specifier: ^2.4.1 version: 2.4.1(bufferutil@4.0.8)(sinon@18.0.0)(utf-8-validate@5.0.10) + '@ethersproject/providers': + specifier: ^5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@lifi/widget': specifier: ^3.0.0 version: 3.0.0(c2loocxmeuqlwdvkz7sde3ujfy) @@ -68,9 +71,6 @@ importers: dnum: specifier: ^2.13.1 version: 2.13.1 - ethers: - specifier: '5' - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) framer-motion: specifier: ^11.3.21 version: 11.3.21(@emotion/is-prop-valid@1.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index 935fac51..652d3b26 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -1,13 +1,7 @@ import { useSwitchChain } from "wagmi"; import { useCallback, useState } from "react"; import { isAddress, zeroAddress } from "viem"; -import { arbitrum, mainnet, optimism } from "viem/chains"; import { useTokensQuery } from "@/lib/queries/useTokensQuery"; -import { - ALCX_MAINNET_ADDRESS, - ALCX_ARBITRUM_ADDRESS, - ALCX_OPTIMISM_ADDRESS, -} from "@/lib/constants"; import { Select, SelectTrigger, @@ -20,7 +14,6 @@ import { TokenInput } from "@/components/common/input/TokenInput"; import { SlippageInput } from "@/components/common/input/SlippageInput"; import { Button } from "@/components/ui/button"; import { isInputZero } from "@/utils/inputNotZero"; -import { SYNTH_ASSETS_ADDRESSES } from "@/lib/config/synths"; import { useChain } from "@/hooks/useChain"; import { formatNumber } from "@/utils/number"; import { @@ -29,36 +22,11 @@ import { useConnextApproval, useConnextWriteApprove, useConnextWriteBridge, + chainIdToDomainMapping, + bridgeChains, + chainToAvailableTokensMapping, } from "./lib/connext"; -const chainIdToDomainMapping = { - [mainnet.id.toString()]: "6648936", - [optimism.id.toString()]: "1869640809", - [arbitrum.id.toString()]: "1634886255", -} as const; - -const chainToAvailableTokensMapping = { - [mainnet.id.toString()]: [ - ALCX_MAINNET_ADDRESS, - SYNTH_ASSETS_ADDRESSES[mainnet.id].alETH, - SYNTH_ASSETS_ADDRESSES[mainnet.id].alUSD, - ].map((t) => t.toLowerCase()), - - [optimism.id.toString()]: [ - ALCX_OPTIMISM_ADDRESS, - SYNTH_ASSETS_ADDRESSES[optimism.id].alETH, - SYNTH_ASSETS_ADDRESSES[optimism.id].alUSD, - ].map((t) => t.toLowerCase()), - - [arbitrum.id.toString()]: [ - ALCX_ARBITRUM_ADDRESS, - SYNTH_ASSETS_ADDRESSES[arbitrum.id].alETH, - SYNTH_ASSETS_ADDRESSES[arbitrum.id].alUSD, - ].map((t) => t.toLowerCase()), -}; - -const bridgeChains = [mainnet, optimism, arbitrum]; - export const ConnextBridgeWidget = () => { const chain = useChain(); @@ -96,6 +64,7 @@ export const ConnextBridgeWidget = () => { originDomain, destinationDomain, }); + const { data: amountOut, isFetching: isFetchingAmountOut } = useConnextAmountOut({ originDomain, @@ -108,6 +77,7 @@ export const ConnextBridgeWidget = () => { originDomain, originTokenAddress, amount, + originChainId: parseInt(originChainId), }); const notReady = @@ -170,32 +140,24 @@ export const ConnextBridgeWidget = () => { [originChainId, switchChain], ); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (!approveData) return; if (approveData?.isApprovalNeeded === true) { writeApprove({ approveData }); return; } if (!relayerFee) return; + writeBridge({ originDomain, destinationDomain, + destinationChainId: parseInt(destinationChainId), originTokenAddress, amount, slippage, relayerFee, }); - }, [ - amount, - approveData, - destinationDomain, - originDomain, - originTokenAddress, - relayerFee, - slippage, - writeApprove, - writeBridge, - ]); + }; return (
diff --git a/src/components/bridge/connext/lib/connext.ts b/src/components/bridge/connext/lib/connext.ts index 455d25ff..5fc44244 100644 --- a/src/components/bridge/connext/lib/connext.ts +++ b/src/components/bridge/connext/lib/connext.ts @@ -1,28 +1,79 @@ -import { useAccount } from "wagmi"; +import { useAccount, usePublicClient, useWalletClient } from "wagmi"; import { toast } from "sonner"; -import { formatEther, parseEther, parseUnits } from "viem"; +import { + encodeAbiParameters, + erc20Abi, + formatEther, + isAddress, + parseAbiParameters, + parseEther, + parseUnits, + ContractFunctionRevertedError, + type TransactionReceipt, +} from "viem"; import { useMutation, useQuery } from "@tanstack/react-query"; +import { arbitrum, mainnet, optimism } from "viem/chains"; import type { SdkConfig } from "@connext/sdk"; +import type { TransactionReceipt as EthersTransactionReceipt } from "@ethersproject/providers"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { useEthersSigner } from "@/hooks/useEthersSigner"; +import { CONNEXT_GATEWAY_ADDRESSES } from "@/lib/config/bridge"; +import { SYNTH_ASSETS_ADDRESSES } from "@/lib/config/synths"; import { isInputZero } from "@/utils/inputNotZero"; +import { + ALCX_ARBITRUM_ADDRESS, + ALCX_MAINNET_ADDRESS, + ALCX_OPTIMISM_ADDRESS, +} from "@/lib/constants"; +import { useChain } from "@/hooks/useChain"; +import { wagmiConfig } from "@/lib/wagmi/wagmiConfig"; + +const ETH_DOMAIN = 6648936; +const OPTIMISM_DOMAIN = 1869640809; +const ARBITRUM_DOMAIN = 1634886255; + +export const bridgeChains = [mainnet, optimism, arbitrum]; +type SupportedBridgeChainIds = (typeof bridgeChains)[number]["id"]; + +export const chainIdToDomainMapping = { + [mainnet.id.toString()]: "6648936", + [optimism.id.toString()]: "1869640809", + [arbitrum.id.toString()]: "1634886255", +} as const; + +export const chainToAvailableTokensMapping = { + [mainnet.id.toString()]: [ + ALCX_MAINNET_ADDRESS, + SYNTH_ASSETS_ADDRESSES[mainnet.id].alETH, + SYNTH_ASSETS_ADDRESSES[mainnet.id].alUSD, + ].map((t) => t.toLowerCase()), + + [optimism.id.toString()]: [ + ALCX_OPTIMISM_ADDRESS, + SYNTH_ASSETS_ADDRESSES[optimism.id].alETH, + SYNTH_ASSETS_ADDRESSES[optimism.id].alUSD, + ].map((t) => t.toLowerCase()), + + [arbitrum.id.toString()]: [ + ALCX_ARBITRUM_ADDRESS, + SYNTH_ASSETS_ADDRESSES[arbitrum.id].alETH, + SYNTH_ASSETS_ADDRESSES[arbitrum.id].alUSD, + ].map((t) => t.toLowerCase()), +}; const sdkConfig = { network: "mainnet", chains: { - // ETH - 6648936: { + [ETH_DOMAIN]: { chainId: 1, providers: ["https://ethereum-rpc.publicnode.com"], }, - // OP - 1869640809: { + [OPTIMISM_DOMAIN]: { chainId: 10, providers: ["https://optimism-rpc.publicnode.com"], }, - // ARB - 1634886255: { + [ARBITRUM_DOMAIN]: { chainId: 42161, providers: ["https://arbitrum-one.publicnode.com"], }, @@ -116,47 +167,103 @@ export const useConnextAmountOut = ({ export const useConnextApproval = ({ originDomain, + originChainId, originTokenAddress, amount, }: { originDomain: string; + originChainId: number; originTokenAddress: string; amount: string; }) => { + const client = usePublicClient({ + chainId: originChainId as SupportedBridgeChainIds, + }); + const { data: wallet } = useWalletClient({ + chainId: originChainId as SupportedBridgeChainIds, + }); + + const { address } = useAccount(); + const { data: connextSdk } = useConnextSdk(); + return useQuery({ queryKey: [ QueryKeys.ConnextSdk("approval"), connextSdk, + address, + wallet, originDomain, + originChainId, originTokenAddress, amount, ], queryFn: async () => { if (!connextSdk) throw new Error("SDK not ready"); - const approveTx = await connextSdk.approveIfNeeded( - originDomain, - originTokenAddress, - // uint256 in string - parseEther(amount).toString(), - // fixes approval - false, - ); - if (!approveTx) - return { - isApprovalNeeded: false, - approveTx: undefined, - } as const; - return { - isApprovalNeeded: true, - approveTx, - } as const; + + const isInfiniteApproval = false; + + const isFromEth = +originDomain === ETH_DOMAIN; + + if (isFromEth) { + const approveTx = await connextSdk.approveIfNeeded( + originDomain, + originTokenAddress, + parseEther(amount).toString(), + isInfiniteApproval, + ); + return !approveTx + ? ({ isApprovalNeeded: false, approveTx: undefined } as const) + : ({ isApprovalNeeded: true, approveTx, type: "connext" } as const); + } + + // type guard + if (originChainId !== optimism.id && originChainId !== arbitrum.id) { + throw new Error("UNEXPECTED: Invalid bridge origin id."); + } + const gatewayAddress = CONNEXT_GATEWAY_ADDRESSES[originChainId]; + + if (!isAddress(originTokenAddress) || !isAddress(gatewayAddress)) { + throw new Error("Invalid address."); + } + + const allowance = await client.readContract({ + address: originTokenAddress, + abi: erc20Abi, + functionName: "allowance", + args: [address!, gatewayAddress], + }); + + const isApprovalNeeded = allowance < parseEther(amount); + + if (!isApprovalNeeded) { + return { isApprovalNeeded: false, approveTx: undefined } as const; + } + + if (!wallet) throw new Error("Wallet not ready."); + + const approveTx = async () => { + const { request } = await client.simulateContract({ + address: originTokenAddress, + abi: erc20Abi, + functionName: "approve", + args: [gatewayAddress, parseEther(amount)], + }); + const hash = await wallet.writeContract(request); + return hash; + }; + + return { isApprovalNeeded: true, approveTx, type: "viem" } as const; }, - enabled: !!connextSdk && !isInputZero(amount), + enabled: !!connextSdk && !isInputZero(amount) && !!address, }); }; export const useConnextWriteApprove = () => { + const chain = useChain(); + const client = usePublicClient({ + chainId: chain.id, + }); const signer = useEthersSigner(); return useMutation({ mutationFn: async ({ @@ -167,22 +274,49 @@ export const useConnextWriteApprove = () => { if (!signer) throw new Error("Signer not ready"); if (!approveData) throw new Error("Approval data not ready"); if (!approveData.isApprovalNeeded) throw new Error("Approval not needed"); - const approveTxReq = approveData.approveTx; - const approveTx = await signer.sendTransaction(approveTxReq); - toast.promise( - () => - new Promise((resolve, reject) => + + const { type, approveTx: approveTxReq } = approveData; + + const preparedRevertError = new ContractFunctionRevertedError({ + abi: erc20Abi, + functionName: "approve", + }); + const bridgePromiseToastDescription = { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }; + + let executionPromise: () => Promise< + EthersTransactionReceipt | TransactionReceipt + >; + + if (type === "connext") { + const approveTx = await signer.sendTransaction(approveTxReq); + executionPromise = () => + new Promise((resolve, reject) => approveTx .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), - { - loading: "Bridging...", - success: "Bridge success!", - error: "Bridge failed.", - }, - ); - await approveTx.wait(); + .then((receipt) => + receipt.status ? resolve(receipt) : reject(preparedRevertError), + ), + ); + } else { + const hash = await approveTxReq(); + executionPromise = () => + new Promise((resolve, reject) => { + client + .waitForTransactionReceipt({ hash }) + .then((receipt) => + receipt.status === "success" + ? resolve(receipt) + : reject(preparedRevertError), + ); + }); + } + + toast.promise(executionPromise, bridgePromiseToastDescription); + await executionPromise(); }, }); }; @@ -190,12 +324,12 @@ export const useConnextWriteApprove = () => { export const useConnextWriteBridge = () => { const { address } = useAccount(); const signer = useEthersSigner(); - const { data: connextSdk } = useConnextSdk(); return useMutation({ mutationFn: async ({ originDomain, destinationDomain, + destinationChainId, originTokenAddress, amount, slippage, @@ -203,6 +337,7 @@ export const useConnextWriteBridge = () => { }: { originDomain: string; destinationDomain: string; + destinationChainId: number; originTokenAddress: string; amount: string; // uint256 in string slippage: string; // in % @@ -212,36 +347,58 @@ export const useConnextWriteBridge = () => { if (!address) throw new Error("Not connected"); if (!signer) throw new Error("Signer not ready"); if (!relayerFee) throw new Error("Relayer fee not ready"); - const bridgeTxParams = { - origin: originDomain, - destination: destinationDomain, - to: address, - asset: originTokenAddress, - delegate: address, - callData: "0x", - // uint256 in string - amount: parseEther(amount).toString(), - // uint256 in string - relayerFee: parseEther(relayerFee).toString(), - // in BPS (basis points) in string - slippage: parseUnits(slippage, 2).toString(), - }; - const xcallTxReq = await connextSdk.xcall(bridgeTxParams); - const xcallTx = await signer.sendTransaction(xcallTxReq); - toast.promise( - () => - new Promise((resolve, reject) => - xcallTx - .wait() - .then((receipt) => (receipt.status === 1 ? resolve : reject)), - ), - { - loading: "Bridging...", - success: "Bridge success!", - error: "Bridge failed.", - }, - ); - await xcallTx.wait(); + + const isFromEth = +originDomain === ETH_DOMAIN; + const isToEth = +destinationDomain === ETH_DOMAIN; + + if (isFromEth) { + // type guard + if ( + destinationChainId !== optimism.id && + destinationChainId !== arbitrum.id + ) { + throw new Error("UNEXPECTED: Invalid bridge route."); + } + + const gatewayAddress = CONNEXT_GATEWAY_ADDRESSES[destinationChainId]; + const bridgeTxParams = { + origin: originDomain, + destination: destinationDomain, + to: gatewayAddress, + asset: originTokenAddress, + delegate: address, + callData: encodeAbiParameters(parseAbiParameters("address"), [ + address, + ]), + amount: parseEther(amount).toString(), + relayerFee: parseEther(relayerFee).toString(), + slippage: parseUnits(slippage, 2).toString(), // BPS + }; + const xcallTxReq = await connextSdk.xcall(bridgeTxParams); + const xcallTx = await signer.sendTransaction(xcallTxReq); + toast.promise( + () => + new Promise((resolve, reject) => + xcallTx + .wait() + .then((receipt) => (receipt.status === 1 ? resolve : reject)), + ), + { + loading: "Bridging...", + success: "Bridge success!", + error: "Bridge failed.", + }, + ); + await xcallTx.wait(); + return; + } + + if (isToEth) { + // TODO: implement bridge from L2 to L1 + return; + } + + // L2 to L2 }, }); }; diff --git a/src/hooks/useEthersSigner.ts b/src/hooks/useEthersSigner.ts index 5c27e2e3..7cddbba1 100644 --- a/src/hooks/useEthersSigner.ts +++ b/src/hooks/useEthersSigner.ts @@ -1,4 +1,4 @@ -import { providers } from "ethers"; +import { Web3Provider } from "@ethersproject/providers"; import { useMemo } from "react"; import type { Chain, Client, Transport, Account } from "viem"; import { Config, useConnectorClient } from "wagmi"; @@ -14,7 +14,7 @@ export function clientToSigner(client: Client) { name: chain.name, ensAddress: chain.contracts?.ensRegistry?.address, }; - const provider = new providers.Web3Provider(transport, network); + const provider = new Web3Provider(transport, network); const signer = provider.getSigner(account.address); return signer; } diff --git a/src/lib/config/bridge.ts b/src/lib/config/bridge.ts new file mode 100644 index 00000000..7cd03ee1 --- /dev/null +++ b/src/lib/config/bridge.ts @@ -0,0 +1,6 @@ +import { arbitrum, optimism } from "viem/chains"; + +export const CONNEXT_GATEWAY_ADDRESSES = { + [optimism.id]: "0x2a8B5F365Fb29C3E1a40a5cd14AD7f89050755Ed", + [arbitrum.id]: "0xd031Bd586CAAcd11e846c35D1a61dc543d4ee55D", +}; From 452c0fd1ee6529252a007ef90156aca71804354e Mon Sep 17 00:00:00 2001 From: t0rbik Date: Wed, 7 Aug 2024 17:00:57 +0200 Subject: [PATCH 09/46] fix toast --- src/components/bridge/connext/lib/connext.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/bridge/connext/lib/connext.ts b/src/components/bridge/connext/lib/connext.ts index 5fc44244..56425207 100644 --- a/src/components/bridge/connext/lib/connext.ts +++ b/src/components/bridge/connext/lib/connext.ts @@ -78,7 +78,6 @@ const sdkConfig = { providers: ["https://arbitrum-one.publicnode.com"], }, }, - // Turn down connext sdk logs in production. logLevel: "silent", } as const satisfies SdkConfig; @@ -281,10 +280,10 @@ export const useConnextWriteApprove = () => { abi: erc20Abi, functionName: "approve", }); - const bridgePromiseToastDescription = { - loading: "Bridging...", - success: "Bridge success!", - error: "Bridge failed.", + const approvePromiseToastDescription = { + loading: "Approving...", + success: "Approve success!", + error: "Approve failed.", }; let executionPromise: () => Promise< @@ -315,7 +314,7 @@ export const useConnextWriteApprove = () => { }); } - toast.promise(executionPromise, bridgePromiseToastDescription); + toast.promise(executionPromise, approvePromiseToastDescription); await executionPromise(); }, }); From e50914d43b67d9144f692f97649fd9a92d5e5791 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 9 Aug 2024 19:23:25 +0200 Subject: [PATCH 10/46] ts --- src/components/vaults/row/Withdraw.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/vaults/row/Withdraw.tsx b/src/components/vaults/row/Withdraw.tsx index 2f6f80f9..cad02932 100644 --- a/src/components/vaults/row/Withdraw.tsx +++ b/src/components/vaults/row/Withdraw.tsx @@ -105,7 +105,7 @@ export const Withdraw = ({ vault={vault} />
- {!isSelecedTokenYieldToken && ( + {!isSelectedTokenYieldToken && ( )}

From 15f83703151b01511a4a982d25584f5b252e7adb Mon Sep 17 00:00:00 2001 From: t0rbik Date: Thu, 15 Aug 2024 13:28:06 +0200 Subject: [PATCH 11/46] tsc --- src/components/bridge/Bridge.tsx | 2 -- src/components/bridge/connext/ConnextBridgeWidget.tsx | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/bridge/Bridge.tsx b/src/components/bridge/Bridge.tsx index f37023e7..0a274bfc 100644 --- a/src/components/bridge/Bridge.tsx +++ b/src/components/bridge/Bridge.tsx @@ -1,11 +1,9 @@ import { ConnextBridge } from "./connext/ConnextBridge"; -import { LiFiBridgeWidget } from "./lifi/LiFiBridgeWidget"; export const Bridge = () => { return (

-
); }; diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index 652d3b26..6cc87384 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -212,7 +212,9 @@ export const ConnextBridgeWidget = () => {

Relayer fee:

Date: Fri, 16 Aug 2024 12:59:52 +0200 Subject: [PATCH 12/46] custom hook --- .../common/input/VaultWithdrawTokenInput.tsx | 29 ++---- src/hooks/useStaticTokenAdapterWithdraw.ts | 90 +++++++++++++++++++ src/lib/mutations/useWithdraw.ts | 25 ++---- 3 files changed, 103 insertions(+), 41 deletions(-) create mode 100644 src/hooks/useStaticTokenAdapterWithdraw.ts diff --git a/src/components/common/input/VaultWithdrawTokenInput.tsx b/src/components/common/input/VaultWithdrawTokenInput.tsx index ae0f55b7..dfdc07b8 100644 --- a/src/components/common/input/VaultWithdrawTokenInput.tsx +++ b/src/components/common/input/VaultWithdrawTokenInput.tsx @@ -6,7 +6,7 @@ import { formatEther, formatUnits, parseUnits, zeroAddress } from "viem"; import { useWatchQuery } from "@/hooks/useWatchQuery"; import { useMemo } from "react"; import { TokenInput } from "./TokenInput"; -import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; +import { useStaticTokenAdapterWithdraw } from "@/hooks/useStaticTokenAdapterWithdraw"; export const VaultWithdrawTokenInput = ({ amount, @@ -132,28 +132,11 @@ export const VaultWithdrawTokenInput = ({ }, }); - /** - * Adjusted for Aave token adapters. - * So that when withdrawing Aave yield bearing token, you get exactly what you input. - * Used in conjunction with `dynamicToStaticAmount` read in `useWithdraw.tsx`. - * It is safe to assume that static adapter has same decimals as yield token (it inherits from it). - */ - const { data: balanceForYieldTokenAdapter } = useReadContract({ - address: vault.yieldToken, - chainId: chain.id, - abi: staticTokenAdapterAbi, - functionName: "staticToDynamicAmount", - args: [ - parseUnits(balanceForYieldToken ?? "0", vault.yieldTokenParams.decimals), - ], - query: { - enabled: - balanceForYieldToken !== undefined && - isSelectedTokenYieldToken && - !!vault.metadata.yieldTokenOverride, - select: (balance) => - formatUnits(balance, vault.yieldTokenParams.decimals), - }, + const { balanceForYieldTokenAdapter } = useStaticTokenAdapterWithdraw({ + typeGuard: "withdrawInput", + balanceForYieldToken, + isSelectedTokenYieldToken, + vault, }); const balance = isSelectedTokenYieldToken diff --git a/src/hooks/useStaticTokenAdapterWithdraw.ts b/src/hooks/useStaticTokenAdapterWithdraw.ts new file mode 100644 index 00000000..67ed0c6b --- /dev/null +++ b/src/hooks/useStaticTokenAdapterWithdraw.ts @@ -0,0 +1,90 @@ +import { useReadContract } from "wagmi"; + +import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; +import { useChain } from "./useChain"; +import { formatUnits, parseUnits } from "viem"; +import { Token, Vault } from "@/lib/types"; +import { isInputZero } from "@/utils/inputNotZero"; + +interface UseStaticTokenAdapterWithdrawAmountArgs { + typeGuard: "withdrawInput"; + + balanceForYieldToken: string | undefined; + isSelectedTokenYieldToken: boolean; + vault: Vault; + + amount?: never; + selectedToken?: never; +} + +interface UseStaticTokenAdapterAdjustedAmountArgs { + typeGuard: "adjustedAmount"; + + amount: string; + selectedToken: Token; + vault: Vault; + isSelectedTokenYieldToken: boolean; + + balanceForYieldToken?: never; +} + +type UseStaticTokenAdapterWithdrawArgs = + | UseStaticTokenAdapterWithdrawAmountArgs + | UseStaticTokenAdapterAdjustedAmountArgs; + +/** + * Adjusted for Aave static token adapter. + * Aim is to get the exact amount of yield token user wants to withdraw. + * We use it in withdraw input to adjust available balance to dynamic aave yield tokens. + * We use it in useWithdraw to adjust amount back to static amount for static token adapter. + * @dev It is safe to assume that static adapter has same decimals as yield token (it inherits from it). + */ +export const useStaticTokenAdapterWithdraw = ({ + typeGuard, + balanceForYieldToken, + isSelectedTokenYieldToken, + vault, + amount, + selectedToken, +}: UseStaticTokenAdapterWithdrawArgs) => { + const chain = useChain(); + + const { data: balanceForYieldTokenAdapter } = useReadContract({ + address: vault.yieldToken, + chainId: chain.id, + abi: staticTokenAdapterAbi, + functionName: "staticToDynamicAmount", + args: [ + parseUnits(balanceForYieldToken ?? "0", vault.yieldTokenParams.decimals), + ], + query: { + enabled: + typeGuard === "withdrawInput" && + balanceForYieldToken !== undefined && + isSelectedTokenYieldToken && + !!vault.metadata.yieldTokenOverride, + select: (balance) => + formatUnits(balance, vault.yieldTokenParams.decimals), + }, + }); + + const { data: aaveAdjustedAmount } = useReadContract({ + address: vault.yieldToken, + abi: staticTokenAdapterAbi, + functionName: "dynamicToStaticAmount", + args: [ + typeGuard === "adjustedAmount" + ? parseUnits(amount, selectedToken.decimals) + : 0n, + ], + query: { + enabled: + typeGuard === "adjustedAmount" && + !isInputZero(amount) && + isSelectedTokenYieldToken && + !!vault.metadata.yieldTokenOverride, + }, + }); + + return { balanceForYieldTokenAdapter, aaveAdjustedAmount }; +}; diff --git a/src/lib/mutations/useWithdraw.ts b/src/lib/mutations/useWithdraw.ts index fac6aa3e..dce851bd 100644 --- a/src/lib/mutations/useWithdraw.ts +++ b/src/lib/mutations/useWithdraw.ts @@ -18,8 +18,8 @@ import { wethGatewayAbi } from "@/abi/wethGateway"; import { calculateMinimumOut } from "@/utils/helpers/minAmountWithSlippage"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; -import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; import { isInputZero } from "@/utils/inputNotZero"; +import { useStaticTokenAdapterWithdraw } from "@/hooks/useStaticTokenAdapterWithdraw"; export const useWithdraw = ({ vault, @@ -49,23 +49,12 @@ export const useWithdraw = ({ const { address } = useAccount(); - /** - * Adjusted for Aave token adapters. - * So that when withdrawing Aave yield bearing token, you get exactly what you input. - * Used in conjunction with `staticToDynamic` read in `VaultWithdrawTokenInput.tsx`. - * It is safe to assume that static adapter has same decimals as yield token (it inherits from it). - */ - const { data: aaveAdjustedAmount } = useReadContract({ - address: vault.yieldToken, - abi: staticTokenAdapterAbi, - functionName: "dynamicToStaticAmount", - args: [parseUnits(amount, selectedToken.decimals)], - query: { - enabled: - !isInputZero(amount) && - isSelectedTokenYieldToken && - !!vault.metadata.yieldTokenOverride, - }, + const { aaveAdjustedAmount } = useStaticTokenAdapterWithdraw({ + typeGuard: "adjustedAmount", + amount, + selectedToken, + vault, + isSelectedTokenYieldToken, }); const withdrawAmount = From d680f693b784446a79ab751da99f5217769f3e4b Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 19 Aug 2024 14:00:12 +0200 Subject: [PATCH 13/46] abi --- src/abi/staticTokenAdapter.ts | 432 +++++++++++++++++++++++++++++++++- 1 file changed, 426 insertions(+), 6 deletions(-) diff --git a/src/abi/staticTokenAdapter.ts b/src/abi/staticTokenAdapter.ts index 634337f7..6beb5510 100644 --- a/src/abi/staticTokenAdapter.ts +++ b/src/abi/staticTokenAdapter.ts @@ -1,6 +1,426 @@ -import { parseAbi } from "viem"; - -export const staticTokenAdapterAbi = parseAbi([ - "function staticToDynamicAmount(uint256 amount) external view returns (uint256 dynamicAmount)", - "function dynamicToStaticAmount(uint256 amount) external view returns (uint256 staticAmount)", -]); +export const staticTokenAdapterAbi = [ + { + inputs: [ + { internalType: "address", name: "lendingPool", type: "address" }, + { internalType: "address", name: "rewardsController", type: "address" }, + { internalType: "address", name: "aToken", type: "address" }, + { internalType: "address", name: "_rewardCollector", type: "address" }, + { internalType: "string", name: "wrappedTokenName", type: "string" }, + { internalType: "string", name: "wrappedTokenSymbol", type: "string" }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { internalType: "address", name: "target", type: "address" }, + { internalType: "bool", name: "success", type: "bool" }, + { internalType: "bytes", name: "data", type: "bytes" }, + ], + name: "ERC20CallFailed", + type: "error", + }, + { inputs: [], name: "Unauthorized", type: "error" }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "address", name: "from", type: "address" }, + { indexed: true, internalType: "address", name: "to", type: "address" }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "ASSET", + outputs: [{ internalType: "contract IERC20", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ATOKEN", + outputs: [{ internalType: "contract IERC20", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "EIP712_REVISION", + outputs: [{ internalType: "bytes", name: "", type: "bytes" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "LENDING_POOL", + outputs: [ + { internalType: "contract ILendingPool", name: "", type: "address" }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "METADEPOSIT_TYPEHASH", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "METAWITHDRAWAL_TYPEHASH", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PERMIT_TYPEHASH", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "REWARDS_CONTROLLER", + outputs: [ + { + internalType: "contract IRewardsController", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "", type: "address" }], + name: "_nonces", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "acceptAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "admin", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "owner", type: "address" }, + { internalType: "address", name: "spender", type: "address" }, + ], + name: "allowance", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "spender", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + ], + name: "approve", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "account", type: "address" }], + name: "balanceOf", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "claimRewards", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [{ internalType: "uint8", name: "", type: "uint8" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "spender", type: "address" }, + { internalType: "uint256", name: "subtractedValue", type: "uint256" }, + ], + name: "decreaseAllowance", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "recipient", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + { internalType: "uint16", name: "referralCode", type: "uint16" }, + { internalType: "bool", name: "fromUnderlying", type: "bool" }, + ], + name: "deposit", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "account", type: "address" }], + name: "dynamicBalanceOf", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "amount", type: "uint256" }], + name: "dynamicToStaticAmount", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "chainId", type: "uint256" }], + name: "getDomainSeparator", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "spender", type: "address" }, + { internalType: "uint256", name: "addedValue", type: "uint256" }, + ], + name: "increaseAllowance", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "depositor", type: "address" }, + { internalType: "address", name: "recipient", type: "address" }, + { internalType: "uint256", name: "value", type: "uint256" }, + { internalType: "uint16", name: "referralCode", type: "uint16" }, + { internalType: "bool", name: "fromUnderlying", type: "bool" }, + { internalType: "uint256", name: "deadline", type: "uint256" }, + { + components: [ + { internalType: "uint8", name: "v", type: "uint8" }, + { internalType: "bytes32", name: "r", type: "bytes32" }, + { internalType: "bytes32", name: "s", type: "bytes32" }, + ], + internalType: "struct StaticATokenV3.SignatureParams", + name: "sigParams", + type: "tuple", + }, + { internalType: "uint256", name: "chainId", type: "uint256" }, + ], + name: "metaDeposit", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "owner", type: "address" }, + { internalType: "address", name: "recipient", type: "address" }, + { internalType: "uint256", name: "staticAmount", type: "uint256" }, + { internalType: "uint256", name: "dynamicAmount", type: "uint256" }, + { internalType: "bool", name: "toUnderlying", type: "bool" }, + { internalType: "uint256", name: "deadline", type: "uint256" }, + { + components: [ + { internalType: "uint8", name: "v", type: "uint8" }, + { internalType: "bytes32", name: "r", type: "bytes32" }, + { internalType: "bytes32", name: "s", type: "bytes32" }, + ], + internalType: "struct StaticATokenV3.SignatureParams", + name: "sigParams", + type: "tuple", + }, + { internalType: "uint256", name: "chainId", type: "uint256" }, + ], + name: "metaWithdraw", + outputs: [ + { internalType: "uint256", name: "", type: "uint256" }, + { internalType: "uint256", name: "", type: "uint256" }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pendingAdmin", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "owner", type: "address" }, + { internalType: "address", name: "spender", type: "address" }, + { internalType: "uint256", name: "value", type: "uint256" }, + { internalType: "uint256", name: "deadline", type: "uint256" }, + { internalType: "uint8", name: "v", type: "uint8" }, + { internalType: "bytes32", name: "r", type: "bytes32" }, + { internalType: "bytes32", name: "s", type: "bytes32" }, + { internalType: "uint256", name: "chainId", type: "uint256" }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "rate", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "rewardCollector", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "newAdmin", type: "address" }], + name: "setPendingAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "_rewardCollector", type: "address" }, + ], + name: "setRewardCollector", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "amount", type: "uint256" }], + name: "staticToDynamicAmount", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "to", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + ], + name: "transfer", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "from", type: "address" }, + { internalType: "address", name: "to", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + ], + name: "transferFrom", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "recipient", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + { internalType: "bool", name: "toUnderlying", type: "bool" }, + ], + name: "withdraw", + outputs: [ + { internalType: "uint256", name: "", type: "uint256" }, + { internalType: "uint256", name: "", type: "uint256" }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "recipient", type: "address" }, + { internalType: "uint256", name: "amount", type: "uint256" }, + { internalType: "bool", name: "toUnderlying", type: "bool" }, + ], + name: "withdrawDynamicAmount", + outputs: [ + { internalType: "uint256", name: "", type: "uint256" }, + { internalType: "uint256", name: "", type: "uint256" }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; From 4808e87bc4d243c474d8d4278f7bd861219fe84a Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 19 Aug 2024 14:09:48 +0200 Subject: [PATCH 14/46] scope to aave --- .../common/input/VaultWithdrawTokenInput.tsx | 3 +- src/hooks/useStaticTokenAdapterWithdraw.ts | 2 + src/lib/config/metadataTypes.ts | 17 ++++-- src/lib/config/vaults.ts | 60 +++++++++---------- src/lib/mutations/useWithdraw.ts | 4 +- 5 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/components/common/input/VaultWithdrawTokenInput.tsx b/src/components/common/input/VaultWithdrawTokenInput.tsx index dfdc07b8..5300fa71 100644 --- a/src/components/common/input/VaultWithdrawTokenInput.tsx +++ b/src/components/common/input/VaultWithdrawTokenInput.tsx @@ -140,7 +140,8 @@ export const VaultWithdrawTokenInput = ({ }); const balance = isSelectedTokenYieldToken - ? vault.metadata.yieldTokenOverride + ? vault.metadata.api.provider === "aave" && + vault.metadata.yieldTokenOverride ? balanceForYieldTokenAdapter : balanceForYieldToken : balanceForUnderlying; diff --git a/src/hooks/useStaticTokenAdapterWithdraw.ts b/src/hooks/useStaticTokenAdapterWithdraw.ts index 67ed0c6b..ee13c81c 100644 --- a/src/hooks/useStaticTokenAdapterWithdraw.ts +++ b/src/hooks/useStaticTokenAdapterWithdraw.ts @@ -59,6 +59,7 @@ export const useStaticTokenAdapterWithdraw = ({ ], query: { enabled: + vault.metadata.api.provider === "aave" && typeGuard === "withdrawInput" && balanceForYieldToken !== undefined && isSelectedTokenYieldToken && @@ -79,6 +80,7 @@ export const useStaticTokenAdapterWithdraw = ({ ], query: { enabled: + vault.metadata.api.provider === "aave" && typeGuard === "adjustedAmount" && !isInputZero(amount) && isSelectedTokenYieldToken && diff --git a/src/lib/config/metadataTypes.ts b/src/lib/config/metadataTypes.ts index 12e95a49..b184444a 100644 --- a/src/lib/config/metadataTypes.ts +++ b/src/lib/config/metadataTypes.ts @@ -41,6 +41,15 @@ export interface SynthAssetMetadata { export type MessageType = "info" | "warning" | "error"; +type ApiProvider = + | "meltedRewards" + | "aave" + | "yearn" + | "frax" + | "rocket" + | "vesper" + | "lido"; + export interface VaultMetadata { label: string; synthAssetType: SynthAsset; @@ -50,7 +59,7 @@ export interface VaultMetadata { api: { apr: AprFn; yieldType: string; - cacheKey: string; + provider: ApiProvider; bonus: BonusFn; }; disabledDepositTokens: Address[]; @@ -58,10 +67,10 @@ export interface VaultMetadata { gateway?: Address; migrator?: Address; /** - * This is the address of the actual yield bearing aave token, - * the regular yield token address in this case becomes a static token adapter, + * This is the address of the actual yield (bearing for aave) token, + * the regular yield token address in this case becomes a (static token adapter for aave or staking token for yearn), * that we use for the vaults. - * If it exists, means the vault is using static token adapter. + * If it exists, means the vault is using (static token adapter for aave or staking token for yearn). */ yieldTokenOverride?: Address; strategy?: string; diff --git a/src/lib/config/vaults.ts b/src/lib/config/vaults.ts index d27656f9..bfaa4e76 100644 --- a/src/lib/config/vaults.ts +++ b/src/lib/config/vaults.ts @@ -47,7 +47,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -62,7 +62,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -77,7 +77,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -93,7 +93,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getAaveBonusData, }, disabledDepositTokens: [], @@ -109,7 +109,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getAaveBonusData, }, disabledDepositTokens: [], @@ -125,7 +125,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getAaveBonusData, }, disabledDepositTokens: [], @@ -140,7 +140,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -155,7 +155,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getVesperApr, yieldType: "APR", - cacheKey: "vesper", + provider: "vesper", bonus: getVesperBonusData, }, disabledDepositTokens: [], @@ -170,7 +170,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getVesperApr, yieldType: "APR", - cacheKey: "vesper", + provider: "vesper", bonus: getVesperBonusData, }, disabledDepositTokens: [], @@ -185,7 +185,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getVesperApr, yieldType: "APR", - cacheKey: "vesper", + provider: "vesper", bonus: getVesperBonusData, }, disabledDepositTokens: [], @@ -201,7 +201,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getAaveBonusData, }, disabledDepositTokens: [], @@ -218,7 +218,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -235,7 +235,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getLidoApy, yieldType: "APR", - cacheKey: "lido", + provider: "lido", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -251,7 +251,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getRocketApr, yieldType: "APR", - cacheKey: "rocket", + provider: "rocket", bonus: getNoBonus, }, disabledDepositTokens: [GAS_ADDRESS, WETH_MAINNET_ADDRESS], @@ -268,7 +268,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getAaveBonusData, }, disabledDepositTokens: [], @@ -284,7 +284,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getVesperApr, yieldType: "APR", - cacheKey: "vesper", + provider: "vesper", bonus: getVesperBonusData, }, disabledDepositTokens: [], @@ -299,7 +299,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getFraxApy, yieldType: "APR", - cacheKey: "frax", + provider: "frax", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -316,7 +316,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -330,7 +330,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -344,7 +344,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -363,7 +363,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -380,7 +380,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], @@ -396,7 +396,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -417,7 +417,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "meltedRewards", + provider: "meltedRewards", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], @@ -438,7 +438,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "yearn", + provider: "yearn", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -457,7 +457,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getNoBonus, }, disabledDepositTokens: [], @@ -473,7 +473,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getLidoApy, yieldType: "APR", - cacheKey: "meltedRewards", + provider: "meltedRewards", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], @@ -495,7 +495,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getYearnApy, yieldType: "APY", - cacheKey: "meltedRewards", + provider: "meltedRewards", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], @@ -514,7 +514,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getAaveApr, yieldType: "APR", - cacheKey: "aave", + provider: "aave", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], @@ -530,7 +530,7 @@ export const VAULTS: VaultsConfig = { api: { apr: getLidoApy, yieldType: "APR", - cacheKey: "lido", + provider: "lido", bonus: getMeltedRewardsBonusData, }, disabledDepositTokens: [], diff --git a/src/lib/mutations/useWithdraw.ts b/src/lib/mutations/useWithdraw.ts index dce851bd..443a23a1 100644 --- a/src/lib/mutations/useWithdraw.ts +++ b/src/lib/mutations/useWithdraw.ts @@ -58,7 +58,9 @@ export const useWithdraw = ({ }); const withdrawAmount = - isSelectedTokenYieldToken && !!vault.metadata.yieldTokenOverride + vault.metadata.api.provider === "aave" && + isSelectedTokenYieldToken && + !!vault.metadata.yieldTokenOverride ? aaveAdjustedAmount : parseUnits(amount, selectedToken.decimals); From bc3030d550efc14b0f6ef3497705d6fbe9dcb113 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Tue, 27 Aug 2024 13:17:25 +0200 Subject: [PATCH 15/46] subscribe to `convertSharesToYield` balance --- .../common/input/VaultWithdrawTokenInput.tsx | 55 +++++++++++-------- .../vaults/row/VaultAccordionRow.tsx | 2 +- src/hooks/useStaticTokenAdapterWithdraw.ts | 5 +- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/components/common/input/VaultWithdrawTokenInput.tsx b/src/components/common/input/VaultWithdrawTokenInput.tsx index 5300fa71..ab2ab269 100644 --- a/src/components/common/input/VaultWithdrawTokenInput.tsx +++ b/src/components/common/input/VaultWithdrawTokenInput.tsx @@ -75,10 +75,6 @@ export const VaultWithdrawTokenInput = ({ }, }); - useWatchQuery({ - queryKeys: [sharesBalanceQueryKey, totalCollateralInDebtTokenQueryKey], - }); - const otherCoverInDebt = totalCollateralInDebtToken !== undefined && collateralInDebtToken !== undefined @@ -113,24 +109,25 @@ export const VaultWithdrawTokenInput = ({ }, }); - const { data: balanceForYieldToken } = useReadContract({ - address: vault.alchemist.address, - chainId: chain.id, - abi: alchemistV2Abi, - functionName: "convertUnderlyingTokensToYield", - args: [ - vault.yieldToken, - parseUnits( - balanceForUnderlying ?? "0", - vault.underlyingTokensParams.decimals, - ), - ], - query: { - enabled: balanceForUnderlying !== undefined, - select: (balance) => - formatUnits(balance, vault.yieldTokenParams.decimals), - }, - }); + const { data: balanceForYieldToken, queryKey: balanceForYieldTokenQueryKey } = + useReadContract({ + address: vault.alchemist.address, + chainId: chain.id, + abi: alchemistV2Abi, + functionName: "convertUnderlyingTokensToYield", + args: [ + vault.yieldToken, + parseUnits( + balanceForUnderlying ?? "0", + vault.underlyingTokensParams.decimals, + ), + ], + query: { + enabled: balanceForUnderlying !== undefined, + select: (balance) => + formatUnits(balance, vault.yieldTokenParams.decimals), + }, + }); const { balanceForYieldTokenAdapter } = useStaticTokenAdapterWithdraw({ typeGuard: "withdrawInput", @@ -139,6 +136,20 @@ export const VaultWithdrawTokenInput = ({ vault, }); + /** + * NOTE: Watch queries for changes in sharesBalance, totalCollateral, and balanceForYieldToken. + * sharesBalanceQueryKey - if user deposited or withdrawed from vault for yield token; + * totalCollateralInDebtTokenQueryKey - if user deposited or withdrawed from vault for yield token; + * balanceForYieldTokenQueryKey - because shares to yield token uses price which changes each block. + */ + useWatchQuery({ + queryKeys: [ + sharesBalanceQueryKey, + totalCollateralInDebtTokenQueryKey, + balanceForYieldTokenQueryKey, + ], + }); + const balance = isSelectedTokenYieldToken ? vault.metadata.api.provider === "aave" && vault.metadata.yieldTokenOverride diff --git a/src/components/vaults/row/VaultAccordionRow.tsx b/src/components/vaults/row/VaultAccordionRow.tsx index 64613096..c8f9a5d2 100644 --- a/src/components/vaults/row/VaultAccordionRow.tsx +++ b/src/components/vaults/row/VaultAccordionRow.tsx @@ -288,7 +288,7 @@ export const CurrencyCell = ({ : 0; return ( -
+

{formatNumber(tokenAmountFormated, { dustToZero: true, tokenDecimals })}{" "} {tokenSymbol} diff --git a/src/hooks/useStaticTokenAdapterWithdraw.ts b/src/hooks/useStaticTokenAdapterWithdraw.ts index ee13c81c..5f6e2053 100644 --- a/src/hooks/useStaticTokenAdapterWithdraw.ts +++ b/src/hooks/useStaticTokenAdapterWithdraw.ts @@ -88,5 +88,8 @@ export const useStaticTokenAdapterWithdraw = ({ }, }); - return { balanceForYieldTokenAdapter, aaveAdjustedAmount }; + return { + balanceForYieldTokenAdapter, + aaveAdjustedAmount, + }; }; From 0f1d132998a55149d527c97dd844c00f93427f48 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Wed, 28 Aug 2024 16:11:33 +0200 Subject: [PATCH 16/46] prevent balance flash --- src/hooks/useStaticTokenAdapterWithdraw.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hooks/useStaticTokenAdapterWithdraw.ts b/src/hooks/useStaticTokenAdapterWithdraw.ts index 5f6e2053..93c6e018 100644 --- a/src/hooks/useStaticTokenAdapterWithdraw.ts +++ b/src/hooks/useStaticTokenAdapterWithdraw.ts @@ -1,10 +1,11 @@ +import { keepPreviousData } from "@tanstack/react-query"; import { useReadContract } from "wagmi"; +import { formatUnits, parseUnits } from "viem"; import { staticTokenAdapterAbi } from "@/abi/staticTokenAdapter"; -import { useChain } from "./useChain"; -import { formatUnits, parseUnits } from "viem"; import { Token, Vault } from "@/lib/types"; import { isInputZero } from "@/utils/inputNotZero"; +import { useChain } from "./useChain"; interface UseStaticTokenAdapterWithdrawAmountArgs { typeGuard: "withdrawInput"; @@ -66,6 +67,7 @@ export const useStaticTokenAdapterWithdraw = ({ !!vault.metadata.yieldTokenOverride, select: (balance) => formatUnits(balance, vault.yieldTokenParams.decimals), + placeholderData: keepPreviousData, }, }); From 9e61d567b63ad23d136a29455731945a2334f0df Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 30 Aug 2024 12:45:41 +0200 Subject: [PATCH 17/46] apy to apr --- src/components/layout/LeftBlock.tsx | 2 +- .../row/TransmuterAccordionRow.tsx | 4 +- .../transmuters/row/TransmuterApr.tsx | 133 ++++++++++++++++ .../transmuters/row/TransmuterApy.tsx | 147 ------------------ src/lib/config/metadataTypes.ts | 2 +- src/lib/config/transmuters.ts | 32 ++-- src/lib/queries/queriesSchema.ts | 2 +- 7 files changed, 154 insertions(+), 168 deletions(-) create mode 100644 src/components/transmuters/row/TransmuterApr.tsx delete mode 100644 src/components/transmuters/row/TransmuterApy.tsx diff --git a/src/components/layout/LeftBlock.tsx b/src/components/layout/LeftBlock.tsx index 1cc9c869..1d98722d 100644 --- a/src/components/layout/LeftBlock.tsx +++ b/src/components/layout/LeftBlock.tsx @@ -25,7 +25,7 @@ export function LeftBlock() { diff --git a/src/components/transmuters/row/TransmuterAccordionRow.tsx b/src/components/transmuters/row/TransmuterAccordionRow.tsx index b44e733e..828260d9 100644 --- a/src/components/transmuters/row/TransmuterAccordionRow.tsx +++ b/src/components/transmuters/row/TransmuterAccordionRow.tsx @@ -10,7 +10,7 @@ import { Transmuter } from "@/lib/types"; import { Deposit } from "./Deposit"; import { Withdraw } from "./Withdraw"; import { Claim } from "./Claim"; -import { TransmuterApy } from "./TransmuterApy"; +import { TransmuterApr } from "./TransmuterApr"; export const TransmuterAccordionRow = ({ transmuter, @@ -90,7 +90,7 @@ export const TransmuterAccordionRow = ({ )}

- +
diff --git a/src/components/transmuters/row/TransmuterApr.tsx b/src/components/transmuters/row/TransmuterApr.tsx new file mode 100644 index 00000000..b0099582 --- /dev/null +++ b/src/components/transmuters/row/TransmuterApr.tsx @@ -0,0 +1,133 @@ +import { useQuery } from "@tanstack/react-query"; +import { InfoIcon } from "lucide-react"; + +import { dayjs } from "@/lib/dayjs"; +import { Transmuter } from "@/lib/types"; +import { formatNumber } from "@/utils/number"; +import { QueryKeys } from "@/lib/queries/queriesSchema"; + +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { ONE_DAY_IN_MS } from "@/lib/constants"; + +interface TransmuterAprDuneQueryResponse { + execution_id: string; + query_id: number; + is_execution_finished: boolean; + state: string; + submitted_at: string; + expires_at: string; + execution_started_at: string; + execution_ended_at: string; + result: { + rows: [ + { + projected_yield_rate: number; + time_to_transmute: number; + }, + ]; + metadata: { + column_names: string[]; + column_types: string[]; + row_count: number; + result_set_bytes: number; + total_row_count: number; + total_result_set_bytes: number; + datapoint_count: number; + pending_time_millis: number; + execution_time_millis: number; + }; + }; +} + +const DUNE_API_ENDPOINT = "https://api.dune.com/api/v1/query"; +const API_KEY = import.meta.env.VITE_DUNE_API_KEY; + +export const TransmuterApr = ({ transmuter }: { transmuter: Transmuter }) => { + const { data, isError, isPending } = useQuery({ + queryKey: [ + QueryKeys.TransmuterApr, + transmuter.address, + transmuter.metadata.aprQueryUri, + ], + queryFn: async () => { + const response = await fetch( + `${DUNE_API_ENDPOINT}/${transmuter.metadata.aprQueryUri}/results?api_key=${API_KEY}`, + ); + const data = (await response.json()) as TransmuterAprDuneQueryResponse; + + const apr = data.result.rows[0].projected_yield_rate; + const timeToTransmute = data.result.rows[0].time_to_transmute; + + if (apr === undefined || timeToTransmute === undefined) { + throw new Error("APR fetch failed."); + } + + return { + apr, + timeToTransmute, + }; + }, + enabled: !!transmuter.metadata.aprQueryUri, + staleTime: ONE_DAY_IN_MS, + retry: false, + }); + return ( +
+
+

APR

+ +
+
+

+ {isError || !transmuter.metadata.aprQueryUri + ? "N/A" + : isPending + ? "..." + : `${formatNumber(data.apr, { allowNegative: false })}%`} +

+ {!!data?.timeToTransmute && ( +

+ {formatNumber( + dayjs.duration({ years: data.timeToTransmute }).asDays(), + )}{" "} + days +

+ )} +
+
+ ); +}; + +const TransmuterAprPopover = () => { + return ( + + + + + e.stopPropagation()}> +

+ Users are credited with corresponding assets based on the deposited + alAsset amount. +
+
+ The alAsset is burned when user claims the transmuted token. +

+
+
+ Learn more. + + + + ); +}; diff --git a/src/components/transmuters/row/TransmuterApy.tsx b/src/components/transmuters/row/TransmuterApy.tsx deleted file mode 100644 index af6621b7..00000000 --- a/src/components/transmuters/row/TransmuterApy.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { InfoIcon } from "lucide-react"; - -import { dayjs } from "@/lib/dayjs"; -import { Transmuter } from "@/lib/types"; -import { formatNumber } from "@/utils/number"; -import { QueryKeys } from "@/lib/queries/queriesSchema"; - -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { ONE_DAY_IN_MS } from "@/lib/constants"; - -interface TransmuterApyDuneQueryResponse { - execution_id: string; - query_id: number; - is_execution_finished: boolean; - state: string; - submitted_at: string; - expires_at: string; - execution_started_at: string; - execution_ended_at: string; - result: { - rows: [ - { - projected_yield_rate: number; - time_to_transmute: number; - }, - ]; - metadata: { - column_names: string[]; - column_types: string[]; - row_count: number; - result_set_bytes: number; - total_row_count: number; - total_result_set_bytes: number; - datapoint_count: number; - pending_time_millis: number; - execution_time_millis: number; - }; - }; -} - -const DUNE_API_ENDPOINT = "https://api.dune.com/api/v1/query"; -const API_KEY = import.meta.env.VITE_DUNE_API_KEY; - -export const TransmuterApy = ({ transmuter }: { transmuter: Transmuter }) => { - const { data, isError, isPending } = useQuery({ - queryKey: [ - QueryKeys.TransmuterApy, - transmuter.address, - transmuter.metadata.apyQueryUri, - ], - queryFn: async () => { - const response = await fetch( - `${DUNE_API_ENDPOINT}/${transmuter.metadata.apyQueryUri}/results?api_key=${API_KEY}`, - ); - const data = (await response.json()) as TransmuterApyDuneQueryResponse; - - const apy = data.result.rows[0].projected_yield_rate; - const timeToTransmute = data.result.rows[0].time_to_transmute; - - if (!apy) { - throw new Error("APY is not available."); - } - - return { - apy, - timeToTransmute, - }; - }, - enabled: !!transmuter.metadata.apyQueryUri, - staleTime: ONE_DAY_IN_MS, - retry: false, - }); - return ( -
-

APY

- {isError || !transmuter.metadata.apyQueryUri ? ( -
-

N/A

- -
- ) : isPending ? ( -

...

- ) : ( -
-

{formatNumber(data.apy, { allowNegative: false })}%

- -
- )} -
- ); -}; - -const TransmuterApyPopover = ({ - timeToTransmute, -}: { - timeToTransmute: number; -}) => { - return ( - - - - - - {timeToTransmute > 0 && ( -

- It will take approximately{" "} - - {formatNumber( - dayjs.duration({ years: timeToTransmute }).asDays(), - )}{" "} - days - {" "} - to transmute your deposit. -

- )} -

- Yield will increase, if more people deposit to - Alchemix, or liquidate/repay their loans. Yield will{" "} - decrease, if more people deposit alTOKEN in the - Transmuter. -

-
-
- ); -}; - -const NAPopover = ({ isError }: { isError: boolean }) => { - return ( - - - - - -

{isError ? "Error. Report to Alchemix" : "Coming soon!"}

-
-
- ); -}; diff --git a/src/lib/config/metadataTypes.ts b/src/lib/config/metadataTypes.ts index d42956f6..a5750a7f 100644 --- a/src/lib/config/metadataTypes.ts +++ b/src/lib/config/metadataTypes.ts @@ -9,7 +9,7 @@ export interface TransmuterMetadata { address: Address; label: string; synthAsset: SynthAsset; - apyQueryUri: string; + aprQueryUri: string; } export type TransmutersMetadata = { diff --git a/src/lib/config/transmuters.ts b/src/lib/config/transmuters.ts index 48a34784..6eb0b079 100644 --- a/src/lib/config/transmuters.ts +++ b/src/lib/config/transmuters.ts @@ -9,35 +9,35 @@ export const TRANSMUTERS = { address: "0xA840C73a004026710471F727252a9a2800a5197F", synthAsset: SYNTH_ASSETS.ALUSD, label: "Zosimos", - apyQueryUri: "3890313", + aprQueryUri: "3890313", }, //USDC { address: "0x49930AD9eBbbc0EB120CCF1a318c3aE5Bb24Df55", synthAsset: SYNTH_ASSETS.ALUSD, label: "Ge Hong", - apyQueryUri: "3861243", + aprQueryUri: "3861243", }, //USDT { address: "0xfC30820ba6d045b95D13a5B8dF4fB0E6B5bdF5b9", synthAsset: SYNTH_ASSETS.ALUSD, label: "Paracelsus", - apyQueryUri: "4026456", + aprQueryUri: "4026456", }, //FRAX { address: "0xE107Fa35D775C77924926C0292a9ec1FC14262b2", synthAsset: SYNTH_ASSETS.ALUSD, label: "Flamel", - apyQueryUri: "3989525", + aprQueryUri: "3989525", }, //WETH { address: "0x03323143a5f0D0679026C2a9fB6b0391e4D64811", synthAsset: SYNTH_ASSETS.ALETH, label: "Van Helmont", - apyQueryUri: "3849355", + aprQueryUri: "3849355", }, ], [fantom.id]: [ @@ -46,21 +46,21 @@ export const TRANSMUTERS = { address: "0x486FCC9385dCd16fE9ac21a959B072dcB58912e0", synthAsset: SYNTH_ASSETS.ALUSD, label: "Zosimos", - apyQueryUri: "", + aprQueryUri: "", }, //USDC { address: "0xaE653176d1AF6A68B5ce57481427a065E1baC49f", synthAsset: SYNTH_ASSETS.ALUSD, label: "Ge Hong", - apyQueryUri: "", + aprQueryUri: "", }, //USDT { address: "0x53F05426D48E667c6a131F17db1b6f7AC535aBC6", synthAsset: SYNTH_ASSETS.ALUSD, label: "Paracelsus", - apyQueryUri: "", + aprQueryUri: "", }, ], [optimism.id]: [ @@ -69,28 +69,28 @@ export const TRANSMUTERS = { address: "0xFCD619923456E20EAe298B35E3606277b391BBB4", synthAsset: SYNTH_ASSETS.ALUSD, label: "Zosimos", - apyQueryUri: "4026735", + aprQueryUri: "4026735", }, //USDC { address: "0xA7ea9ef9E2b5e15971040230F5d6b75C68Aab723", synthAsset: SYNTH_ASSETS.ALUSD, label: "Ge Hong", - apyQueryUri: "", + aprQueryUri: "", }, //USDT { address: "0x4e7d2115E4FeEcD802c96E77B8e03D98104415fa", synthAsset: SYNTH_ASSETS.ALUSD, label: "Paracelsus", - apyQueryUri: "", + aprQueryUri: "", }, //ETH { address: "0xb7C4250f83289ff3Ea9f21f01AAd0b02fb19491a", synthAsset: SYNTH_ASSETS.ALETH, label: "Van Helmont", - apyQueryUri: "3862748", + aprQueryUri: "3862748", }, ], [arbitrum.id]: [ @@ -99,28 +99,28 @@ export const TRANSMUTERS = { address: "0xD6a5577c2f6200591Fe077E45861B24AeeB408e9", synthAsset: SYNTH_ASSETS.ALUSD, label: "Zosimos", - apyQueryUri: "", + aprQueryUri: "", }, //USDC { address: "0xe7ec71B894583E9C1b07873fA86A7e81f3940eA8", synthAsset: SYNTH_ASSETS.ALUSD, label: "Ge Hong", - apyQueryUri: "3947029", + aprQueryUri: "3947029", }, //USDT { address: "0x2a8B5F365Fb29C3E1a40a5cd14AD7f89050755Ed", synthAsset: SYNTH_ASSETS.ALUSD, label: "Paracelsus", - apyQueryUri: "", + aprQueryUri: "", }, //ETH { address: "0x1EB7D78d7f6D73e5de67Fa62Fd8b55c54Aa9c0D4", synthAsset: SYNTH_ASSETS.ALETH, label: "Van Helmont", - apyQueryUri: "3888361", + aprQueryUri: "3888361", }, ], } as const satisfies TransmutersMetadata; diff --git a/src/lib/queries/queriesSchema.ts b/src/lib/queries/queriesSchema.ts index e6526b94..02cbb078 100644 --- a/src/lib/queries/queriesSchema.ts +++ b/src/lib/queries/queriesSchema.ts @@ -13,7 +13,7 @@ export const QueryKeys = { Delegate: "delegate", TokenPrice: "tokenPrice", Transmuters: "transmuters", - TransmuterApy: "transmuter-apy", + TransmuterApr: "transmuter-apr", Apr: "apr", Migration: (v: string) => `migrate-${v}`, VotesForAddress: "votesForAddress", From 731676d088ff018fd379c1b14fcb8620ef314bac Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 30 Aug 2024 17:20:02 +0200 Subject: [PATCH 18/46] no redundant memoization, more granular button pending/fetching states --- src/components/common/CtaButton.tsx | 21 +++++ .../common/input/VaultWithdrawTokenInput.tsx | 16 ++-- src/components/farms/GAlcxWrapper.tsx | 10 +-- .../governance/row/ProposalAccordionRow.tsx | 25 +++--- src/components/transmuters/row/Claim.tsx | 16 ++-- src/components/transmuters/row/Deposit.tsx | 37 +++++---- src/components/transmuters/row/Withdraw.tsx | 16 ++-- .../vaults/common_actions/Borrow.tsx | 15 ++-- .../vaults/common_actions/Liquidate.tsx | 20 ++--- .../vaults/common_actions/Repay.tsx | 61 +++++++------- src/components/vaults/row/Deposit.tsx | 18 ++-- src/components/vaults/row/Migrate.tsx | 24 ++---- src/components/vaults/row/Withdraw.tsx | 18 ++-- src/hooks/useAllowance.ts | 57 ++++++++----- src/lib/mutations/useDeposit.ts | 42 +++++----- src/lib/mutations/useMigrate.ts | 83 +++++++++++++------ src/lib/mutations/useWithdraw.ts | 52 +++++------- 17 files changed, 291 insertions(+), 240 deletions(-) create mode 100644 src/components/common/CtaButton.tsx diff --git a/src/components/common/CtaButton.tsx b/src/components/common/CtaButton.tsx new file mode 100644 index 00000000..ec39193b --- /dev/null +++ b/src/components/common/CtaButton.tsx @@ -0,0 +1,21 @@ +import { useAccount } from "wagmi"; +import { Button } from "../ui/button"; +import { useConnectModal } from "@rainbow-me/rainbowkit"; +import { ComponentPropsWithRef } from "react"; + +/** + * Button that opens connect modal if the user is not connected. + */ +export const CtaButton = (props: ComponentPropsWithRef) => { + const { address } = useAccount(); + const { openConnectModal } = useConnectModal(); + return ( + + ); +}; diff --git a/src/components/common/input/VaultWithdrawTokenInput.tsx b/src/components/common/input/VaultWithdrawTokenInput.tsx index ab2ab269..0c424a21 100644 --- a/src/components/common/input/VaultWithdrawTokenInput.tsx +++ b/src/components/common/input/VaultWithdrawTokenInput.tsx @@ -4,7 +4,6 @@ import { Vault } from "@/lib/types"; import { alchemistV2Abi } from "@/abi/alchemistV2"; import { formatEther, formatUnits, parseUnits, zeroAddress } from "viem"; import { useWatchQuery } from "@/hooks/useWatchQuery"; -import { useMemo } from "react"; import { TokenInput } from "./TokenInput"; import { useStaticTokenAdapterWithdraw } from "@/hooks/useStaticTokenAdapterWithdraw"; @@ -75,12 +74,7 @@ export const VaultWithdrawTokenInput = ({ }, }); - const otherCoverInDebt = - totalCollateralInDebtToken !== undefined && - collateralInDebtToken !== undefined - ? totalCollateralInDebtToken - collateralInDebtToken - : 0n; - const balanceInDebt = useMemo(() => { + const balanceInDebt = (() => { if (collateralInDebtToken === undefined) { return 0n; } @@ -90,12 +84,18 @@ export const VaultWithdrawTokenInput = ({ const maxWithdrawAmount = collateralInDebtToken - requiredCoverInDebt; + const otherCoverInDebt = + totalCollateralInDebtToken !== undefined && + collateralInDebtToken !== undefined + ? totalCollateralInDebtToken - collateralInDebtToken + : 0n; + if (otherCoverInDebt >= requiredCoverInDebt) { return collateralInDebtToken; } else { return maxWithdrawAmount; } - }, [collateralInDebtToken, otherCoverInDebt, vault]); + })(); const { data: balanceForUnderlying } = useReadContract({ address: vault.alchemist.address, diff --git a/src/components/farms/GAlcxWrapper.tsx b/src/components/farms/GAlcxWrapper.tsx index 7e818ab7..095ceec0 100644 --- a/src/components/farms/GAlcxWrapper.tsx +++ b/src/components/farms/GAlcxWrapper.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Switch } from "../ui/switch"; import { Button } from "../ui/button"; import { @@ -122,7 +122,7 @@ export const GAlcsWrapper = () => { setAmount(""); }; - const onWrap = useCallback(() => { + const onWrap = () => { if (isApprovalNeeded) { approveConfig && approve(approveConfig.request); return; @@ -145,9 +145,9 @@ export const GAlcsWrapper = () => { description: "Unexpected error. Please contact Alchemix team.", }); } - }, [approve, approveConfig, isApprovalNeeded, wrap, wrapConfig, wrapError]); + }; - const onUnwrap = useCallback(() => { + const onUnwrap = () => { if (unwrapError) { toast.error("Error unwrapping ALCX", { description: @@ -165,7 +165,7 @@ export const GAlcsWrapper = () => { description: "Unexpected error. Please contact Alchemix team.", }); } - }, [unwrap, unwrapConfig, unwrapError]); + }; const handleOpen = () => { setOpen((prev) => !prev); diff --git a/src/components/governance/row/ProposalAccordionRow.tsx b/src/components/governance/row/ProposalAccordionRow.tsx index 3fd25733..707b2ff8 100644 --- a/src/components/governance/row/ProposalAccordionRow.tsx +++ b/src/components/governance/row/ProposalAccordionRow.tsx @@ -1,5 +1,5 @@ import { getAddress } from "viem"; -import { Fragment, useMemo, useState } from "react"; +import { Fragment, useState } from "react"; import { useAccount, useWalletClient } from "wagmi"; import { toast } from "sonner"; import { @@ -68,24 +68,21 @@ export const ProposalsAccordionRow = ({ proposal }: { proposal: Proposal }) => { const isSupported = supportedTypes.indexOf(proposal.type) !== -1; - const message = useMemo(() => { - const choice = proposal.choices.indexOf(selectedChoice) + 1; - return { - choice, - proposal: proposal.id, - app: "alchemix", - space: "alchemixstakers.eth", - type: proposal.type, - metadata: "{}", - reason: "", - }; - }, [proposal, selectedChoice]); - const { mutate: writeVote, isPending } = useMutation({ mutationFn: async () => { if (!address) throw new Error("Not connected."); if (!walletClient) throw new Error("No wallet."); + const message = { + choice: proposal.choices.indexOf(selectedChoice) + 1, + proposal: proposal.id, + app: "alchemix", + space: "alchemixstakers.eth", + type: proposal.type, + metadata: "{}", + reason: "", + }; + const type2 = message.proposal.startsWith("0x"); const types = type2 ? { diff --git a/src/components/transmuters/row/Claim.tsx b/src/components/transmuters/row/Claim.tsx index 60b2cf1f..a121fd84 100644 --- a/src/components/transmuters/row/Claim.tsx +++ b/src/components/transmuters/row/Claim.tsx @@ -1,13 +1,13 @@ import { transmuterV2Abi } from "@/abi/transmuterV2"; +import { CtaButton } from "@/components/common/CtaButton"; import { TransmuterInput } from "@/components/common/input/TransmuterInput"; -import { Button } from "@/components/ui/button"; import { useChain } from "@/hooks/useChain"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { Token, Transmuter } from "@/lib/types"; import { isInputZero } from "@/utils/inputNotZero"; import { useQueryClient } from "@tanstack/react-query"; -import { useCallback, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { toast } from "sonner"; import { parseUnits } from "viem"; import { @@ -34,7 +34,7 @@ export const Claim = ({ const { data: claimConfig, - isFetching, + isPending, error: claimConfigError, } = useSimulateContract({ address: transmuter.address, @@ -64,7 +64,7 @@ export const Claim = ({ } }, [claimReceipt, queryClient]); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (claimConfigError) { toast.error("Claim failed", { description: @@ -81,7 +81,7 @@ export const Claim = ({ description: "Unknown error occurred. Please contact Alchemix team.", }); } - }, [claim, claimConfig, claimConfigError]); + }; return ( <> @@ -95,13 +95,13 @@ export const Claim = ({ tokenDecimals={underlyingToken.decimals} /> - + ); }; diff --git a/src/components/transmuters/row/Deposit.tsx b/src/components/transmuters/row/Deposit.tsx index 872f4037..69bd1e66 100644 --- a/src/components/transmuters/row/Deposit.tsx +++ b/src/components/transmuters/row/Deposit.tsx @@ -1,6 +1,6 @@ import { transmuterV2Abi } from "@/abi/transmuterV2"; +import { CtaButton } from "@/components/common/CtaButton"; import { TransmuterInput } from "@/components/common/input/TransmuterInput"; -import { Button } from "@/components/ui/button"; import { useAllowance } from "@/hooks/useAllowance"; import { useChain } from "@/hooks/useChain"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; @@ -8,7 +8,7 @@ import { QueryKeys } from "@/lib/queries/queriesSchema"; import { Token, Transmuter } from "@/lib/types"; import { isInputZero } from "@/utils/inputNotZero"; import { useQueryClient } from "@tanstack/react-query"; -import { useCallback, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { toast } from "sonner"; import { parseEther } from "viem"; import { @@ -33,7 +33,13 @@ export const Deposit = ({ const [depositAmount, setDepositAmount] = useState(""); - const { isApprovalNeeded, approve, approveConfig } = useAllowance({ + const { + isApprovalNeeded, + approve, + approveConfig, + isPending: isPendingAllowance, + isFetching: isFetchingAllowance, + } = useAllowance({ tokenAddress: syntheticToken.address, spender: transmuter.address, amount: depositAmount, @@ -42,7 +48,7 @@ export const Deposit = ({ const { data: depositConfig, - isFetching, + isPending: isPendingDepositConfig, error: depositConfigError, } = useSimulateContract({ address: transmuter.address, @@ -73,7 +79,7 @@ export const Deposit = ({ } }, [depositReceipt, queryClient]); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (isApprovalNeeded === true) { approveConfig && approve(approveConfig.request); return; @@ -96,14 +102,12 @@ export const Deposit = ({ description: "Unkown error. Please contact Alchemix team.", }); } - }, [ - isApprovalNeeded, - depositConfigError, - depositConfig, - approveConfig, - approve, - deposit, - ]); + }; + + const isPending = + isApprovalNeeded === false + ? isPendingDepositConfig + : isPendingAllowance || isFetchingAllowance; return ( <> @@ -116,13 +120,14 @@ export const Deposit = ({ type="Balance" transmuterAddress={transmuter.address} /> - + ); }; diff --git a/src/components/transmuters/row/Withdraw.tsx b/src/components/transmuters/row/Withdraw.tsx index 6a231d0b..dbd222a4 100644 --- a/src/components/transmuters/row/Withdraw.tsx +++ b/src/components/transmuters/row/Withdraw.tsx @@ -1,13 +1,13 @@ import { transmuterV2Abi } from "@/abi/transmuterV2"; +import { CtaButton } from "@/components/common/CtaButton"; import { TransmuterInput } from "@/components/common/input/TransmuterInput"; -import { Button } from "@/components/ui/button"; import { useChain } from "@/hooks/useChain"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { Token, Transmuter } from "@/lib/types"; import { isInputZero } from "@/utils/inputNotZero"; import { useQueryClient } from "@tanstack/react-query"; -import { useCallback, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { toast } from "sonner"; import { parseEther } from "viem"; import { @@ -34,7 +34,7 @@ export const Withdraw = ({ const { data: withdrawConfig, - isFetching, + isPending, error: withdrawConfigError, } = useSimulateContract({ address: transmuter.address, @@ -64,7 +64,7 @@ export const Withdraw = ({ } }, [withdrawReceipt, queryClient]); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (withdrawConfigError) { toast.error("Withdraw failed", { description: @@ -81,7 +81,7 @@ export const Withdraw = ({ description: "Unknown error occurred. Please contact Alchemix team.", }); } - }, [withdraw, withdrawConfig, withdrawConfigError]); + }; return ( <> @@ -95,13 +95,13 @@ export const Withdraw = ({ tokenDecimals={syntheticToken.decimals} /> - + ); }; diff --git a/src/components/vaults/common_actions/Borrow.tsx b/src/components/vaults/common_actions/Borrow.tsx index 30160725..87404d61 100644 --- a/src/components/vaults/common_actions/Borrow.tsx +++ b/src/components/vaults/common_actions/Borrow.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { BorrowInput } from "@/components/common/input/BorrowInput"; import { Select, @@ -29,6 +29,7 @@ import { Switch } from "@/components/ui/switch"; import { AnimatePresence, m } from "framer-motion"; import { Input } from "@/components/ui/input"; import { accordionTransition, accordionVariants } from "@/lib/motion/motion"; +import { CtaButton } from "@/components/common/CtaButton"; export const Borrow = () => { const queryClient = useQueryClient(); @@ -76,7 +77,7 @@ export const Borrow = () => { const { data: borrowConfig, error: borrowError, - isFetching, + isPending, } = useSimulateContract({ address: alchemistForDebtTokenAddress, abi: alchemistV2Abi, @@ -123,7 +124,7 @@ export const Borrow = () => { setConfirmedDifferentAddress(checked); }; - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (borrowError) { toast.error("Borrow failed", { description: @@ -141,7 +142,7 @@ export const Borrow = () => { "Borrow failed. Unexpected. Please contract Alchemix team.", }); } - }, [borrow, borrowConfig, borrowError]); + }; return (
@@ -239,19 +240,19 @@ export const Borrow = () => { )}
- + )}
diff --git a/src/components/vaults/common_actions/Liquidate.tsx b/src/components/vaults/common_actions/Liquidate.tsx index 51636506..bdda7f5d 100644 --- a/src/components/vaults/common_actions/Liquidate.tsx +++ b/src/components/vaults/common_actions/Liquidate.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { Select, SelectTrigger, @@ -7,7 +7,6 @@ import { SelectItem, } from "@/components/ui/select"; import { useTokensQuery } from "@/lib/queries/useTokensQuery"; -import { Button } from "@/components/ui/button"; import { useReadContract, useSimulateContract, @@ -31,6 +30,7 @@ import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutati import { Switch } from "@/components/ui/switch"; import { SlippageInput } from "@/components/common/input/SlippageInput"; import { MAX_UINT256_BN } from "@/lib/constants"; +import { CtaButton } from "@/components/common/CtaButton"; export const Liquidate = () => { const queryClient = useQueryClient(); @@ -120,7 +120,7 @@ export const Liquidate = () => { const { data: liquidateConfig, - isFetching, + isPending, error: liquidateError, } = useSimulateContract({ address: ALCHEMISTS_METADATA[chain.id][selectedSynthAsset], @@ -186,7 +186,7 @@ export const Liquidate = () => { setConfirmedLiquidation(checked); }; - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (liquidateError) { toast.error("Liquidate failed", { description: @@ -204,7 +204,7 @@ export const Liquidate = () => { description: "Unknown error. Please contact Alchemix team.", }); } - }, [liquidate, liquidateConfig, liquidateError]); + }; return (
@@ -270,16 +270,14 @@ export const Liquidate = () => { repay the outstanding debt
- + {isPending ? "Preparing..." : "Liquidate"} + )}
diff --git a/src/components/vaults/common_actions/Repay.tsx b/src/components/vaults/common_actions/Repay.tsx index 748e4e0b..92be5dbb 100644 --- a/src/components/vaults/common_actions/Repay.tsx +++ b/src/components/vaults/common_actions/Repay.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { Select, SelectTrigger, @@ -7,7 +7,6 @@ import { SelectItem, } from "@/components/ui/select"; import { useTokensQuery } from "@/lib/queries/useTokensQuery"; -import { Button } from "@/components/ui/button"; import { useAccount, useSimulateContract, @@ -28,6 +27,7 @@ import { isInputZero } from "@/utils/inputNotZero"; import { QueryKeys } from "@/lib/queries/queriesSchema"; import { useWriteContractMutationCallback } from "@/hooks/useWriteContractMutationCallback"; import { RepayInput } from "@/components/common/input/RepayInput"; +import { CtaButton } from "@/components/common/CtaButton"; export const Repay = () => { const queryClient = useQueryClient(); @@ -74,17 +74,23 @@ export const Repay = () => { (token) => token.address === repaymentTokenAddress, ); - const { isApprovalNeeded, approve, approveConfig, approveUsdtEthConfig } = - useAllowance({ - tokenAddress: repaymentToken?.address, - spender: ALCHEMISTS_METADATA[chain.id][selectedSynthAsset], - amount, - decimals: repaymentToken?.decimals, - }); + const { + isApprovalNeeded, + approve, + approveConfig, + approveUsdtEthConfig, + isPending: isPendingAllowance, + isFetching: isFetchingAllowance, + } = useAllowance({ + tokenAddress: repaymentToken?.address, + spender: ALCHEMISTS_METADATA[chain.id][selectedSynthAsset], + amount, + decimals: repaymentToken?.decimals, + }); const { data: burnConfig, - isFetching: isFetchingBurnConfig, + isPending: isPendingBurnConfig, error: burnConfigError, } = useSimulateContract({ address: ALCHEMISTS_METADATA[chain.id][selectedSynthAsset], @@ -105,7 +111,7 @@ export const Repay = () => { const { data: repayConfig, - isFetching: isFetchingRepayConfig, + isPending: isPendingRepayConfig, error: repayConfigError, } = useSimulateContract({ address: ALCHEMISTS_METADATA[chain.id][selectedSynthAsset], @@ -161,7 +167,7 @@ export const Repay = () => { setSelectedSynthAsset(newSynthAsset); }; - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (isApprovalNeeded) { if (approveUsdtEthConfig?.request) { approve(approveUsdtEthConfig.request); @@ -211,24 +217,15 @@ export const Repay = () => { "Repay failed. Unknown error. Please contact Alchemix team.", }); } - }, [ - approve, - approveConfig?.request, - approveUsdtEthConfig?.request, - burnConfig, - burnConfigError, - isApprovalNeeded, - repay, - repayConfig, - repayConfigError, - repaymentToken?.symbol, - selectedSynthAsset, - ]); + }; - const isFetching = - repaymentToken?.symbol.toLowerCase() === selectedSynthAsset.toLowerCase() - ? isFetchingBurnConfig - : isFetchingRepayConfig; + const isPending = + isApprovalNeeded === false + ? repaymentToken?.symbol.toLowerCase() === + selectedSynthAsset.toLowerCase() + ? isPendingBurnConfig + : isPendingRepayConfig + : isPendingAllowance || isFetchingAllowance; return (
@@ -283,16 +280,16 @@ export const Repay = () => { } />
- + )}
diff --git a/src/components/vaults/row/Deposit.tsx b/src/components/vaults/row/Deposit.tsx index 9e527940..2c01aaf8 100644 --- a/src/components/vaults/row/Deposit.tsx +++ b/src/components/vaults/row/Deposit.tsx @@ -1,7 +1,6 @@ import { Token, Vault } from "@/lib/types"; import { TokenInput } from "@/components/common/input/TokenInput"; -import { Button } from "@/components/ui/button"; -import { useCallback, useState } from "react"; +import { useState } from "react"; import { Select, SelectTrigger, @@ -19,6 +18,7 @@ import { alchemistV2Abi } from "@/abi/alchemistV2"; import { useChain } from "@/hooks/useChain"; import { SlippageInput } from "@/components/common/input/SlippageInput"; import { VaultActionMotionDiv } from "./motion"; +import { CtaButton } from "@/components/common/CtaButton"; export const Deposit = ({ vault, @@ -80,7 +80,7 @@ export const Deposit = ({ const isSelectedTokenYieldToken = token.address.toLowerCase() === yieldTokenData.address.toLowerCase(); - const { isApprovalNeeded, writeApprove, writeDeposit, isFetching } = + const { isApprovalNeeded, writeApprove, writeDeposit, isPending } = useDeposit({ vault, selectedToken: token, @@ -90,13 +90,13 @@ export const Deposit = ({ setAmount, }); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (token.address !== GAS_ADDRESS && isApprovalNeeded === true) { writeApprove(); } else { writeDeposit(); } - }, [token, isApprovalNeeded, writeApprove, writeDeposit]); + }; return ( @@ -139,20 +139,20 @@ export const Deposit = ({ {!isSelectedTokenYieldToken && ( )} - +
); diff --git a/src/components/vaults/row/Migrate.tsx b/src/components/vaults/row/Migrate.tsx index 5d6c12de..8f94baeb 100644 --- a/src/components/vaults/row/Migrate.tsx +++ b/src/components/vaults/row/Migrate.tsx @@ -6,13 +6,13 @@ import { SelectContent, SelectItem, } from "@/components/ui/select"; -import { Button } from "@/components/ui/button"; -import { useCallback, useMemo, useState } from "react"; +import { useMemo, useState } from "react"; import { useMigrate } from "@/lib/mutations/useMigrate"; import { MigrateTokenInput } from "@/components/common/input/MigrateTokenInput"; import { isInputZero } from "@/utils/inputNotZero"; import { useTokensQuery } from "@/lib/queries/useTokensQuery"; import { VaultActionMotionDiv } from "./motion"; +import { CtaButton } from "@/components/common/CtaButton"; export const Migrate = ({ vault, @@ -45,7 +45,7 @@ export const Migrate = ({ writeWithdrawApprove, writeMintApprove, writeMigrate, - isFetching, + isPending, } = useMigrate({ currentVault: vault, amount, @@ -53,7 +53,7 @@ export const Migrate = ({ selectedVault, }); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (isApprovalNeededWithdraw === true) { writeWithdrawApprove(); return; @@ -63,13 +63,7 @@ export const Migrate = ({ return; } writeMigrate(); - }, [ - isApprovalNeededMint, - isApprovalNeededWithdraw, - writeMigrate, - writeMintApprove, - writeWithdrawApprove, - ]); + }; return ( @@ -120,20 +114,20 @@ export const Migrate = ({ vault={vault} />
- +
); diff --git a/src/components/vaults/row/Withdraw.tsx b/src/components/vaults/row/Withdraw.tsx index 8616cd7e..e4333d21 100644 --- a/src/components/vaults/row/Withdraw.tsx +++ b/src/components/vaults/row/Withdraw.tsx @@ -1,6 +1,5 @@ import { Token, Vault } from "@/lib/types"; -import { Button } from "@/components/ui/button"; -import { useCallback, useState } from "react"; +import { useState } from "react"; import { Select, SelectTrigger, @@ -17,6 +16,7 @@ import { formatNumber } from "@/utils/number"; import { formatEther } from "viem"; import { SlippageInput } from "@/components/common/input/SlippageInput"; import { VaultActionMotionDiv } from "./motion"; +import { CtaButton } from "@/components/common/CtaButton"; export const Withdraw = ({ vault, @@ -47,7 +47,7 @@ export const Withdraw = ({ const isSelectedTokenYieldToken = token.address.toLowerCase() === yieldTokenData.address.toLowerCase(); - const { isApprovalNeeded, writeApprove, writeWithdraw, isFetching } = + const { isApprovalNeeded, writeApprove, writeWithdraw, isPending } = useWithdraw({ vault, selectedToken: token, @@ -58,13 +58,13 @@ export const Withdraw = ({ isSelectedTokenYieldToken, }); - const onCtaClick = useCallback(() => { + const onCtaClick = () => { if (isApprovalNeeded === true) { writeApprove(); } else { writeWithdraw(); } - }, [isApprovalNeeded, writeApprove, writeWithdraw]); + }; const onSelectChange = (value: string) => { setAmount(""); @@ -122,18 +122,18 @@ export const Withdraw = ({ )}{" "} {vault.alchemist.synthType}

- +
); diff --git a/src/hooks/useAllowance.ts b/src/hooks/useAllowance.ts index b26fca0b..f779bef2 100644 --- a/src/hooks/useAllowance.ts +++ b/src/hooks/useAllowance.ts @@ -38,7 +38,8 @@ export const useAllowance = ({ const { data: allowanceData, queryKey: isApprovalNeededQueryKey, - isFetching, + isPending: isPendingAllowance, + isFetching: isFetchingAllowance, } = useReadContract({ address: tokenAddress, abi: erc20Abi, @@ -57,29 +58,33 @@ export const useAllowance = ({ const { isApprovalNeeded, allowance } = allowanceData ?? {}; - const { data: approveConfig } = useSimulateContract({ - address: tokenAddress, - abi: erc20Abi, - functionName: "approve", - chainId: chain.id, - args: [ - spender, - isInfiniteApproval ? MAX_UINT256_BN : parseUnits(amount, decimals), - ], - query: { - enabled: - !isInputZero(amount) && - !!address && - isApprovalNeeded === true && - tokenAddress !== GAS_ADDRESS && - tokenAddress?.toLowerCase() !== USDT_MAINNET_ADDRESS.toLowerCase(), - }, - }); + const { data: approveConfig, isPending: isPendingApproveConfigToken } = + useSimulateContract({ + address: tokenAddress, + abi: erc20Abi, + functionName: "approve", + chainId: chain.id, + args: [ + spender, + isInfiniteApproval ? MAX_UINT256_BN : parseUnits(amount, decimals), + ], + query: { + enabled: + !isInputZero(amount) && + !!address && + isApprovalNeeded === true && + tokenAddress !== GAS_ADDRESS && + tokenAddress?.toLowerCase() !== USDT_MAINNET_ADDRESS.toLowerCase(), + }, + }); /** USDT on Ethereum doesn't follow ERC20 standard. * https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7#code#L199 */ - const { data: approveUsdtEthConfig } = useSimulateContract({ + const { + data: approveUsdtEthConfig, + isPending: isPendingApproveConfigUsdtEth, + } = useSimulateContract({ address: tokenAddress, abi: parseAbi(["function approve(address _spender, uint _value) public"]), functionName: "approve", @@ -116,11 +121,21 @@ export const useAllowance = ({ } }, [approvalReceipt, isApprovalNeededQueryKey, resetApprove, queryClient]); + const isPending = (() => { + if (isApprovalNeeded) { + if (tokenAddress?.toLowerCase() === USDT_MAINNET_ADDRESS.toLowerCase()) { + return isPendingApproveConfigUsdtEth || isPendingAllowance; + } + return isPendingApproveConfigToken || isPendingAllowance; + } else return isPendingAllowance; + })(); + return { isApprovalNeeded, approve, approveConfig, approveUsdtEthConfig, - isFetching, + isPending, + isFetching: isFetchingAllowance, }; }; diff --git a/src/lib/mutations/useDeposit.ts b/src/lib/mutations/useDeposit.ts index 34a2ad1a..f1d3f89e 100644 --- a/src/lib/mutations/useDeposit.ts +++ b/src/lib/mutations/useDeposit.ts @@ -5,7 +5,7 @@ import { useAllowance } from "@/hooks/useAllowance"; import { useChain } from "@/hooks/useChain"; import { Token, Vault } from "@/lib/types"; import { useQueryClient } from "@tanstack/react-query"; -import { useCallback, useEffect, useMemo } from "react"; +import { useCallback, useEffect } from "react"; import { toast } from "sonner"; import { parseUnits } from "viem"; import { @@ -73,6 +73,7 @@ export const useDeposit = ({ approveConfig, isApprovalNeeded, approveUsdtEthConfig, + isPending: isPendingAllowance, isFetching: isFetchingAllowance, } = useAllowance({ amount, @@ -84,7 +85,7 @@ export const useDeposit = ({ const { data: depositGatewayConfig, error: depositGatewayError, - isFetching: isDepositGatewayConfigFetching, + isPending: isDepositGatewayConfigPending, } = useSimulateContract({ address: vault.metadata.gateway, abi: aaveTokenGatewayAbi, @@ -126,7 +127,7 @@ export const useDeposit = ({ const { data: depositAlchemistConfig, error: depositAlchemistError, - isFetching: isDepositAlchemistConfigFetching, + isPending: isDepositAlchemistConfigPending, } = useSimulateContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -164,7 +165,7 @@ export const useDeposit = ({ const { data: depositGasConfig, error: depositGasError, - isFetching: isDepositGasConfigFetching, + isPending: isDepositGasConfigPending, } = useSimulateContract({ address: vault.metadata.wethGateway, abi: wethGatewayAbi, @@ -206,7 +207,7 @@ export const useDeposit = ({ const { data: depositUnderlyingConfig, error: depositUnderlyingError, - isFetching: isDepositUnderlyingConfigFetching, + isPending: isDepositUnderlyingConfigPending, } = useSimulateContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -374,7 +375,7 @@ export const useDeposit = ({ approveConfig?.request && approve(approveConfig.request); }, [approve, approveConfig, approveUsdtEthConfig]); - const isFetching = useMemo(() => { + const isPending = (() => { if (!amount) return; // deposit gateway if ( @@ -383,7 +384,9 @@ export const useDeposit = ({ !!vault.metadata.gateway && !!vault.metadata.yieldTokenOverride ) { - return isDepositGatewayConfigFetching || isFetchingAllowance; + if (isApprovalNeeded === false) { + return isDepositGatewayConfigPending; + } else return isPendingAllowance || isFetchingAllowance; } // deposit alchemist @@ -393,12 +396,14 @@ export const useDeposit = ({ !vault.metadata.gateway && !vault.metadata.yieldTokenOverride ) { - return isDepositAlchemistConfigFetching; + if (isApprovalNeeded === false) { + return isDepositAlchemistConfigPending; + } else return isPendingAllowance || isFetchingAllowance; } // deposit gas if (selectedToken.address === GAS_ADDRESS) { - return isDepositGasConfigFetching; + return isDepositGasConfigPending; } // if depositUnderlyingConfig is available, deposit using alchemist @@ -406,20 +411,11 @@ export const useDeposit = ({ selectedToken.address !== GAS_ADDRESS && selectedToken.address.toLowerCase() !== yieldToken.address.toLowerCase() ) { - return isDepositUnderlyingConfigFetching; + if (isApprovalNeeded === false) { + return isDepositUnderlyingConfigPending; + } else return isPendingAllowance || isFetchingAllowance; } - }, [ - amount, - isDepositAlchemistConfigFetching, - isDepositGasConfigFetching, - isDepositGatewayConfigFetching, - isDepositUnderlyingConfigFetching, - isFetchingAllowance, - selectedToken.address, - vault.metadata.gateway, - vault.metadata.yieldTokenOverride, - yieldToken.address, - ]); + })(); - return { writeDeposit, writeApprove, isApprovalNeeded, isFetching }; + return { writeDeposit, writeApprove, isApprovalNeeded, isPending }; }; diff --git a/src/lib/mutations/useMigrate.ts b/src/lib/mutations/useMigrate.ts index 2fda8ddf..06d24ffb 100644 --- a/src/lib/mutations/useMigrate.ts +++ b/src/lib/mutations/useMigrate.ts @@ -92,6 +92,8 @@ export const useMigrate = ({ const { data: isApprovalNeededWithdraw, + isPending: isPendingApprovalWithdraw, + isFetching: isFetchingApprovalWithdraw, queryKey: isApprovalNeededWithdrawQueryKey, } = useReadContract({ address: currentVault.alchemist.address, @@ -106,20 +108,24 @@ export const useMigrate = ({ }, }); - const { data: isApprovalNeededMint, queryKey: isApprovalNeededMintQueryKey } = - useReadContract({ - address: currentVault.alchemist.address, - abi: alchemistV2Abi, - chainId: chain.id, - functionName: "mintAllowance", - args: [address!, migratorToolAddress], - query: { - enabled: !!address, - select: (allowance) => - allowance === 0n || - (underlyingInDebt !== undefined && allowance < underlyingInDebt), - }, - }); + const { + data: isApprovalNeededMint, + isPending: isPendingApprovalMint, + isFetching: isFetchingApprovalMint, + queryKey: isApprovalNeededMintQueryKey, + } = useReadContract({ + address: currentVault.alchemist.address, + abi: alchemistV2Abi, + chainId: chain.id, + functionName: "mintAllowance", + args: [address!, migratorToolAddress], + query: { + enabled: !!address, + select: (allowance) => + allowance === 0n || + (underlyingInDebt !== undefined && allowance < underlyingInDebt), + }, + }); const { data: approveWithdrawConfig } = useSimulateContract({ address: currentVault.alchemist.address, @@ -138,6 +144,7 @@ export const useMigrate = ({ const { writeContract: writeWithdrawApprovePrepared, data: approveWithdrawHash, + reset: resetApproveWithdraw, } = useWriteContract({ mutation: mutationCallback({ action: "Approve withdraw", @@ -153,8 +160,14 @@ export const useMigrate = ({ queryClient.invalidateQueries({ queryKey: isApprovalNeededWithdrawQueryKey, }); + resetApproveWithdraw(); } - }, [approveWithdrawReceipt, isApprovalNeededWithdrawQueryKey, queryClient]); + }, [ + resetApproveWithdraw, + approveWithdrawReceipt, + isApprovalNeededWithdrawQueryKey, + queryClient, + ]); const { data: approveMintConfig } = useSimulateContract({ address: currentVault.alchemist.address, @@ -166,12 +179,15 @@ export const useMigrate = ({ }, }); - const { writeContract: writeMintApprovePrepared, data: approveMintHash } = - useWriteContract({ - mutation: mutationCallback({ - action: "Approve mint", - }), - }); + const { + writeContract: writeMintApprovePrepared, + data: approveMintHash, + reset: resetApproveMint, + } = useWriteContract({ + mutation: mutationCallback({ + action: "Approve mint", + }), + }); const { data: approveMintReceipt } = useWaitForTransactionReceipt({ hash: approveMintHash, @@ -182,12 +198,18 @@ export const useMigrate = ({ queryClient.invalidateQueries({ queryKey: isApprovalNeededMintQueryKey, }); + resetApproveMint(); } - }, [approveMintReceipt, isApprovalNeededMintQueryKey, queryClient]); + }, [ + resetApproveMint, + approveMintReceipt, + isApprovalNeededMintQueryKey, + queryClient, + ]); const { data: migrateConfig, - isFetching, + isPending: isPendingConfig, error: migrateConfigError, } = useSimulateContract({ address: migratorToolAddress, @@ -271,12 +293,25 @@ export const useMigrate = ({ writeMigratePrepared, ]); + const isPending = (() => { + if (!amount) return; + if (isApprovalNeededWithdraw === false && isApprovalNeededMint === false) { + return isPendingConfig; + } + return ( + isPendingApprovalMint || + isPendingApprovalWithdraw || + isFetchingApprovalMint || + isFetchingApprovalWithdraw + ); + })(); + return { isApprovalNeededWithdraw, isApprovalNeededMint, writeWithdrawApprove, writeMintApprove, writeMigrate, - isFetching, + isPending, }; }; diff --git a/src/lib/mutations/useWithdraw.ts b/src/lib/mutations/useWithdraw.ts index 36b53ffd..e010a907 100644 --- a/src/lib/mutations/useWithdraw.ts +++ b/src/lib/mutations/useWithdraw.ts @@ -3,7 +3,7 @@ import { alchemistV2Abi } from "@/abi/alchemistV2"; import { useChain } from "@/hooks/useChain"; import { Token, Vault } from "@/lib/types"; import { useQueryClient } from "@tanstack/react-query"; -import { useCallback, useEffect, useMemo } from "react"; +import { useCallback, useEffect } from "react"; import { toast } from "sonner"; import { parseUnits } from "viem"; import { @@ -100,7 +100,8 @@ export const useWithdraw = ({ const { data: isApprovalNeededAaveGateway, queryKey: isApprovalNeededAaveGatewayQueryKey, - isFetching: isApprovalNeededAaveGatewayFetching, + isPending: isPendingApprovalAaveGateway, + isFetching: isFetchingApprovalAaveGateway, } = useReadContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -122,7 +123,8 @@ export const useWithdraw = ({ const { data: isApprovalNeededWethGateway, queryKey: isApprovalNeededWethGatewayQueryKey, - isFetching: isApprovalNeededWethGatewayFetching, + isPending: isPendingApprovalWethGateway, + isFetching: isFetchingApprovalWethGateway, } = useReadContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -201,7 +203,7 @@ export const useWithdraw = ({ const { data: withdrawGatewayConfig, error: withdrawGatewayError, - isFetching: isWithdrawGatewayConfigFetching, + isPending: isWithdrawGatewayConfigPending, } = useSimulateContract({ address: vault.metadata.gateway, abi: aaveTokenGatewayAbi, @@ -240,7 +242,7 @@ export const useWithdraw = ({ const { data: withdrawAlchemistConfig, error: withdrawAlchemistError, - isFetching: isWithdrawAlchemistConfigFetching, + isPending: isWithdrawAlchemistConfigPending, } = useSimulateContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -278,7 +280,7 @@ export const useWithdraw = ({ const { data: withdrawGasConfig, error: withdrawGasError, - isFetching: isWithdrawGasConfigFetching, + isPending: isWithdrawGasConfigPending, } = useSimulateContract({ address: vault.metadata.wethGateway, abi: wethGatewayAbi, @@ -322,7 +324,7 @@ export const useWithdraw = ({ const { data: withdrawUnderlyingConfig, error: withdrawUnderlyingError, - isFetching: isWithdrawUnderlyingConfigFetching, + isPending: isWithdrawUnderlyingConfigPending, } = useSimulateContract({ address: vault.alchemist.address, abi: alchemistV2Abi, @@ -496,7 +498,7 @@ export const useWithdraw = ({ yieldToken.address, ]); - const isFetching = useMemo(() => { + const isPending = (() => { if (!amount) return; // withdraw gateway if ( @@ -505,9 +507,10 @@ export const useWithdraw = ({ !!vault.metadata.gateway && !!vault.metadata.yieldTokenOverride ) { - return ( - isWithdrawGatewayConfigFetching || isApprovalNeededAaveGatewayFetching - ); + if (isApprovalNeededAaveGateway === false) { + return isWithdrawGatewayConfigPending; + } else + return isPendingApprovalAaveGateway || isFetchingApprovalAaveGateway; } // withdraw alchemist @@ -517,14 +520,15 @@ export const useWithdraw = ({ !vault.metadata.gateway && !vault.metadata.yieldTokenOverride ) { - return ( - isWithdrawAlchemistConfigFetching || isApprovalNeededWethGatewayFetching - ); + return isWithdrawAlchemistConfigPending; } // withdraw gas if (selectedToken.address === GAS_ADDRESS) { - return isWithdrawGasConfigFetching; + if (isApprovalNeededWethGateway === false) { + return isWithdrawGasConfigPending; + } else + return isPendingApprovalWethGateway || isFetchingApprovalWethGateway; } // withdraw underlying @@ -532,26 +536,14 @@ export const useWithdraw = ({ selectedToken.address !== GAS_ADDRESS && selectedToken.address.toLowerCase() !== yieldToken.address.toLowerCase() ) { - return isWithdrawUnderlyingConfigFetching; + return isWithdrawUnderlyingConfigPending; } - }, [ - amount, - isWithdrawAlchemistConfigFetching, - isWithdrawGasConfigFetching, - isWithdrawGatewayConfigFetching, - isWithdrawUnderlyingConfigFetching, - isApprovalNeededAaveGatewayFetching, - isApprovalNeededWethGatewayFetching, - selectedToken.address, - vault.metadata.gateway, - vault.metadata.yieldTokenOverride, - yieldToken.address, - ]); + })(); return { isApprovalNeeded, writeApprove, writeWithdraw, - isFetching, + isPending, }; }; From 687d3b35c67b7073d58498d229701d28c598b631 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 30 Aug 2024 18:22:16 +0200 Subject: [PATCH 19/46] remove lifi widget --- package.json | 1 - pnpm-lock.yaml | 1329 +---------------- .../bridge/lifi/LiFiBridgeWidget.tsx | 148 -- 3 files changed, 24 insertions(+), 1454 deletions(-) delete mode 100644 src/components/bridge/lifi/LiFiBridgeWidget.tsx diff --git a/package.json b/package.json index 7eed693e..b87ba018 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "dependencies": { "@connext/sdk": "^2.4.1", "@ethersproject/providers": "^5.7.2", - "@lifi/widget": "^3.0.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-popover": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b47b4b18..a7b5ab62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@lifi/widget': - specifier: ^3.0.0 - version: 3.0.0(jjnkyh6cyrxgxf254wfk2drkny) '@radix-ui/react-accordion': specifier: ^1.2.0 version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -980,75 +977,15 @@ packages: '@connext/sdk@2.4.1': resolution: {integrity: sha512-1joMuZHL+1BjDs130wC+PQ5cS5HxLsSPp4EGBAGP64AehfcKMKU3s4ZYZW0l/qjs5Wovzaaho/X+cvnvPPgFYA==} - '@emotion/babel-plugin@11.12.0': - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} - - '@emotion/cache@11.11.0': - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - - '@emotion/cache@11.13.1': - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} - '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} '@emotion/is-prop-valid@1.3.0': resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} - '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.11.4': - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.0': - resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} - - '@emotion/sheet@1.2.2': - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/styled@11.11.5': - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/unitless@0.9.0': - resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} - - '@emotion/use-insertion-effect-with-fallbacks@1.1.0': - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} - peerDependencies: - react: '>=16.8.0' - - '@emotion/utils@1.2.1': - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - - '@emotion/utils@1.4.0': - resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} - - '@emotion/weak-memoize@0.3.1': - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1412,50 +1349,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lifi/sdk@3.0.0': - resolution: {integrity: sha512-Xinus12HOlQqJm/tdl3uNt0/Mp2+x3lK5cFPo2OsfLHmWirtc+tax1ExlUcDq5+ODURwKUrbo9WisHqa8DB1uA==} - peerDependencies: - '@solana/wallet-adapter-base': ^0.9.0 - '@solana/web3.js': ^1.93.0 - viem: ^2.16.0 - - '@lifi/types@13.18.2': - resolution: {integrity: sha512-LbAzsW9wWLwpgSWyf+WpJCKBfa3DwP9G40alKYx7AWn/EW90ulDahloxRiR5xID/JS7deP6IeR7ZQnU1IF/8TA==} - - '@lifi/wallet-management@3.0.0': - resolution: {integrity: sha512-LRvfUFN4y8NhgAfyTHVyYL3lUeAwsG1ojIFZy1IlSO1xec8aTFlt7JHE8bYe6cM97WfTRnmBfTexxwLG6lwOWw==} - peerDependencies: - '@lifi/sdk': ^3.0.0 - '@tanstack/react-query': ^5.0.0 - viem: ^2.16.0 - wagmi: ^2.10.0 - - '@lifi/widget@3.0.0': - resolution: {integrity: sha512-TzWXmoNbk0fbQNsMDSw7Rn8kJQnfO2BNrhMIWNY/0fTN69TmjAiM76j2+Qhz2JYNi89b8xYUboXd324zsY1K2A==} - peerDependencies: - '@emotion/react': ^11.11.0 - '@emotion/styled': ^11.11.0 - '@lifi/sdk': ^3.0.0 - '@lifi/wallet-management': ^3.0.0 - '@mui/icons-material': ^5.15.0 - '@mui/material': ^5.15.0 - '@solana/wallet-adapter-base': ^0.9.0 - '@solana/wallet-adapter-react': ^0.15.0 - '@solana/web3.js': ^1.93.0 - '@tanstack/react-query': ^5.17.0 - '@types/react': ^18.2.0 - i18next: ^23.11.0 - react: ^18.2.0 - react-dom: ^18.2.0 - react-i18next: ^14.1.0 - react-router-dom: ^6.22.0 - viem: ^2.16.0 - wagmi: ^2.10.0 - zustand: ^4.5.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@lit-labs/ssr-dom-shim@1.2.1': resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} @@ -1591,189 +1484,12 @@ packages: resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - '@mui/base@5.0.0-beta.40': - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/core-downloads-tracker@5.16.7': - resolution: {integrity: sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==} - - '@mui/icons-material@5.15.21': - resolution: {integrity: sha512-yqkq1MbdkmX5ZHyvZTBuAaA6RkvoqkoAgwBSx9Oh0L0jAfj9T/Ih/NhMNjkl8PWVSonjfDUkKroBnjRyo/1M9Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/lab@5.0.0-alpha.170': - resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@mui/material': '>=5.15.0' - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/material@5.15.21': - resolution: {integrity: sha512-nTyCcgduKwHqiuQ/B03EQUa+utSMzn2sQp0QAibsnYe4tvc3zkMbO0amKpl48vhABIY3IvT6w9615BFIgMt0YA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/private-theming@5.15.20': - resolution: {integrity: sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/private-theming@5.16.6': - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/styled-engine@5.15.14': - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/styled-engine@5.16.6': - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/system@5.15.20': - resolution: {integrity: sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/system@5.16.7': - resolution: {integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/types@7.2.14': - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/types@7.2.15': - resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.15.20': - resolution: {integrity: sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.16.6': - resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@noble/curves@1.4.0': resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - '@noble/curves@1.5.0': - resolution: {integrity: sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -1876,9 +1592,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -2378,10 +2091,6 @@ packages: '@types/react': optional: true - '@remix-run/router@1.17.1': - resolution: {integrity: sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==} - engines: {node: '>=14.0.0'} - '@rnx-kit/chromium-edge-launcher@1.0.0': resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} engines: {node: '>=14.15'} @@ -2534,80 +2243,6 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.1.3': - resolution: {integrity: sha512-IEvPzp4m39sWTS3gybbVfk1WQ5Bx9TrGlthtRlVw1BJPvjbmT6lTcnndgXp7HmMkz5e6cc8fwJWp3EKx5upAug==} - peerDependencies: - '@solana/web3.js': ^1.58.0 - - '@solana-mobile/mobile-wallet-adapter-protocol@2.1.3': - resolution: {integrity: sha512-rj1/cSQVjPYdQjHsJDxmlpgRjI9jly/0Md3bEeqCan2sLXPf5F6+TiVlAg9+Hxg+uVWd1peUrepFUdOykbklSw==} - peerDependencies: - '@solana/web3.js': ^1.58.0 - react-native: '>0.69' - - '@solana-mobile/wallet-adapter-mobile@2.1.3': - resolution: {integrity: sha512-V9gxV7/F1BLode6I+j134kFvQv1mnF0OlN+tYPHEmJOcH4caDfH6rlJy7t9Pktkl9ZEVTO9kT8K19Y4MRl6nxg==} - peerDependencies: - '@solana/web3.js': ^1.58.0 - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/wallet-adapter-base@0.9.23': - resolution: {integrity: sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.77.3 - - '@solana/wallet-adapter-react@0.15.35': - resolution: {integrity: sha512-i4hc/gNLTYNLMEt2LS+4lrrc0QAwa5SU2PtYMnZ2A3rsoKF5m1bv1h6cjLj2KBry4/zRGEBoqkiMOC5zHkLnRQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.77.3 - react: '*' - - '@solana/wallet-standard-chains@1.1.0': - resolution: {integrity: sha512-IRJHf94UZM8AaRRmY18d34xCJiVPJej1XVwXiTjihHnmwD0cxdQbc/CKjrawyqFyQAKJx7raE5g9mnJsAdspTg==} - engines: {node: '>=16'} - - '@solana/wallet-standard-core@1.1.1': - resolution: {integrity: sha512-DoQ5Ryly4GAZtxRUmW2rIWrgNvTYVCWrFCFFjZI5s4zu2QNsP7sHZUax3kc1GbmFLXNL1FWRZlPOXRs6e0ZEng==} - engines: {node: '>=16'} - - '@solana/wallet-standard-features@1.2.0': - resolution: {integrity: sha512-tUd9srDLkRpe1BYg7we+c4UhRQkq+XQWswsr/L1xfGmoRDF47BPSXf4zE7ZU2GRBGvxtGt7lwJVAufQyQYhxTQ==} - engines: {node: '>=16'} - - '@solana/wallet-standard-util@1.1.1': - resolution: {integrity: sha512-dPObl4ntmfOc0VAGGyyFvrqhL8UkHXmVsgbj0K9RcznKV4KB3MgjGwzo8CTSX5El5lkb0rDeEzFqvToJXRz3dw==} - engines: {node: '>=16'} - - '@solana/wallet-standard-wallet-adapter-base@1.1.2': - resolution: {integrity: sha512-DqhzYbgh3disHMgcz6Du7fmpG29BYVapNEEiL+JoVMa+bU9d4P1wfwXUNyJyRpGGNXtwhyZjIk2umWbe5ZBNaQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.58.0 - bs58: ^4.0.1 - - '@solana/wallet-standard-wallet-adapter-react@1.1.2': - resolution: {integrity: sha512-bN6W4QkzenyjUoUz3sC5PAed+z29icGtPh9VSmLl1ZrRO7NbFB49a8uwUUVXNxhL/ZbMsyVKhb9bNj47/p8uhQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/wallet-adapter-base': '*' - react: '*' - - '@solana/wallet-standard-wallet-adapter@1.1.2': - resolution: {integrity: sha512-lCwoA+vhPfmvjcmJOhSRV94wouVWTfJv1Z7eeULAe+GodCeKA/0T9/uBYgXHUxQjLHd7o8LpLYIkfm+xjA5sMA==} - engines: {node: '>=16'} - - '@solana/wallet-standard@1.1.2': - resolution: {integrity: sha512-o7wk+zr5/QgyE393cGRC04K1hacR4EkBu3MB925ddaLvCVaXjwr2asgdviGzN9PEm3FiEJp3sMmMKYHFnwOITQ==} - engines: {node: '>=16'} - - '@solana/web3.js@1.94.0': - resolution: {integrity: sha512-wMiBebzu5I2fTSz623uj6VXpWFhl0d7qJKqPFK2I4IBLTNUdv+bOeA4H7OBM7Gworv7sOvB3xibRql6l61MeqA==} - '@stablelib/aead@1.0.1': resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} @@ -2730,9 +2365,6 @@ packages: peerDependencies: '@svgr/core': '*' - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -2780,12 +2412,6 @@ packages: react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tanstack/react-virtual@3.8.1': - resolution: {integrity: sha512-dP5a7giEM4BQWLJ7K07ToZv8rF51mzbrBMkf0scg1QNYuFx3utnPUBPUHdzaowZhIez1K2XS78amuzD+YGRA5Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/router-devtools@1.43.10': resolution: {integrity: sha512-v6fi0U2r/VCN8vwukSjVRaM3anYI8QLqhfK++DuaABZBX2e9cTkmBCzMhA9e5J1bbuh7Zv1efh3GLuKdURqK7g==} engines: {node: '>=12'} @@ -2816,9 +2442,6 @@ packages: '@tanstack/store@0.5.5': resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==} - '@tanstack/virtual-core@3.8.1': - resolution: {integrity: sha512-uNtAwenT276M9QYCjTBoHZ8X3MUeCRoGK59zPi92hMIxdfS9AyHjkDWJ94WroDxnv48UE+hIeo21BU84jKc8aQ==} - '@types/abstract-leveldown@7.2.5': resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} @@ -2840,9 +2463,6 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -2891,9 +2511,6 @@ packages: '@types/node@22.2.0': resolution: {integrity: sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==} - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} @@ -2903,9 +2520,6 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react-transition-group@4.4.11': - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} @@ -2921,15 +2535,6 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3108,26 +2713,6 @@ packages: typescript: optional: true - '@wallet-standard/app@1.0.1': - resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} - engines: {node: '>=16'} - - '@wallet-standard/base@1.0.1': - resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} - engines: {node: '>=16'} - - '@wallet-standard/core@1.0.3': - resolution: {integrity: sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==} - engines: {node: '>=16'} - - '@wallet-standard/features@1.0.3': - resolution: {integrity: sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==} - engines: {node: '>=16'} - - '@wallet-standard/wallet@1.0.1': - resolution: {integrity: sha512-qkhJeuQU2afQTZ02yMZE5SFc91Fo3hyFjFkpQglHudENNyiSG0oUKcIjky8X32xVSaumgTZSQUAzpXnCTWHzKQ==} - engines: {node: '>=16'} - '@walletconnect/core@2.14.0': resolution: {integrity: sha512-E/dgBM9q3judXnTfZQ5ILvDpeSdDpabBLsXtYXa3Nyc26cfNplfLJ2nXm9FgtTdhM1nZ7yx4+zDPiXawBRZl2g==} @@ -3208,10 +2793,6 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - abitype@1.0.5: resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: @@ -3255,10 +2836,6 @@ packages: aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3437,10 +3014,6 @@ packages: babel-dead-code-elimination@1.0.6: resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - babel-plugin-polyfill-corejs2@0.4.11: resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: @@ -3465,9 +3038,6 @@ packages: base-x@3.0.10: resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3477,10 +3047,6 @@ packages: bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} @@ -3488,9 +3054,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3513,9 +3076,6 @@ packages: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -3548,9 +3108,6 @@ packages: bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} @@ -3832,9 +3389,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3865,10 +3419,6 @@ packages: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -4035,10 +3585,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -4096,9 +3642,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} @@ -4226,9 +3769,6 @@ packages: es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - es6-symbol@3.1.4: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} @@ -4382,9 +3922,6 @@ packages: eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -4424,10 +3961,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4448,9 +3981,6 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true @@ -4465,9 +3995,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4488,9 +4015,6 @@ packages: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -4800,12 +4324,6 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - html-parse-stringify@3.0.1: - resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} - http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -4840,9 +4358,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - hyperid@3.1.1: resolution: {integrity: sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==} @@ -5125,11 +4640,6 @@ packages: isomorphic-unfetch@3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - isows@1.0.4: resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} peerDependencies: @@ -5145,11 +4655,6 @@ packages: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5185,9 +4690,6 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - js-sha3@0.5.7: resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} @@ -5268,10 +4770,6 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -5567,9 +5065,6 @@ packages: micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - microdiff@1.4.0: - resolution: {integrity: sha512-OBKBOa1VBznvLPb/3ljeJaENVe0fO0lnWl77lR4vhPlQD71UpjEoRV5P0KdQkcjbFlBu1Oy2mEUBMU3wxcBAGg==} - micromatch@4.0.7: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} @@ -5654,9 +5149,6 @@ packages: typescript: optional: true - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-promise@5.0.1: resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} engines: {node: '>=4'} @@ -6343,28 +5835,6 @@ packages: peerDependencies: react: ^18.3.1 - react-i18next@14.1.2: - resolution: {integrity: sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==} - peerDependencies: - i18next: '>= 23.2.3' - react: '>= 16.8.0' - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - react-intersection-observer@9.10.3: - resolution: {integrity: sha512-9NYfKwPZRovB6QJee7fDg0zz/SyYrqXtn5xTZU0vwLtLVBtfu9aZt1pVmr825REE49VPDZ7Lm5SNHjJBOTZHpA==} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - react-dom: - optional: true - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -6415,19 +5885,6 @@ packages: '@types/react': optional: true - react-router-dom@6.24.1: - resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - react-router@6.24.1: - resolution: {integrity: sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: @@ -6443,17 +5900,6 @@ packages: '@types/react': optional: true - react-timer-hook@3.0.7: - resolution: {integrity: sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==} - peerDependencies: - react: '>=16.8.0' - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -6608,9 +6054,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6931,9 +6374,6 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -7002,9 +6442,6 @@ packages: engines: {node: '>=10'} hasBin: true - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -7027,9 +6464,6 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} @@ -7327,10 +6761,6 @@ packages: uuid-parse@1.1.0: resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -7441,10 +6871,6 @@ packages: vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} - wagmi@2.12.5: resolution: {integrity: sha512-+fpSUsVKyGOumguQirtpyMb7dmDP4/ZdwrTqrBc+WZVTwR9S8WdFPParw/BKXVZjF9euJxu1zKsWQSLBeCROfQ==} peerDependencies: @@ -7680,18 +7106,6 @@ packages: utf-8-validate: optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} @@ -7723,10 +7137,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - yaml@2.5.0: resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} @@ -8851,104 +8261,15 @@ snapshots: - supports-color - utf-8-validate - '@emotion/babel-plugin@11.12.0': - dependencies: - '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.25.0 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.0 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/cache@11.11.0': - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - - '@emotion/cache@11.13.1': - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.0 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - '@emotion/hash@0.9.2': {} '@emotion/is-prop-valid@1.3.0': dependencies: '@emotion/memoize': 0.9.0 + optional: true - '@emotion/memoize@0.8.1': {} - - '@emotion/memoize@0.9.0': {} - - '@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.0 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 - '@emotion/weak-memoize': 0.3.1 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 - transitivePeerDependencies: - - supports-color - - '@emotion/serialize@1.3.0': - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.9.0 - '@emotion/utils': 1.4.0 - csstype: 3.1.3 - - '@emotion/sheet@1.2.2': {} - - '@emotion/sheet@1.4.0': {} - - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/serialize': 1.3.0 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 - transitivePeerDependencies: - - supports-color - - '@emotion/unitless@0.9.0': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@emotion/utils@1.2.1': {} - - '@emotion/utils@1.4.0': {} - - '@emotion/weak-memoize@0.3.1': {} - - '@emotion/weak-memoize@0.4.0': {} + '@emotion/memoize@0.9.0': + optional: true '@esbuild/aix-ppc64@0.21.5': optional: true @@ -9447,57 +8768,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@lifi/sdk@3.0.0(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))': - dependencies: - '@lifi/types': 13.18.2 - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - eth-rpc-errors: 4.0.3 - viem: 2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8) - - '@lifi/types@13.18.2': {} - - '@lifi/wallet-management@3.0.0(jp76vp23zirnrrtfsbj7azde2q)': - dependencies: - '@lifi/sdk': 3.0.0(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8)) - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@tanstack/react-query': 5.51.21(react@18.3.1) - react: 18.3.1 - viem: 2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8) - wagmi: 2.12.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.51.21)(@tanstack/react-query@5.51.21(react@18.3.1))(@types/react@18.3.3)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.18.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) - transitivePeerDependencies: - - '@solana/web3.js' - - '@lifi/widget@3.0.0(jjnkyh6cyrxgxf254wfk2drkny)': - dependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@lifi/sdk': 3.0.0(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8)) - '@lifi/wallet-management': 3.0.0(jp76vp23zirnrrtfsbj7azde2q) - '@mui/icons-material': 5.15.21(@mui/material@5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/lab': 5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@tanstack/react-query': 5.51.21(react@18.3.1) - '@tanstack/react-virtual': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - i18next: 23.11.5 - microdiff: 1.4.0 - mitt: 3.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-i18next: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - react-intersection-observer: 9.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: 6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-timer-hook: 3.0.7(react@18.3.1) - uuid: 10.0.0 - viem: 2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8) - wagmi: 2.12.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.51.21)(@tanstack/react-query@5.51.21(react@18.3.1))(@types/react@18.3.3)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.18.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.3)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 - '@lit-labs/ssr-dom-shim@1.2.1': {} '@lit/reactive-element@1.6.3': @@ -9726,198 +8996,34 @@ snapshots: hey-listen: 1.0.8 tslib: 2.6.3 - '@motionone/easing@10.18.0': - dependencies: - '@motionone/utils': 10.18.0 - tslib: 2.6.3 - - '@motionone/generators@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - tslib: 2.6.3 - - '@motionone/svelte@10.16.4': - dependencies: - '@motionone/dom': 10.18.0 - tslib: 2.6.3 - - '@motionone/types@10.17.1': {} - - '@motionone/utils@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - hey-listen: 1.0.8 - tslib: 2.6.3 - - '@motionone/vue@10.16.4': - dependencies: - '@motionone/dom': 10.18.0 - tslib: 2.6.3 - - '@mui/base@5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.15.20(@types/react@18.3.3)(react@18.3.1) - '@popperjs/core': 2.11.8 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 - - '@mui/core-downloads-tracker@5.16.7': {} - - '@mui/icons-material@5.15.21(@mui/material@5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@mui/material': 5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 - - '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.15.20(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.15.20(@types/react@18.3.3)(react@18.3.1) - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 - - '@mui/material@5.15.21(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.7(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) - '@types/react-transition-group': 4.4.11 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 - - '@mui/private-theming@5.15.20(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@mui/utils': 5.15.20(@types/react@18.3.3)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 - - '@mui/private-theming@5.16.6(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 - - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@emotion/cache': 11.11.0 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - - '@mui/styled-engine@5.16.6(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/cache': 11.13.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - - '@mui/system@5.15.20(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.7 - '@mui/private-theming': 5.15.20(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.15.20(@types/react@18.3.3)(react@18.3.1) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 - - '@mui/system@5.16.7(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@motionone/easing@10.18.0': dependencies: - '@babel/runtime': 7.25.0 - '@mui/private-theming': 5.16.6(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 + '@motionone/utils': 10.18.0 + tslib: 2.6.3 - '@mui/types@7.2.14(@types/react@18.3.3)': - optionalDependencies: - '@types/react': 18.3.3 + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.6.3 - '@mui/types@7.2.15(@types/react@18.3.3)': - optionalDependencies: - '@types/react': 18.3.3 + '@motionone/svelte@10.16.4': + dependencies: + '@motionone/dom': 10.18.0 + tslib: 2.6.3 + + '@motionone/types@10.17.1': {} - '@mui/utils@5.15.20(@types/react@18.3.3)(react@18.3.1)': + '@motionone/utils@10.18.0': dependencies: - '@babel/runtime': 7.24.7 - '@types/prop-types': 15.7.12 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.6.3 - '@mui/utils@5.16.6(@types/react@18.3.3)(react@18.3.1)': + '@motionone/vue@10.16.4': dependencies: - '@babel/runtime': 7.25.0 - '@mui/types': 7.2.15(@types/react@18.3.3) - '@types/prop-types': 15.7.12 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 18.3.1 - optionalDependencies: - '@types/react': 18.3.3 + '@motionone/dom': 10.18.0 + tslib: 2.6.3 '@noble/curves@1.4.0': dependencies: @@ -9927,10 +9033,6 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 - '@noble/curves@1.5.0': - dependencies: - '@noble/hashes': 1.4.0 - '@noble/hashes@1.4.0': {} '@nodelib/fs.scandir@2.1.5': @@ -10009,8 +9111,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@popperjs/core@2.11.8': {} - '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} @@ -10704,8 +9804,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@remix-run/router@1.17.1': {} - '@rnx-kit/chromium-edge-launcher@1.0.0': dependencies: '@types/node': 18.19.44 @@ -10848,153 +9946,6 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.1.3(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': - dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.1.3(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - bs58: 5.0.0 - js-base64: 3.7.7 - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - react - - react-native - - '@solana-mobile/mobile-wallet-adapter-protocol@2.1.3(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': - dependencies: - '@solana/wallet-standard': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) - '@solana/wallet-standard-util': 1.1.1 - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@wallet-standard/core': 1.0.3 - js-base64: 3.7.7 - react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - bs58 - - react - - '@solana-mobile/wallet-adapter-mobile@2.1.3(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': - dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.1.3(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-features': 1.2.0 - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - js-base64: 3.7.7 - optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)) - transitivePeerDependencies: - - react - - react-native - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': - dependencies: - '@solana/wallet-standard-features': 1.2.0 - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@wallet-standard/base': 1.0.1 - '@wallet-standard/features': 1.0.3 - eventemitter3: 4.0.7 - - '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': - dependencies: - '@solana-mobile/wallet-adapter-mobile': 2.1.3(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-react': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - react: 18.3.1 - transitivePeerDependencies: - - bs58 - - react-native - - '@solana/wallet-standard-chains@1.1.0': - dependencies: - '@wallet-standard/base': 1.0.1 - - '@solana/wallet-standard-core@1.1.1': - dependencies: - '@solana/wallet-standard-chains': 1.1.0 - '@solana/wallet-standard-features': 1.2.0 - '@solana/wallet-standard-util': 1.1.1 - - '@solana/wallet-standard-features@1.2.0': - dependencies: - '@wallet-standard/base': 1.0.1 - '@wallet-standard/features': 1.0.3 - - '@solana/wallet-standard-util@1.1.1': - dependencies: - '@noble/curves': 1.5.0 - '@solana/wallet-standard-chains': 1.1.0 - '@solana/wallet-standard-features': 1.2.0 - - '@solana/wallet-standard-wallet-adapter-base@1.1.2(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)': - dependencies: - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-chains': 1.1.0 - '@solana/wallet-standard-features': 1.2.0 - '@solana/wallet-standard-util': 1.1.1 - '@solana/web3.js': 1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@wallet-standard/app': 1.0.1 - '@wallet-standard/base': 1.0.1 - '@wallet-standard/features': 1.0.3 - '@wallet-standard/wallet': 1.0.1 - bs58: 5.0.0 - - '@solana/wallet-standard-wallet-adapter-react@1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': - dependencies: - '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-base': 1.1.2(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0) - '@wallet-standard/app': 1.0.1 - '@wallet-standard/base': 1.0.1 - react: 18.3.1 - transitivePeerDependencies: - - '@solana/web3.js' - - bs58 - - '@solana/wallet-standard-wallet-adapter@1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': - dependencies: - '@solana/wallet-standard-wallet-adapter-base': 1.1.2(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0) - '@solana/wallet-standard-wallet-adapter-react': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - bs58 - - react - - '@solana/wallet-standard@1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': - dependencies: - '@solana/wallet-standard-core': 1.1.1 - '@solana/wallet-standard-wallet-adapter': 1.1.2(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - bs58 - - react - - '@solana/web3.js@1.94.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.25.0 - '@noble/curves': 1.5.0 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.5.0 - bigint-buffer: 1.1.5 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 1.0.4 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - '@stablelib/aead@1.0.1': {} '@stablelib/binary@1.0.1': @@ -11145,10 +10096,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.3 - '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 @@ -11198,12 +10145,6 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tanstack/react-virtual@3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/virtual-core': 3.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@tanstack/router-devtools@1.43.10(@tanstack/react-router@1.45.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-router': 1.45.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11246,8 +10187,6 @@ snapshots: '@tanstack/store@0.5.5': {} - '@tanstack/virtual-core@3.8.1': {} - '@types/abstract-leveldown@7.2.5': {} '@types/babel__core@7.20.5': @@ -11282,10 +10221,6 @@ snapshots: '@types/node': 22.2.0 '@types/responselike': 1.0.3 - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.2.0 - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -11338,8 +10273,6 @@ snapshots: dependencies: undici-types: 6.13.0 - '@types/parse-json@4.0.2': {} - '@types/pbkdf2@3.1.2': dependencies: '@types/node': 22.2.0 @@ -11350,10 +10283,6 @@ snapshots: dependencies: '@types/react': 18.3.3 - '@types/react-transition-group@4.4.11': - dependencies: - '@types/react': 18.3.3 - '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 @@ -11371,16 +10300,6 @@ snapshots: '@types/trusted-types@2.0.7': {} - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.2.0 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 22.2.0 - '@types/yargs-parser@21.0.3': {} '@types/yargs@15.0.19': @@ -11660,27 +10579,6 @@ snapshots: - immer - react - '@wallet-standard/app@1.0.1': - dependencies: - '@wallet-standard/base': 1.0.1 - - '@wallet-standard/base@1.0.1': {} - - '@wallet-standard/core@1.0.3': - dependencies: - '@wallet-standard/app': 1.0.1 - '@wallet-standard/base': 1.0.1 - '@wallet-standard/features': 1.0.3 - '@wallet-standard/wallet': 1.0.1 - - '@wallet-standard/features@1.0.3': - dependencies: - '@wallet-standard/base': 1.0.1 - - '@wallet-standard/wallet@1.0.1': - dependencies: - '@wallet-standard/base': 1.0.1 - '@walletconnect/core@2.14.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -12001,11 +10899,6 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - abitype@1.0.5(typescript@5.5.4)(zod@3.23.8): optionalDependencies: typescript: 5.5.4 @@ -12046,10 +10939,6 @@ snapshots: aes-js@3.0.0: {} - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - ajv-formats@2.1.1(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 @@ -12256,12 +11145,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.25.0 - cosmiconfig: 7.1.0 - resolve: 1.22.8 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): dependencies: '@babel/compat-data': 7.25.2 @@ -12298,8 +11181,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - base-x@4.0.0: {} - base64-js@1.5.1: {} bcrypt-pbkdf@1.0.2: @@ -12308,18 +11189,10 @@ snapshots: bech32@1.1.4: {} - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - bignumber.js@9.1.2: {} binary-extensions@2.3.0: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -12353,12 +11226,6 @@ snapshots: transitivePeerDependencies: - supports-color - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - bowser@2.11.0: {} brace-expansion@1.1.11: @@ -12403,10 +11270,6 @@ snapshots: dependencies: base-x: 3.0.10 - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - bs58check@2.1.2: dependencies: bs58: 4.0.1 @@ -12700,8 +11563,6 @@ snapshots: content-type@1.0.5: {} - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} cookie-es@1.2.2: {} @@ -12730,14 +11591,6 @@ snapshots: js-yaml: 3.14.1 parse-json: 4.0.0 - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.5.4): dependencies: import-fresh: 3.3.0 @@ -12890,8 +11743,6 @@ snapshots: defu@6.1.4: {} - delay@5.0.0: {} - delayed-stream@1.0.0: {} denodeify@1.2.1: {} @@ -12932,11 +11783,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-helpers@5.2.1: - dependencies: - '@babel/runtime': 7.25.0 - csstype: 3.1.3 - dom-walk@0.1.2: {} dompurify@3.1.6: {} @@ -13153,10 +11999,6 @@ snapshots: es6-promise@4.2.8: {} - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - es6-symbol@3.1.4: dependencies: d: 1.0.2 @@ -13454,8 +12296,6 @@ snapshots: eventemitter3@4.0.4: {} - eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} events@3.3.0: {} @@ -13540,8 +12380,6 @@ snapshots: extsprintf@1.3.0: {} - eyes@0.1.8: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -13560,8 +12398,6 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-stable-stringify@1.0.0: {} - fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -13578,8 +12414,6 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-uri-to-path@1.0.0: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -13616,8 +12450,6 @@ snapshots: make-dir: 2.1.0 pkg-dir: 3.0.0 - find-root@1.1.0: {} - find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -13940,14 +12772,6 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - html-parse-stringify@3.0.1: - dependencies: - void-elements: 3.1.0 - http-cache-semantics@4.1.1: {} http-errors@2.0.0: @@ -13982,10 +12806,6 @@ snapshots: human-signals@5.0.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - hyperid@3.1.1: dependencies: uuid: 8.3.2 @@ -14230,10 +13050,6 @@ snapshots: transitivePeerDependencies: - encoding - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -14254,24 +13070,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -14336,8 +13134,6 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - js-base64@3.7.7: {} - js-sha3@0.5.7: {} js-sha3@0.8.0: {} @@ -14417,8 +13213,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonparse@1.3.1: {} - jsprim@1.4.2: dependencies: assert-plus: 1.0.0 @@ -14878,8 +13672,6 @@ snapshots: micro-ftch@0.3.1: {} - microdiff@1.4.0: {} - micromatch@4.0.7: dependencies: braces: 3.0.3 @@ -14940,8 +13732,6 @@ snapshots: optionalDependencies: typescript: 5.5.4 - mitt@3.0.1: {} - mkdirp-promise@5.0.1: dependencies: mkdirp: 1.0.4 @@ -15552,22 +14342,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-i18next@14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.0 - html-parse-stringify: 3.0.1 - i18next: 23.11.5 - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - - react-intersection-observer@9.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-is@16.13.1: {} react-is@17.0.2: {} @@ -15652,18 +14426,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - react-router-dom@6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@remix-run/router': 1.17.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.24.1(react@18.3.1) - - react-router@6.24.1(react@18.3.1): - dependencies: - '@remix-run/router': 1.17.1 - react: 18.3.1 - react-shallow-renderer@16.15.0(react@18.3.1): dependencies: object-assign: 4.1.1 @@ -15679,19 +14441,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - react-timer-hook@3.0.7(react@18.3.1): - dependencies: - react: 18.3.1 - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.0 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -15895,19 +14644,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -16271,8 +15007,6 @@ snapshots: strnum@1.0.5: {} - stylis@4.2.0: {} - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -16379,8 +15113,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - text-encoding-utf-8@1.0.2: {} - text-table@0.2.0: {} thenify-all@1.6.0: @@ -16406,8 +15138,6 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - through@2.3.8: {} - timed-out@4.0.1: {} tiny-invariant@1.3.3: {} @@ -16657,8 +15387,6 @@ snapshots: uuid-parse@1.1.0: {} - uuid@10.0.0: {} - uuid@3.4.0: {} uuid@8.3.2: {} @@ -16773,8 +15501,6 @@ snapshots: vlq@1.0.1: {} - void-elements@3.1.0: {} - wagmi@2.12.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.51.21)(@tanstack/react-query@5.51.21(react@18.3.1))(@types/react@18.3.3)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.18.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): dependencies: '@tanstack/react-query': 5.51.21(react@18.3.1) @@ -17166,11 +15892,6 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - xhr-request-promise@0.1.3: dependencies: xhr-request: 1.1.0 @@ -17204,8 +15925,6 @@ snapshots: yallist@3.1.1: {} - yaml@1.10.2: {} - yaml@2.5.0: {} yargs-parser@18.1.3: diff --git a/src/components/bridge/lifi/LiFiBridgeWidget.tsx b/src/components/bridge/lifi/LiFiBridgeWidget.tsx deleted file mode 100644 index f37a2521..00000000 --- a/src/components/bridge/lifi/LiFiBridgeWidget.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { WidgetConfig } from "@lifi/widget"; -import { arbitrum, mainnet, optimism } from "viem/chains"; -import { useConnectModal } from "@rainbow-me/rainbowkit"; -import { Suspense, lazy, useMemo, useState } from "react"; -import { useTheme } from "@/components/providers/ThemeProvider"; -import { Button } from "@/components/ui/button"; -import { EyeIcon, EyeOffIcon } from "lucide-react"; -import { AnimatePresence, m } from "framer-motion"; -import { accordionVariants, accordionTransition } from "@/lib/motion/motion"; -import { BridgeFallback } from "../BridgeFallback"; - -const LiFiWidget = lazy(() => - import("@lifi/widget").then((mod) => ({ default: mod.LiFiWidget })), -); - -const widgetConfig = { - integrator: "Alchemix", - variant: "wide", - - // Bridge configuration - fromChain: mainnet.id, - toChain: arbitrum.id, - chains: { - allow: [mainnet.id, arbitrum.id, optimism.id], - }, - fromToken: "0xbc6da0fe9ad5f3b0d58160288917aa56653660e9", - toToken: "0xcb8fa9a76b8e203d8c3797bf438d8fb81ea3326a", - tokens: { - featured: [ - { - address: "0xBC6DA0FE9aD5f3b0d58160288917AA56653660E9", - chainId: mainnet.id, - decimals: 18, - name: "Alchemix USD", - symbol: "alUSD", - // lifi has wrong logoURI for alUSD - logoURI: - "https://assets.coingecko.com/coins/images/14114/standard/Alchemix_USD.png", - }, - { - address: "0xCB8FA9a76b8e203D8C3797bF438d8FB81Ea3326A", - chainId: arbitrum.id, - decimals: 18, - name: "Alchemix USD", - symbol: "alUSD", - }, - { - address: "0xCB8FA9a76b8e203D8C3797bF438d8FB81Ea3326A", - chainId: optimism.id, - decimals: 18, - name: "Alchemix USD", - symbol: "alUSD", - }, - { - address: "0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF", - chainId: mainnet.id, - decimals: 18, - name: "Alchemix", - symbol: "ALCX", - }, - { - address: "0x27b58D226fe8f792730a795764945Cf146815AA7", - chainId: arbitrum.id, - decimals: 18, - name: "Alchemix", - symbol: "ALCX", - // lifi doesnt have logoURI for ALCX on arbitrum - logoURI: - "https://assets.coingecko.com/coins/images/14113/standard/Alchemix.png", - }, - ], - }, -} satisfies WidgetConfig; - -export const LiFiBridgeWidget = () => { - const [open, setOpen] = useState(false); - - const { darkMode } = useTheme(); - - const { openConnectModal } = useConnectModal(); - - const config = useMemo(() => { - return { - ...widgetConfig, - appearance: darkMode ? "dark" : "light", - theme: { - typography: { - fontFamily: "Montserrat, sans-serif", - }, - container: { - border: darkMode ? "1px solid #20242C" : "1px solid #DEDBD3", - borderRadius: "8px", - }, - palette: { - background: { - default: darkMode ? "#171B24" : "#E8E4DB", - paper: darkMode ? "#20242C" : "#DEDBD3", - }, - text: { - primary: darkMode ? "#f5f5f5" : "#0A0A0A", - secondary: "#979BA2", - }, - }, - }, - walletConfig: { - onConnect: openConnectModal, - }, - } satisfies WidgetConfig; - }, [darkMode, openConnectModal]); - - const handleOpen = () => setOpen(!open); - - return ( -
-
-

LiFi Bridge

- -
- - {open && ( - -
- }> - - -
-
- )} -
-
- ); -}; From bc2658853d8bd76854d88a37a3e49e76a98fd00d Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 30 Aug 2024 19:17:45 +0200 Subject: [PATCH 20/46] refactor and use internal useAllowance --- .../bridge/connext/ConnextBridgeWidget.tsx | 158 +++++++------ src/components/bridge/connext/lib/connext.ts | 210 +++--------------- 2 files changed, 127 insertions(+), 241 deletions(-) diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index 6cc87384..4a9b047b 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -1,6 +1,7 @@ import { useSwitchChain } from "wagmi"; -import { useCallback, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { isAddress, zeroAddress } from "viem"; + import { useTokensQuery } from "@/lib/queries/useTokensQuery"; import { Select, @@ -15,45 +16,91 @@ import { SlippageInput } from "@/components/common/input/SlippageInput"; import { Button } from "@/components/ui/button"; import { isInputZero } from "@/utils/inputNotZero"; import { useChain } from "@/hooks/useChain"; +import { useAllowance } from "@/hooks/useAllowance"; import { formatNumber } from "@/utils/number"; import { useConnextRelayerFee, useConnextAmountOut, - useConnextApproval, - useConnextWriteApprove, - useConnextWriteBridge, chainIdToDomainMapping, bridgeChains, chainToAvailableTokensMapping, + SupportedBridgeChainIds, + targetMapping, } from "./lib/connext"; +const getIsConnectedChainNotSupportedForBridge = (chainId: number) => { + return !bridgeChains.some((c) => c.id === chainId); +}; + +const getOriginDomain = (chainId: number) => { + return getIsConnectedChainNotSupportedForBridge(chainId) + ? chainIdToDomainMapping[bridgeChains[0].id] + : chainIdToDomainMapping[chainId as SupportedBridgeChainIds]; +}; + +const getInitialOriginTokenAddresses = (chainId: number) => { + return getIsConnectedChainNotSupportedForBridge(chainId) + ? chainToAvailableTokensMapping[bridgeChains[0].id] + : chainToAvailableTokensMapping[chainId as SupportedBridgeChainIds]; +}; + +const getSpender = ({ + originChainId, + originTokenAddress, +}: { + originChainId: number; + originTokenAddress: `0x${string}`; +}) => { + return getIsConnectedChainNotSupportedForBridge(originChainId) + ? targetMapping[bridgeChains[0].id][originTokenAddress] + : targetMapping[originChainId as SupportedBridgeChainIds][ + originTokenAddress + ]; +}; + export const ConnextBridgeWidget = () => { const chain = useChain(); + const { switchChain } = useSwitchChain(); - const [originChainId, setOriginChainId] = useState(chain.id.toString()); - const originDomain = chainIdToDomainMapping[originChainId]; - const originChain = bridgeChains.find( - (c) => c.id.toString() === originChainId, - ); + useEffect(() => { + const isConnectedChainNotSupportedForBridge = + getIsConnectedChainNotSupportedForBridge(chain.id); + if (isConnectedChainNotSupportedForBridge) { + switchChain({ + chainId: bridgeChains[0].id, + }); + setOriginChainId(bridgeChains[0].id); + const newDestinationChainId = bridgeChains.find( + (c) => c.id !== bridgeChains[0].id, + )?.id; + if (newDestinationChainId) { + setDestinationChainId(newDestinationChainId); + } + } + }, [chain.id, switchChain]); + + const [originChainId, setOriginChainId] = useState(chain.id); + const originDomain = getOriginDomain(originChainId); + const originChain = bridgeChains.find((c) => c.id === originChainId); const [destinationChainId, setDestinationChainId] = useState( - bridgeChains.find((c) => c.id.toString() !== originChainId)!.id.toString(), + bridgeChains.find((c) => c.id !== originChainId)!.id, ); const destinationDomain = chainIdToDomainMapping[destinationChainId]; const destinationChain = bridgeChains.find( - (c) => c.id.toString() === destinationChainId, + (c) => c.id === destinationChainId, ); const { data: tokens } = useTokensQuery(); const [originTokenAddress, setOriginTokenAddress] = useState( - chainToAvailableTokensMapping[originChainId][0], + getInitialOriginTokenAddresses(originChainId)[0], ); const token = tokens?.find( (t) => t.address.toLowerCase() === originTokenAddress.toLowerCase(), ); const selection = tokens?.filter((t) => - chainToAvailableTokensMapping[originChainId].includes( - t.address.toLowerCase(), + getInitialOriginTokenAddresses(originChainId).includes( + t.address.toLowerCase() as `0x${string}`, ), ); @@ -73,44 +120,33 @@ export const ConnextBridgeWidget = () => { amount, }); - const { data: approveData } = useConnextApproval({ - originDomain, - originTokenAddress, + const { isApprovalNeeded, approveConfig, approve } = useAllowance({ amount, - originChainId: parseInt(originChainId), + tokenAddress: originTokenAddress, + spender: getSpender({ originChainId, originTokenAddress }), + decimals: token?.decimals, }); - const notReady = - isFetchingAmountOut || - approveData === undefined || - relayerFee === undefined || - amountOut === undefined; - - const { mutate: writeApprove, isPending: isApproving } = - useConnextWriteApprove(); - const { mutate: writeBridge, isPending: isBridging } = - useConnextWriteBridge(); - - const { switchChain } = useSwitchChain(); - const handleOriginChainSelect = useCallback( (chainId: string) => { - setOriginChainId(chainId); - const newChainTokenAddress = chainToAvailableTokensMapping[chainId][0]; + const newChainId = Number(chainId) as SupportedBridgeChainIds; + + setOriginChainId(newChainId); + const newChainTokenAddress = chainToAvailableTokensMapping[newChainId][0]; if (isAddress(newChainTokenAddress)) { setOriginTokenAddress(newChainTokenAddress); } setAmount(""); - if (chainId === destinationChainId) { - const newDestinationChainId = bridgeChains - .find((c) => c.id.toString() !== chainId) - ?.id.toString(); + if (newChainId === destinationChainId) { + const newDestinationChainId = bridgeChains.find( + (c) => c.id !== newChainId, + )?.id; if (newDestinationChainId) { setDestinationChainId(newDestinationChainId); } } switchChain({ - chainId: Number(chainId), + chainId: newChainId, }); }, [destinationChainId, switchChain], @@ -118,16 +154,18 @@ export const ConnextBridgeWidget = () => { const handleDestinationChainSelect = useCallback( (chainId: string) => { - setDestinationChainId(chainId); + const newChainId = Number(chainId) as SupportedBridgeChainIds; + + setDestinationChainId(newChainId); setAmount(""); - if (chainId === originChainId) { - const newOriginChainId = bridgeChains - .find((c) => c.id.toString() !== chainId) - ?.id.toString(); + if (newChainId === originChainId) { + const newOriginChainId = bridgeChains.find( + (c) => c.id !== newChainId, + )?.id; if (newOriginChainId) { setOriginChainId(newOriginChainId); switchChain({ - chainId: Number(newOriginChainId), + chainId: newOriginChainId, }); const newChainTokenAddress = chainToAvailableTokensMapping[newOriginChainId][0]; @@ -141,22 +179,11 @@ export const ConnextBridgeWidget = () => { ); const onCtaClick = () => { - if (!approveData) return; - if (approveData?.isApprovalNeeded === true) { - writeApprove({ approveData }); + if (isApprovalNeeded) { + approveConfig?.request && approve(approveConfig.request); return; } - if (!relayerFee) return; - - writeBridge({ - originDomain, - destinationDomain, - destinationChainId: parseInt(destinationChainId), - originTokenAddress, - amount, - slippage, - relayerFee, - }); + // TODO: bridge }; return ( @@ -164,7 +191,10 @@ export const ConnextBridgeWidget = () => {

Origin chain:

- {originChain?.name ?? "Error"} @@ -182,7 +212,7 @@ export const ConnextBridgeWidget = () => {

Target chain:

; -type TargetMapping = Record< - SupportedBridgeChainIds, - Record<`0x${string}`, `0x${string}`> ->; +type TargetMapping = Record; interface XCallParams { origin: string; destination: string; @@ -72,27 +69,9 @@ export const chainToAvailableTokensMapping: AvailableTokensMapping = { }; export const targetMapping: TargetMapping = { - [mainnet.id]: { - [ALCX_MAINNET_ADDRESS]: "0xcfe063a764EA04A9A1Dc6cf8B8978955f779fc9F", - [SYNTH_ASSETS_ADDRESSES[mainnet.id].alETH]: - "0x45BF3c737e57B059a5855280CA1ADb8e9606AC68", - [SYNTH_ASSETS_ADDRESSES[mainnet.id].alUSD]: - "0x45BF3c737e57B059a5855280CA1ADb8e9606AC68", - }, - [optimism.id]: { - [ALCX_OPTIMISM_ADDRESS]: "0x8f7492DE823025b4CfaAB1D34c58963F2af5DEDA", - [SYNTH_ASSETS_ADDRESSES[optimism.id].alETH]: - "0x8f7492DE823025b4CfaAB1D34c58963F2af5DEDA", - [SYNTH_ASSETS_ADDRESSES[optimism.id].alUSD]: - "0x8f7492DE823025b4CfaAB1D34c58963F2af5DEDA", - }, - [arbitrum.id]: { - [ALCX_ARBITRUM_ADDRESS]: "0xEE9deC2712cCE65174B561151701Bf54b99C24C8", - [SYNTH_ASSETS_ADDRESSES[arbitrum.id].alETH]: - "0xEE9deC2712cCE65174B561151701Bf54b99C24C8", - [SYNTH_ASSETS_ADDRESSES[arbitrum.id].alUSD]: - "0xEE9deC2712cCE65174B561151701Bf54b99C24C8", - }, + [mainnet.id]: "0x45BF3c737e57B059a5855280CA1ADb8e9606AC68", + [optimism.id]: "0x8f7492DE823025b4CfaAB1D34c58963F2af5DEDA", + [arbitrum.id]: "0xEE9deC2712cCE65174B561151701Bf54b99C24C8", }; const SUBGRAPH_API_KEY = import.meta.env.VITE_SUBGRAPH_API_KEY; @@ -259,11 +238,8 @@ export const useConnextWriteBridge = () => { const isToEth = destinationDomain === chainIdToDomainMapping[mainnet.id]; if (isFromEth) { - bridgeConfig.to = getSpender({ originChainId, originTokenAddress }); - bridgeConfig.callData = encodeAbiParameters( - parseAbiParameters("address"), - [address], - ); + bridgeConfig.to = address; + bridgeConfig.callData = toHex(""); } else if (isToEth) { // if we bridge ALCX to ETH we use alchemix lockbox adapter, for alusd and aleth we use connext lockbox adapter const isBridgingAlcx = @@ -305,7 +281,7 @@ export const useConnextWriteBridge = () => { const request = await publicClient.prepareTransactionRequest({ account: address, - to: getSpender({ originChainId, originTokenAddress }), + to: getSpender({ originChainId }), data: xCallData, value: bridgeConfig.relayerFee, chainId: originChainId, diff --git a/src/components/bridge/connext/lib/utils.ts b/src/components/bridge/connext/lib/utils.ts index 0274001c..08289c97 100644 --- a/src/components/bridge/connext/lib/utils.ts +++ b/src/components/bridge/connext/lib/utils.ts @@ -22,16 +22,8 @@ export const getInitialOriginTokenAddresses = (chainId: number) => { : chainToAvailableTokensMapping[chainId as SupportedBridgeChainIds]; }; -export const getSpender = ({ - originChainId, - originTokenAddress, -}: { - originChainId: number; - originTokenAddress: `0x${string}`; -}) => { +export const getSpender = ({ originChainId }: { originChainId: number }) => { return getIsConnectedChainNotSupportedForBridge(originChainId) - ? targetMapping[bridgeChains[0].id][originTokenAddress] - : targetMapping[originChainId as SupportedBridgeChainIds][ - originTokenAddress - ]; + ? targetMapping[bridgeChains[0].id] + : targetMapping[originChainId as SupportedBridgeChainIds]; }; From 0f57691b882b416463a91625c7046b41b4d2054b Mon Sep 17 00:00:00 2001 From: t0rbik Date: Mon, 2 Sep 2024 16:50:19 +0200 Subject: [PATCH 33/46] status box --- .../bridge/connext/ConnextBridgeWidget.tsx | 35 +++++----- src/components/bridge/connext/StatusBox.tsx | 59 ++++++++++++++++ src/components/bridge/connext/lib/connext.ts | 70 +++++-------------- 3 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 src/components/bridge/connext/StatusBox.tsx diff --git a/src/components/bridge/connext/ConnextBridgeWidget.tsx b/src/components/bridge/connext/ConnextBridgeWidget.tsx index 6d22d487..0e286798 100644 --- a/src/components/bridge/connext/ConnextBridgeWidget.tsx +++ b/src/components/bridge/connext/ConnextBridgeWidget.tsx @@ -26,8 +26,6 @@ import { chainToAvailableTokensMapping, SupportedBridgeChainIds, useConnextWriteBridge, - useSubgraphOriginData, - useSubgraphDestinationData, } from "./lib/connext"; import { getInitialOriginTokenAddresses, @@ -35,6 +33,7 @@ import { getOriginDomain, getSpender, } from "./lib/utils"; +import { StatusBox } from "./StatusBox"; export const ConnextBridgeWidget = () => { const chain = useChain(); @@ -120,17 +119,11 @@ export const ConnextBridgeWidget = () => { decimals: token?.decimals, }); - const { mutate: writeBridge, data: transactionHash } = - useConnextWriteBridge(); - - const { data: transferId } = useSubgraphOriginData({ transactionHash }); - - const { data: bridgeStatus } = useSubgraphDestinationData({ - transferId, - destinationChainId, - }); - - console.log({ bridgeStatus }); + const { + mutate: writeBridge, + data: transactionHash, + isPending: isWritingBridge, + } = useConnextWriteBridge(); const handleOriginChainSelect = useCallback( (chainId: string) => { @@ -285,7 +278,7 @@ export const ConnextBridgeWidget = () => { setOriginTokenAddress(value as `0x${string}`) } > - +
{ alt={token?.symbol} className="h-12 w-12" /> - {token?.symbol} + + {token?.symbol} +
@@ -313,11 +308,17 @@ export const ConnextBridgeWidget = () => { tokenDecimals={18} />
- +
+ + +
+ { if (import.meta.env.PROD) return; diff --git a/src/components/providers/SettingsProvider.tsx b/src/components/providers/SettingsProvider.tsx new file mode 100644 index 00000000..025e274c --- /dev/null +++ b/src/components/providers/SettingsProvider.tsx @@ -0,0 +1,47 @@ +import { createContext, useCallback, useContext, useState } from "react"; + +import { lsService } from "@/lib/localStorage"; +import { SupportedCurrency } from "@/lib/types"; + +interface SettingsStore { + currency: SupportedCurrency; + handleCurrencyChange: () => void; +} + +const defaultValue: SettingsStore = { + currency: "USD", + handleCurrencyChange: () => {}, +}; + +const SettingsContext = createContext(defaultValue); + +export const useSettings = () => { + return useContext(SettingsContext); +}; + +export const SettingsProvider = ({ + children, +}: { + children: React.ReactNode; +}) => { + const initialCurrency = lsService.getItem(0, "currency"); + const [currency, setCurrency] = useState( + initialCurrency ?? defaultValue.currency, + ); + + const handleCurrencyChange = useCallback(() => { + if (currency === "USD") { + setCurrency("ETH"); + lsService.setItem(0, "currency", "ETH"); + return; + } + setCurrency("USD"); + lsService.setItem(0, "currency", "USD"); + }, [currency]); + + return ( + + {children} + + ); +}; diff --git a/src/components/vaults/row/VaultAccordionRow.tsx b/src/components/vaults/row/VaultAccordionRow.tsx index 65de4be1..3b19f7ca 100644 --- a/src/components/vaults/row/VaultAccordionRow.tsx +++ b/src/components/vaults/row/VaultAccordionRow.tsx @@ -30,6 +30,7 @@ import { QueryKeys } from "@/lib/queries/queriesSchema"; import { alchemistV2Abi } from "@/abi/alchemistV2"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { Progress } from "@/components/ui/progress"; +import { useSettings } from "@/components/providers/SettingsProvider"; type ContentAction = "deposit" | "withdraw" | "migrate" | "info"; @@ -279,11 +280,13 @@ export const CurrencyCell = ({ tokenDecimals: number | undefined; tokenSymbol: string | undefined; }) => { + const { currency } = useSettings(); + const tokenAmountFormated = formatUnits(tokenAmount, tokenDecimals); const { data: tokenPrice } = useGetTokenPrice(tokenAddress); const isDust = !greaterThan([tokenAmount, tokenDecimals], [5n, 18]); - const amountInUsd = + const amountInCurrency = tokenPrice && !isDust ? toString(multiply(tokenPrice, [tokenAmount, tokenDecimals])) : 0; @@ -296,9 +299,10 @@ export const CurrencyCell = ({

{tokenPrice && (

- {formatNumber(amountInUsd, { + {formatNumber(amountInCurrency, { decimals: 2, isCurrency: true, + currency, dustToZero: true, tokenDecimals, })} diff --git a/src/components/vaults/row/VaultsMetrics.tsx b/src/components/vaults/row/VaultsMetrics.tsx index f6fbe95e..47239eb4 100644 --- a/src/components/vaults/row/VaultsMetrics.tsx +++ b/src/components/vaults/row/VaultsMetrics.tsx @@ -10,11 +10,14 @@ import { useTokensQuery } from "@/lib/queries/useTokensQuery"; import { useVaults } from "@/lib/queries/useVaults"; import { Token, Vault } from "@/lib/types"; import { formatNumber } from "@/utils/number"; +import { useSettings } from "@/components/providers/SettingsProvider"; export const VaultsMetrics = () => { + const { currency } = useSettings(); + const { data: alchemists } = useAlchemists(); const { data: vaults } = useVaults(); - // TODO: DefiLlama has missing price for alETH on Arb. Possible somewhere else too. So we take underlying price. Which is more than real value, but better than 0. + const debtTokenPrices = useGetMultipleTokenPrices( alchemists?.map((alchemist) => alchemist.underlyingTokens[0]), ); @@ -53,7 +56,11 @@ export const VaultsMetrics = () => {

- {formatNumber(totalDeposit, { decimals: 2, isCurrency: true })} + {formatNumber(totalDeposit, { + decimals: 2, + isCurrency: true, + currency, + })}
@@ -67,6 +74,7 @@ export const VaultsMetrics = () => { decimals: 2, isCurrency: true, allowNegative: false, + currency, })}
@@ -81,6 +89,7 @@ export const VaultsMetrics = () => { decimals: 2, isCurrency: true, allowNegative: false, + currency, })} @@ -91,7 +100,11 @@ export const VaultsMetrics = () => {
- {formatNumber(globalTVL, { decimals: 2, isCurrency: true })} + {formatNumber(globalTVL, { + decimals: 2, + isCurrency: true, + currency, + })}
diff --git a/src/lib/constants.ts b/src/lib/constants.ts index acdc6fc4..c0134146 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -4,6 +4,7 @@ export const GAS_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; // Time constants export const ONE_MINUTE_IN_MS = 60 * 1000; export const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; +export const FIVE_MIN_IN_MS = 300000; // Addresses used in the app. These are the addresses of the contracts on the Ethereum mainnet, // so we do not create chain mappings for them. diff --git a/src/lib/localStorage.ts b/src/lib/localStorage.ts index 932b349e..b81c39c0 100644 --- a/src/lib/localStorage.ts +++ b/src/lib/localStorage.ts @@ -7,9 +7,13 @@ import { Token } from "@/lib/types"; interface LocalStorageSchema { tokenListCache: { tokens: Token[]; timestamp: number }; + tenderlyForkRpc: string; tenderlyForkChainId: number; + theme: "dark" | "light"; + + currency: "USD" | "ETH"; } /** diff --git a/src/lib/middleware/bonuses.ts b/src/lib/middleware/bonuses.ts index 2e906ea5..e6e0bc60 100644 --- a/src/lib/middleware/bonuses.ts +++ b/src/lib/middleware/bonuses.ts @@ -1,5 +1,4 @@ import { fantom, mainnet, optimism } from "viem/chains"; -import { getTokenPriceInEth } from "@/lib/queries/useTokenPrice"; import { formatEther, formatUnits } from "viem"; import { rewardRouterAbi } from "@/abi/rewardRouter"; import { @@ -12,6 +11,11 @@ import { getAaveReserves } from "./aave"; import { getVesperReserves } from "./vesper"; import { alchemistV2Abi } from "@/abi/alchemistV2"; import { dayjs } from "@/lib/dayjs"; +import { queryClient } from "@/components/providers/QueryProvider"; +import { + fetchPriceInEth, + useEthPriceQueryOptions, +} from "../queries/useTokenPrice"; const SPY = 31536000; @@ -29,14 +33,19 @@ export const getAaveBonusData: BonusFn = async ({ chainId, vault }) => { (reward) => reward.emissionsPerSecond !== "0", ), ); - const bonusYieldValue = await getTokenPriceInEth({ + + const ethPrice = await queryClient.ensureQueryData(useEthPriceQueryOptions); + + const bonusYieldValue = await fetchPriceInEth({ chainId, tokenAddress: "0x4200000000000000000000000000000000000042", + ethPrice, }); const bonusYieldTokenSymbol = "OP"; - const tokenPriceInEth = await getTokenPriceInEth({ + const tokenPriceInEth = await fetchPriceInEth({ chainId, tokenAddress: vault.underlyingToken, + ethPrice, }); const emissionsPerSecond = @@ -107,13 +116,17 @@ export const getMeltedRewardsBonusData: BonusFn = async ({ const distributionTimeUnit = distributionTimeAmount > 1 ? "days" : "day"; - const bonusYieldValue = await getTokenPriceInEth({ + const ethPrice = await queryClient.ensureQueryData(useEthPriceQueryOptions); + + const bonusYieldValue = await fetchPriceInEth({ chainId, tokenAddress: REWARD_TOKENS[chainId].rewardTokenAddress, + ethPrice, }); - const tokenPriceInEth = await getTokenPriceInEth({ + const tokenPriceInEth = await fetchPriceInEth({ chainId, tokenAddress: vault.underlyingToken, + ethPrice, }); let bonusYieldRate = 0; diff --git a/src/lib/queries/useTokenPrice.ts b/src/lib/queries/useTokenPrice.ts index 697c7010..cbcef951 100644 --- a/src/lib/queries/useTokenPrice.ts +++ b/src/lib/queries/useTokenPrice.ts @@ -1,10 +1,19 @@ +import { queryOptions, useQueries, useQuery } from "@tanstack/react-query"; +import { arbitrum, fantom, mainnet, optimism } from "viem/chains"; + import { SupportedChainId } from "@/lib/wagmi/wagmiConfig"; import { useChain } from "@/hooks/useChain"; -import { useQueries, useQuery } from "@tanstack/react-query"; -import { arbitrum, fantom, mainnet, optimism } from "viem/chains"; +import { useSettings } from "@/components/providers/SettingsProvider"; import { QueryKeys } from "./queriesSchema"; +import { SupportedCurrency } from "../types"; +import { FIVE_MIN_IN_MS, GAS_ADDRESS } from "../constants"; -const FIVE_MIN_IN_MS = 300000; +interface FetchPriceArgs { + chainId: SupportedChainId; + tokenAddress: `0x${string}` | undefined; + currency: SupportedCurrency; + ethPrice: number | undefined; +} const LLAMA_API_URL = "https://coins.llama.fi/prices/current/"; @@ -15,49 +24,80 @@ const chainIdToLlamaChainNameMapping = { [optimism.id]: "optimism", }; -const fetchPrice = async ( - chainId: SupportedChainId, - tokenAddress: `0x${string}` | undefined, -) => { - if (!tokenAddress) - throw new Error("UNEXPECTED: tokenAddress is undefined in fetchPrice"); - const chainToken = `${chainIdToLlamaChainNameMapping[chainId]}:${tokenAddress}`; - const response = await fetch(`${LLAMA_API_URL}${chainToken}`); - const data = (await response.json()) as { - coins: { - [key: string]: { - decimals: number; - symbol: string; - price: number; - timestamp: number; - confidence: number; +const wethMapping = { + [mainnet.id]: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + [arbitrum.id]: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + [optimism.id]: "0x4200000000000000000000000000000000000006", +}; + +export const useEthPriceQueryOptions = queryOptions({ + queryKey: [QueryKeys.TokenPrice, LLAMA_API_URL], + queryFn: async () => { + const ethPriceRes = await fetch(`${LLAMA_API_URL}coingecko:ethereum`); + const ethPriceData = (await ethPriceRes.json()) as { + coins: { + [key: string]: { + decimals: number; + symbol: string; + price: number; + timestamp: number; + confidence: number; + }; }; }; - }; - return data.coins[chainToken].price; + const ethPrice = ethPriceData.coins["coingecko:ethereum"].price; + + return ethPrice; + }, + refetchInterval: FIVE_MIN_IN_MS, + staleTime: FIVE_MIN_IN_MS, +}); + +const useEthPrice = () => { + return useQuery(useEthPriceQueryOptions); }; export const useGetTokenPrice = (tokenAddress: `0x${string}` | undefined) => { + const { currency } = useSettings(); const chain = useChain(); + const { data: ethPrice } = useEthPrice(); + return useQuery({ - queryKey: [QueryKeys.TokenPrice, chain.id, tokenAddress], - queryFn: () => fetchPrice(chain.id, tokenAddress), - enabled: !!tokenAddress, + queryKey: [ + QueryKeys.TokenPrice, + currency, + chain.id, + ethPrice, + tokenAddress, + ], + queryFn: () => + fetchPrice({ chainId: chain.id, tokenAddress, currency, ethPrice }), + enabled: !!tokenAddress && !(ethPrice === undefined && currency === "ETH"), refetchInterval: FIVE_MIN_IN_MS, staleTime: FIVE_MIN_IN_MS, }); }; export const useGetMultipleTokenPrices = (addresses: `0x${string}`[] = []) => { + const { currency } = useSettings(); const chain = useChain(); + const { data: ethPrice } = useEthPrice(); + return useQueries({ queries: addresses.map((tokenAddress) => { return { - queryKey: [QueryKeys.TokenPrice, chain.id, tokenAddress], - queryFn: () => fetchPrice(chain.id, tokenAddress), - enabled: !!tokenAddress, + queryKey: [ + QueryKeys.TokenPrice, + currency, + ethPrice, + chain.id, + tokenAddress, + ], + queryFn: () => + fetchPrice({ chainId: chain.id, tokenAddress, currency, ethPrice }), + enabled: !!tokenAddress && ethPrice !== undefined, refetchInterval: FIVE_MIN_IN_MS, staleTime: FIVE_MIN_IN_MS, refetchOnWindowFocus: false, @@ -66,16 +106,39 @@ export const useGetMultipleTokenPrices = (addresses: `0x${string}`[] = []) => { }); }; -export const getTokenPriceInEth = async ({ +const fetchPrice = async ({ + chainId, + tokenAddress, + currency, + ethPrice, +}: FetchPriceArgs) => { + if (currency === "USD") { + return fetchPriceInUsd({ chainId, tokenAddress, ethPrice }); + } + return fetchPriceInEth({ chainId, tokenAddress, ethPrice }); +}; + +const fetchPriceInUsd = async ({ chainId, tokenAddress, + ethPrice, }: { chainId: SupportedChainId; - tokenAddress: `0x${string}`; + tokenAddress: `0x${string}` | undefined; + ethPrice: number | undefined; }) => { - const price = await fetchPrice(chainId, tokenAddress); - const ethPriceRes = await fetch(`${LLAMA_API_URL}coingecko:ethereum`); - const ethPriceData = (await ethPriceRes.json()) as { + if (!tokenAddress) + throw new Error("UNEXPECTED: tokenAddress is undefined in fetchPrice"); + if (ethPrice === undefined) + throw new Error("UNEXPECTED: ethPrice is undefined in fetchPrice"); + + if (isTokenIsEthOrWeth({ chainId, tokenAddress })) { + return ethPrice; + } + + const chainToken = `${chainIdToLlamaChainNameMapping[chainId]}:${tokenAddress}`; + const response = await fetch(`${LLAMA_API_URL}${chainToken}`); + const data = (await response.json()) as { coins: { [key: string]: { decimals: number; @@ -86,6 +149,47 @@ export const getTokenPriceInEth = async ({ }; }; }; - const ethPrice = ethPriceData.coins["coingecko:ethereum"].price; + return data.coins[chainToken].price; +}; + +export const fetchPriceInEth = async ({ + chainId, + tokenAddress, + ethPrice, +}: { + chainId: SupportedChainId; + tokenAddress: `0x${string}` | undefined; + ethPrice: number | undefined; +}) => { + if (!tokenAddress) + throw new Error("UNEXPECTED: tokenAddress is undefined in fetchPriceInEth"); + if (ethPrice === undefined) { + throw new Error("UNEXPECTED: ethPrice is undefined in fetchPriceInEth"); + } + + if (isTokenIsEthOrWeth({ chainId, tokenAddress })) { + return 1; + } + + const price = await fetchPriceInUsd({ chainId, tokenAddress, ethPrice }); return price / ethPrice; }; + +/** + * Check if token is ETH or WETH. + * In supported chains only fantom uses another native token (FTM) as gas. + * And we hardcode WETH to ETH. + */ +const isTokenIsEthOrWeth = ({ + tokenAddress, + chainId, +}: { + tokenAddress: `0x${string}`; + chainId: SupportedChainId; +}) => { + return ( + chainId !== fantom.id && + (tokenAddress === GAS_ADDRESS || + tokenAddress.toLowerCase() === wethMapping[chainId].toLowerCase()) + ); +}; diff --git a/src/lib/types.ts b/src/lib/types.ts index 63e3981c..5ee2bd78 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -7,6 +7,8 @@ export type Mutable = { -readonly [P in keyof T]: T[P]; }; +export type SupportedCurrency = "USD" | "ETH"; + export type TokenAdapter = { price: bigint; underlyingToken: Address; diff --git a/src/main.tsx b/src/main.tsx index be28728e..77487fb0 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -6,6 +6,7 @@ import { Web3Provider } from "@/components/providers/Web3Provider"; import { QueryProvider } from "@/components/providers/QueryProvider"; import { FramerMotionProvider } from "@/components/providers/FramerMotionProvider"; import { ThemeProvider } from "@/components/providers/ThemeProvider"; +import { SettingsProvider } from "@/components/providers/SettingsProvider"; // Import the generated route tree import { routeTree } from "@/routeTree.gen"; @@ -27,13 +28,15 @@ if (!rootElement.innerHTML) { root.render( - - - - - - - + + + + + + + + + , ); diff --git a/src/utils/number.test.ts b/src/utils/number.test.ts index 8b429084..3379e7e4 100644 --- a/src/utils/number.test.ts +++ b/src/utils/number.test.ts @@ -100,11 +100,24 @@ describe("Format number", () => { }); describe("Currency", () => { - it("Should format number with currency symbol", () => { + it("Should format number with $ symbol, if currency unset", () => { const amount = "1000"; const formatted = formatNumber(amount, { isCurrency: true }); expect(formatted).toBe("$1,000.00"); }); + it("Should format number with $ symbol, if currency set to USD", () => { + const amount = "1000"; + const formatted = formatNumber(amount, { isCurrency: true }); + expect(formatted).toBe("$1,000.00"); + }); + it("Should format number with currency name, if currency set to ETH", () => { + const amount = "1000"; + const formatted = formatNumber(amount, { + isCurrency: true, + currency: "ETH", + }); + expect(formatted).toBe("1,000.00 ETH"); + }); }); describe("Decimals", () => { diff --git a/src/utils/number.ts b/src/utils/number.ts index 319e0998..c786c2cb 100644 --- a/src/utils/number.ts +++ b/src/utils/number.ts @@ -1,6 +1,8 @@ import { from, toString, lessThan, equal, type Numberish } from "dnum"; import { parseUnits } from "viem"; +import { SupportedCurrency } from "@/lib/types"; + const subscriptMap: Record = { "0": "₀", "1": "₁", @@ -43,6 +45,7 @@ const enforceToDecimalString = (value: Numberish) => toString(from(value)); interface BaseFormatNumberOptions { decimals?: number; isCurrency?: boolean; + currency?: SupportedCurrency; allowNegative?: boolean; dustToZero?: boolean; tokenDecimals?: number; @@ -70,12 +73,17 @@ export function formatNumber( dustToZero = false, tokenDecimals = 18, compact = false, + currency = "USD", }: FormatNumberOptions = {}, ) { + const getManualFormat = (comparator?: string) => { + return `${isCurrency && currency === "USD" ? "$" : ""}${comparator ?? "0.00"}${isCurrency && currency === "ETH" ? " ETH" : ""}`; + }; + if (amount !== undefined && amount !== null && !!amount && !isNaN(+amount)) { // Negative numbers check if (!allowNegative && lessThan(amount, 0)) { - return `${isCurrency ? "$" : ""}0.00`; + return getManualFormat(); } // Dust to zero check @@ -86,7 +94,7 @@ export function formatNumber( tokenDecimals, ); if (lessThan(amountBigInt, 5n) || equal(amountBigInt, 5n)) { - return `${isCurrency ? "$" : ""}0.00`; + return getManualFormat(); } } catch (e) { console.error("Error parsing units", e); @@ -107,7 +115,6 @@ export function formatNumber( // Currency if (isCurrency) { - const currency = "USD"; intlOptions.style = "currency"; intlOptions.currency = currency; intlOptions.currencyDisplay = getDisplayCurrency(currency); @@ -121,7 +128,7 @@ export function formatNumber( // Small numbers if (+amount > 0 && +amount < comparator) { - const lessThanComparatorRepresentation = `< ${isCurrency ? "$" : ""}${comparator.toFixed(decimals)}`; + const lessThanComparatorRepresentation = `< ${getManualFormat(comparator.toFixed(decimals))}`; const numStr = enforceToDecimalString(amount); const match = numStr.match(/0\.0*(\d+)/); @@ -144,7 +151,7 @@ export function formatNumber( return formatter.format(+amount); } else { - return `${isCurrency ? "$" : ""}0.00`; + return getManualFormat(); } } From b337d240d02bf8b850716faf58ed9857033fe5ce Mon Sep 17 00:00:00 2001 From: t0rbik Date: Thu, 5 Sep 2024 21:19:16 +0200 Subject: [PATCH 44/46] fix redundant preparing liquidate --- src/components/ui/sonner.tsx | 2 +- src/components/vaults/common_actions/Liquidate.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx index c9a05982..8f627da6 100644 --- a/src/components/ui/sonner.tsx +++ b/src/components/ui/sonner.tsx @@ -13,7 +13,7 @@ const Toaster = ({ ...props }: ToasterProps) => { toastOptions={{ classNames: { toast: - "font-['Montserrat'] group toast group-[.toaster]:bg-white group-[.toaster]:text-neutral-950 group-[.toaster]:border-neutral-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-neutral-950 dark:group-[.toaster]:text-neutral-50 dark:group-[.toaster]:border-neutral-800", + "font-['Montserrat'] group toast group-[.toaster]:bg-white group-[.toaster]:text-white2inverse group-[.toaster]:border-neutral-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-neutral-950 dark:group-[.toaster]:text-white2 dark:group-[.toaster]:border-neutral-800", description: "font-['Montserrat'] group-[.toast]:text-neutral-500 dark:group-[.toast]:text-neutral-400", actionButton: diff --git a/src/components/vaults/common_actions/Liquidate.tsx b/src/components/vaults/common_actions/Liquidate.tsx index 2056c617..c5d44306 100644 --- a/src/components/vaults/common_actions/Liquidate.tsx +++ b/src/components/vaults/common_actions/Liquidate.tsx @@ -284,7 +284,7 @@ export const Liquidate = () => { onClick={onCtaClick} disabled={isPending || isInputZero(amount) || !confirmedLiquidation} > - {isPending ? "Preparing..." : "Liquidate"} + Liquidate )} From 7ea0fc0359b4c4bebcf8c5989a3b48df461117bb Mon Sep 17 00:00:00 2001 From: t0rbik Date: Thu, 5 Sep 2024 21:20:43 +0200 Subject: [PATCH 45/46] revert sonner change --- src/components/ui/sonner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx index 8f627da6..c9a05982 100644 --- a/src/components/ui/sonner.tsx +++ b/src/components/ui/sonner.tsx @@ -13,7 +13,7 @@ const Toaster = ({ ...props }: ToasterProps) => { toastOptions={{ classNames: { toast: - "font-['Montserrat'] group toast group-[.toaster]:bg-white group-[.toaster]:text-white2inverse group-[.toaster]:border-neutral-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-neutral-950 dark:group-[.toaster]:text-white2 dark:group-[.toaster]:border-neutral-800", + "font-['Montserrat'] group toast group-[.toaster]:bg-white group-[.toaster]:text-neutral-950 group-[.toaster]:border-neutral-200 group-[.toaster]:shadow-lg dark:group-[.toaster]:bg-neutral-950 dark:group-[.toaster]:text-neutral-50 dark:group-[.toaster]:border-neutral-800", description: "font-['Montserrat'] group-[.toast]:text-neutral-500 dark:group-[.toast]:text-neutral-400", actionButton: From 7bec1674b8e1f453b2f919c4e2de8baf971e4c24 Mon Sep 17 00:00:00 2001 From: t0rbik Date: Fri, 6 Sep 2024 17:40:19 +0200 Subject: [PATCH 46/46] fix vesper bonus --- src/lib/middleware/bonuses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/middleware/bonuses.ts b/src/lib/middleware/bonuses.ts index e6e0bc60..2150d02f 100644 --- a/src/lib/middleware/bonuses.ts +++ b/src/lib/middleware/bonuses.ts @@ -77,7 +77,7 @@ export const getVesperBonusData: BonusFn = async ({ vault }) => { (reserve) => reserve.address.toLowerCase() === vault.address.toLowerCase(), ); const bonusYieldTokenSymbol = "VSP"; - const bonusYieldRate = (vesperVault?.tokenDeltaRates?.["30"] ?? 0) * 100; + const bonusYieldRate = vesperVault?.tokenDeltaRates?.["30"] ?? 0; const hasBonus = true; return { hasBonus,