From ffe3ad53d96dc97551be4995a33941776699417e Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 30 Apr 2025 12:11:55 -0300 Subject: [PATCH 01/85] chore: wip async mint --- src/components/ui/switch.tsx | 18 +- src/hooks/useAsyncZap.ts | 92 ++++++++ src/utils/constants.ts | 2 +- .../async-swaps/async-mint/index.tsx | 142 +++++++++++++ .../async-swaps/async-redeem/index.tsx | 152 +++++++++++++ .../overview/components/async-swaps/atom.ts | 3 + .../components/async-swaps/collaterals.tsx | 140 ++++++++++++ .../async-swaps/submit-async-swap.tsx | 200 ++++++++++++++++++ .../overview/components/async-swaps/types.ts | 30 +++ .../overview/components/zap-mint/atom.ts | 8 + .../overview/components/zap-mint/index.tsx | 139 +++++++----- 11 files changed, 869 insertions(+), 57 deletions(-) create mode 100644 src/hooks/useAsyncZap.ts create mode 100644 src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx create mode 100644 src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx create mode 100644 src/views/index-dtf/overview/components/async-swaps/atom.ts create mode 100644 src/views/index-dtf/overview/components/async-swaps/collaterals.tsx create mode 100644 src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx create mode 100644 src/views/index-dtf/overview/components/async-swaps/types.ts diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx index 9ca940bb9..3b72a7081 100644 --- a/src/components/ui/switch.tsx +++ b/src/components/ui/switch.tsx @@ -3,13 +3,19 @@ import * as SwitchPrimitives from '@radix-ui/react-switch' import { cn } from '@/lib/utils' +interface SwitchProps + extends React.ComponentPropsWithoutRef { + size?: 'default' | 'xs' +} + const Switch = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( + SwitchProps +>(({ className, size = 'default', ...props }, ref) => ( diff --git a/src/hooks/useAsyncZap.ts b/src/hooks/useAsyncZap.ts new file mode 100644 index 000000000..d97360606 --- /dev/null +++ b/src/hooks/useAsyncZap.ts @@ -0,0 +1,92 @@ +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { RESERVE_API } from '@/utils/constants' +import { zapSwapEndpointAtom } from '@/views/index-dtf/overview/components/zap-mint/atom' +import { useQuery } from '@tanstack/react-query' +import { useAtomValue, useSetAtom } from 'jotai' +import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' +import { useEffect, useMemo } from 'react' +import { Address } from 'viem' +import useDebounce from './useDebounce' +import { AsyncSwapResponse } from '@/views/index-dtf/overview/components/async-swaps/types' + +const useAsyncZap = ({ + dtf, + amountOut, + slippage, + disabled, + dtfTicker, + type, +}: { + dtf?: Address + amountOut: string + slippage: number + disabled: boolean + dtfTicker: string + type: 'mint' | 'redeem' +}) => { + const chainId = useAtomValue(chainIdAtom) + const account = useAtomValue(walletAtom) + const setZapSwapEndpoint = useSetAtom(zapSwapEndpointAtom) + + const getEndpoint = () => + !dtf || isNaN(Number(amountOut)) || Number(amountOut) === 0 + ? null + : `${RESERVE_API}async-swap/quote?dtf=${dtf}&chainId=${chainId}&amountOut=${amountOut}&operation=${type}&signer=${account}` + + const endpoint = useDebounce( + useMemo( + () => getEndpoint(), + [chainId, account, dtf, amountOut, type, slippage] + ), + 500 + ) + + useEffect(() => { + setZapSwapEndpoint(endpoint ?? '') + }, [endpoint]) + + return useQuery({ + queryKey: ['async-zap', endpoint], + queryFn: async (): Promise => { + if (!endpoint) throw new Error('No endpoint available') + const response = await fetch(endpoint) + if (!response.ok) { + const error = response.status + mixpanel.track('async-zap', { + event: 'async-zap', + wa: account, + dtf: dtf, + ticker: dtfTicker, + chainId, + type, + endpoint, + status: 'error', + error, + }) + throw new Error(`Error: ${error}`) + } + const data = await response.json() + + if (data) { + mixpanel.track('async-zap', { + event: 'async-zap', + wa: account, + dtf: dtf, + ticker: dtfTicker, + chainId, + type, + endpoint, + status: 'success', + }) + } + + return data + }, + enabled: !!endpoint && !disabled, + refetchInterval: 120000, + retry: 3, + retryDelay: (attempt) => Math.min(1000 * Math.pow(2, attempt), 10000), + }) +} + +export default useAsyncZap diff --git a/src/utils/constants.ts b/src/utils/constants.ts index f8bd394d6..3290b5e31 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -22,7 +22,7 @@ export const RESERVE_FORUM = 'https://forum.reserve.org/' export const REGISTER_BUGS = 'https://reserve.canny.io/defi-surfaces-bug-reporting' export const RESERVE_STORAGE = 'https://storage.reserve.org/' -export const RESERVE_API = 'https://api.reserve.org/' +export const RESERVE_API = 'https://api-staging.reserve.org/' export const DUNE_DASHBOARD = 'https://dune.com/reserve-protocol/reserve-protocol-overview' export const REPOSITORY_URL = 'https://github.com/reserve-protocol/register' diff --git a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx new file mode 100644 index 000000000..b3426505b --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx @@ -0,0 +1,142 @@ +import Swap from '@/components/ui/swap' +import useAsyncZap from '@/hooks/useAsyncZap' +import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' +import { chainIdAtom } from '@/state/atoms' +import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' +import { formatCurrency } from '@/utils' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { useCallback, useEffect, useMemo } from 'react' +import { parseEther, parseUnits } from 'viem' +import useLoadingAfterRefetch from '../../hooks/useLoadingAfterRefetch' +import { + currentZapMintTabAtom, + openZapMintModalAtom, + selectedTokenBalanceAtom, + selectedTokenOrDefaultAtom, + slippageAtom, + zapFetchingAtom, + zapMintInputAtom, + zapOngoingTxAtom, + zapRefetchAtom, +} from '../../zap-mint/atom' +import SubmitAsyncSwap from '../submit-async-swap' + +const ASYNC_SWAP_BUFFER = 0.005 + +const AsyncMint = () => { + const chainId = useAtomValue(chainIdAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const dtfPrice = useAtomValue(indexDTFPriceAtom) + const [inputAmount, setInputAmount] = useAtom(zapMintInputAtom) + const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) + const slippage = useAtomValue(slippageAtom) + const [ongoingTx, setOngoingTx] = useAtom(zapOngoingTxAtom) + const setZapRefetch = useSetAtom(zapRefetchAtom) + const setZapFetching = useSetAtom(zapFetchingAtom) + const setCurrentTab = useSetAtom(currentZapMintTabAtom) + const setOpen = useSetAtom(openZapMintModalAtom) + const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) + const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) + const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') + + const insufficientBalance = + parseUnits(inputAmount, selectedToken.decimals) > + (selectedTokenBalance?.value || 0n) + + const amountOut = useMemo(() => { + return ( + ((Number(inputAmount) || 0) / (dtfPrice ?? 1)) * (1 - ASYNC_SWAP_BUFFER) + ) + }, [inputAmount, dtfPrice]) + + const amountOutValue = useMemo(() => { + return (Number(inputAmount) || 0) * (1 - ASYNC_SWAP_BUFFER) + }, [inputAmount]) + + const bufferValue = useMemo(() => { + return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER + }, [inputAmount]) + + const { data, isLoading, isFetching, refetch, failureReason } = useAsyncZap({ + dtf: indexDTF?.id, + amountOut: parseEther(amountOut.toString()).toString(), + slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, + disabled: insufficientBalance || ongoingTx, + dtfTicker: indexDTF?.token.symbol || '', + type: 'mint', + }) + + const { loadingAfterRefetch } = useLoadingAfterRefetch(data) + + const priceFrom = 0 + + // const valueTo = data?.result?.amountOut + // const showTxButton = Boolean( + // data?.status === 'success' && + // data?.result && + // !insufficientBalance && + // !isLoading + // ) + const fetchingZapper = isLoading || isFetching + + const changeTab = () => { + setCurrentTab((prev) => (prev === 'sell' ? 'buy' : 'sell')) + setInputAmount('') + } + + useEffect(() => { + setZapRefetch({ fn: refetch }) + }, [refetch, setZapRefetch]) + + useEffect(() => { + setZapFetching(fetchingZapper) + }, [fetchingZapper, setZapFetching]) + + useEffect(() => { + setOngoingTx(false) + setInputAmount('') + }, []) + + const onSuccess = useCallback(() => { + setInputAmount('') + setOpen(false) + }, []) + + if (!indexDTF) return null + + return ( +
+ ${formatCurrency(amountOutValue)} + ) : undefined, + value: amountOut.toString(), + }} + onSwap={changeTab} + loading={isLoading || loadingAfterRefetch} + /> + {/* {!!data && } */} + +
+ ) +} + +export default AsyncMint diff --git a/src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx new file mode 100644 index 000000000..6e5239cd1 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx @@ -0,0 +1,152 @@ +import Swap from '@/components/ui/swap' +import useZapSwapQuery from '@/hooks/useZapSwapQuery' +import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' +import { formatCurrency } from '@/utils' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { useCallback, useEffect } from 'react' +import { formatEther, formatUnits, parseEther } from 'viem' +import useLoadingAfterRefetch from '../../hooks/useLoadingAfterRefetch' +import { + currentZapMintTabAtom, + forceMintAtom, + indexDTFBalanceAtom, + openZapMintModalAtom, + selectedTokenAtom, + selectedTokenOrDefaultAtom, + slippageAtom, + tokensAtom, + zapFetchingAtom, + zapMintInputAtom, + zapOngoingTxAtom, + zapRefetchAtom, +} from '../../zap-mint/atom' +import SubmitZap from '../../zap-mint/submit-zap' +import ZapDetails, { ZapPriceImpact } from '../../zap-mint/zap-details' + +const AsyncRedeem = () => { + const indexDTF = useAtomValue(indexDTFAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) + const [inputAmount, setInputAmount] = useAtom(zapMintInputAtom) + const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const indexDTFBalance = useAtomValue(indexDTFBalanceAtom) + const indxDTFParsedBalance = formatEther(indexDTFBalance) + const tokens = useAtomValue(tokensAtom) + const slippage = useAtomValue(slippageAtom) + const forceMint = useAtomValue(forceMintAtom) + const setOutputToken = useSetAtom(selectedTokenAtom) + const [ongoingTx, setOngoingTx] = useAtom(zapOngoingTxAtom) + const setZapRefetch = useSetAtom(zapRefetchAtom) + const setZapFetching = useSetAtom(zapFetchingAtom) + const setCurrentTab = useSetAtom(currentZapMintTabAtom) + const setOpen = useSetAtom(openZapMintModalAtom) + const inputPrice = (indexDTFPrice || 0) * Number(inputAmount) + const onMax = () => setInputAmount(indxDTFParsedBalance) + + const insufficientBalance = parseEther(inputAmount) > indexDTFBalance + + const { data, isLoading, isFetching, refetch, failureReason } = + useZapSwapQuery({ + tokenIn: indexDTF?.id, + tokenOut: selectedToken.address, + amountIn: parseEther(inputAmount).toString(), + slippage: Number(slippage), + disabled: insufficientBalance || ongoingTx, + forceMint, + dtfTicker: indexDTF?.token.symbol || '', + type: 'sell', + }) + + const { loadingAfterRefetch } = useLoadingAfterRefetch(data) + + const priceFrom = data?.result?.amountInValue + const priceTo = data?.result?.amountOutValue + const valueTo = data?.result?.amountOut + const showTxButton = Boolean( + data?.status === 'success' && + data?.result && + !insufficientBalance && + !isLoading + ) + const fetchingZapper = isLoading || isFetching + const zapperErrorMessage = isFetching + ? '' + : data?.error || failureReason?.message || '' + const dustValue = data?.result?.dustValue || 0 + + const changeTab = () => { + setCurrentTab((prev) => (prev === 'sell' ? 'buy' : 'sell')) + setOutputToken(tokens[0]) + setInputAmount('') + } + + useEffect(() => { + setZapRefetch({ fn: refetch }) + }, [refetch, setZapRefetch]) + + useEffect(() => { + setZapFetching(fetchingZapper) + }, [fetchingZapper, setZapFetching]) + + useEffect(() => { + setOngoingTx(false) + setInputAmount('') + }, []) + + const onSuccess = useCallback(() => { + setInputAmount('') + setOpen(false) + }, []) + + if (!indexDTF) return null + + return ( +
+ + ${formatCurrency(priceTo)} + {dustValue > 0.01 + ? ` + $${formatCurrency(dustValue)} in dust ` + : ' '} + + + ) : undefined, + value: formatUnits(BigInt(valueTo || 0), selectedToken.decimals), + tokens, + onTokenSelect: setOutputToken, + }} + onSwap={changeTab} + loading={isLoading || loadingAfterRefetch} + /> + {!!data?.result && } + +
+ ) +} + +export default AsyncRedeem diff --git a/src/views/index-dtf/overview/components/async-swaps/atom.ts b/src/views/index-dtf/overview/components/async-swaps/atom.ts new file mode 100644 index 000000000..02770c061 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/atom.ts @@ -0,0 +1,3 @@ +import { atom } from 'jotai' + +export const asyncSwapResponseAtom = atom(undefined) diff --git a/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx b/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx new file mode 100644 index 000000000..63f47a944 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx @@ -0,0 +1,140 @@ +import TokenLogo from '@/components/token-logo' +import { cn } from '@/lib/utils' +import { ArrowLeftRight } from 'lucide-react' +import { Address } from 'viem' + +type CollateralsProps = { + orders?: { + address: Address + symbol: string + amount: string + value: string + status: 'Filled' | 'Not Filled' | 'Pending' + }[] +} + +const mockCollaterals = [ + { + address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf' as Address, + symbol: 'cbBTC', + amount: '0.0005', + value: '3.50', + status: 'Filled' as const, + }, + { + address: '0xCb327b99fF831bF8223cCEd12B1338FF3aA322Ff' as Address, + symbol: 'bsdETH', + amount: '0.001', + value: '3.20', + status: 'Pending' as const, + }, + { + address: '0x9B8Df6E244526ab5F6e6400d331DB28C8fdDdb55' as Address, + symbol: 'uSOL', + amount: '0.1', + value: '2.50', + status: 'Not Filled' as const, + }, + { + address: '0xd403D1624DAEF243FbcBd4A80d8A6F36afFe32b2' as Address, + symbol: 'uLINK', + amount: '0.5', + value: '2.00', + status: 'Filled' as const, + }, + { + address: '0xd6a34b430C05ac78c24985f8abEE2616BC1788Cb' as Address, + symbol: 'uAVAX', + amount: '0.1', + value: '1.80', + status: 'Pending' as const, + }, + { + address: '0x378c326A472915d38b2D8D41e1345987835FaB64' as Address, + symbol: 'uXLM', + amount: '10', + value: '1.50', + status: 'Not Filled' as const, + }, + { + address: '0xb0505e5a99abd03d94a1169e638B78EDfEd26ea4' as Address, + symbol: 'uSUI', + amount: '2', + value: '1.20', + status: 'Filled' as const, + }, + { + address: '0x0F813f4785b2360009F9aC9BF6121a85f109efc6' as Address, + symbol: 'uDOT', + amount: '1', + value: '1.00', + status: 'Pending' as const, + }, + { + address: '0x3EB097375fc2FC361e4a472f5E7067238c547c52' as Address, + symbol: 'uLTC', + amount: '0.05', + value: '0.80', + status: 'Not Filled' as const, + }, + { + address: '0x7bE0Cc2cADCD4A8f9901B4a66244DcDd9Bd02e0F' as Address, + symbol: 'uBCH', + amount: '0.05', + value: '0.70', + status: 'Filled' as const, + }, + { + address: '0xc3De830EA07524a0761646a6a4e4be0e114a3C83' as Address, + symbol: 'UNI', + amount: '1', + value: '0.50', + status: 'Pending' as const, + }, + { + address: '0x5ed25E305E08F58AFD7995EaC72563E6BE65A617' as Address, + symbol: 'uNEAR', + amount: '2', + value: '0.30', + status: 'Not Filled' as const, + }, +] + +const Collaterals = ({ orders = mockCollaterals }: CollateralsProps) => { + return ( +
+ {orders.map((order) => ( +
+
+ +
+ + {order.amount} {order.symbol} + +
+ + {order.value} USDC +
+
+
+
+ {order.status} +
+
+ ))} +
+ ) +} + +export default Collaterals diff --git a/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx b/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx new file mode 100644 index 000000000..4bf86226b --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx @@ -0,0 +1,200 @@ +import { Button } from '@/components/ui/button' +import { AsyncSwapResponse } from './types' +import { useCallback, useState } from 'react' +import { useAccount, usePublicClient, useWalletClient } from 'wagmi' +import { chainIdAtom } from '@/state/atoms' +import { useAtomValue } from 'jotai' +import { RESERVE_API } from '@/utils/constants' +import { erc20Abi } from 'viem' +import { Address } from 'viem' + +const COWSWAP_VAULT_RELAYER = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' +const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' +const USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' + +type SubmitAsyncSwapProps = { + data?: AsyncSwapResponse + dtfAddress: string + amountOut: string + operation: string +} + +const SubmitAsyncSwap = ({ + data, + dtfAddress, + amountOut, + operation, +}: SubmitAsyncSwapProps) => { + const { cowswapQuotes } = data || {} + const [isSigning, setIsSigning] = useState(false) + const [isApproving, setIsApproving] = useState(false) + const { address: signerAddress } = useAccount() + const chainId = useAtomValue(chainIdAtom) + const publicClient = usePublicClient() + const { data: walletClient } = useWalletClient() + + const approveVaultRelayer = useCallback(async () => { + if (!signerAddress || !publicClient || !walletClient) return + + try { + setIsApproving(true) + + // Check current allowance + const allowance = await publicClient.readContract({ + address: USDC_ADDRESS as Address, + abi: erc20Abi, + functionName: 'allowance', + args: [signerAddress, COWSWAP_VAULT_RELAYER as Address], + }) + + if (allowance > 0n) { + console.log('CoWSwap VaultRelayer already approved for USDC') + return true + } + + // Simulate approval + const { request } = await publicClient.simulateContract({ + account: signerAddress, + address: USDC_ADDRESS as Address, + abi: erc20Abi, + functionName: 'approve', + args: [ + COWSWAP_VAULT_RELAYER as Address, + BigInt(2) ** BigInt(256) - BigInt(1), + ], + }) + + // Send approval transaction + const hash = await walletClient.writeContract(request) + console.log('VaultRelayer approval transaction sent:', hash) + + // Wait for confirmation + const receipt = await publicClient.waitForTransactionReceipt({ hash }) + console.log('VaultRelayer approval completed:', receipt.status) + + return receipt.status === 'success' + } catch (error) { + console.error('Error approving VaultRelayer:', error) + return false + } finally { + setIsApproving(false) + } + }, [signerAddress, publicClient, walletClient]) + + const handleSubmit = useCallback(async () => { + if (!cowswapQuotes?.length || !signerAddress || !chainId) return + + setIsSigning(true) + try { + // 1. Sign CoWSwap quotes + const signedCowswapOrders = await Promise.all( + cowswapQuotes.map(async (quote) => { + const typedData = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Order: [ + { name: 'sellToken', type: 'address' }, + { name: 'buyToken', type: 'address' }, + { name: 'receiver', type: 'address' }, + { name: 'sellAmount', type: 'uint256' }, + { name: 'buyAmount', type: 'uint256' }, + { name: 'validTo', type: 'uint32' }, + { name: 'appData', type: 'bytes32' }, + { name: 'feeAmount', type: 'uint256' }, + { name: 'kind', type: 'string' }, + { name: 'partiallyFillable', type: 'bool' }, + { name: 'sellTokenBalance', type: 'string' }, + { name: 'buyTokenBalance', type: 'string' }, + ], + }, + domain: { + name: 'CoW Protocol', + version: 'v2', + chainId: Number(chainId), + verifyingContract: COWSWAP_SETTLEMENT, + }, + primaryType: 'Order', + message: { + ...quote.quote.quote, + feeAmount: '0', + }, + } + + const signature = await window.ethereum.request({ + method: 'eth_signTypedData_v4', + params: [signerAddress, JSON.stringify(typedData)], + }) + + return { + quote: quote.quote, + orderSigningResult: signature, + } + }) + ) + + // 2. Approve Vault Relayer + const approved = await approveVaultRelayer() + if (!approved) { + throw new Error('Failed to approve Vault Relayer') + } + + // 3. Prepare signed orders for API submission + const signedOrders = { + universalOrders: [], // Empty for now as per requirements + cowswapOrders: signedCowswapOrders, + } + + // 4. Submit signed orders to API + const response = await fetch(`${RESERVE_API}async-swap/order`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + dtf: dtfAddress, + chainId, + amountOut, + operation, + signer: signerAddress, + signedOrders, + }), + }) + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + console.log('Orders submitted successfully:', await response.json()) + } catch (error) { + console.error('Error processing orders:', error) + } finally { + setIsSigning(false) + } + }, [ + cowswapQuotes, + signerAddress, + chainId, + dtfAddress, + amountOut, + operation, + approveVaultRelayer, + ]) + + return ( +
+ +
+ ) +} + +export default SubmitAsyncSwap diff --git a/src/views/index-dtf/overview/components/async-swaps/types.ts b/src/views/index-dtf/overview/components/async-swaps/types.ts new file mode 100644 index 000000000..5be9f2682 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/types.ts @@ -0,0 +1,30 @@ +export type AsyncSwapQuote = { + token: string + symbol: string + quote: { + quote: { + sellToken: string + buyToken: string + receiver: string + sellAmount: string + buyAmount: string + validTo: number + appData: string + feeAmount: string + kind: string + partiallyFillable: boolean + sellTokenBalance: string + buyTokenBalance: string + signingScheme: string + } + from: string + expiration: string + id: number + verified: boolean + } +} + +export type AsyncSwapResponse = { + universalQuotes: AsyncSwapQuote[] + cowswapQuotes: AsyncSwapQuote[] +} diff --git a/src/views/index-dtf/overview/components/zap-mint/atom.ts b/src/views/index-dtf/overview/components/zap-mint/atom.ts index 406110308..c34c00c4b 100644 --- a/src/views/index-dtf/overview/components/zap-mint/atom.ts +++ b/src/views/index-dtf/overview/components/zap-mint/atom.ts @@ -6,6 +6,7 @@ import { atomWithReset } from 'jotai/utils' export const openZapMintModalAtom = atom(false) export const currentZapMintTabAtom = atom<'buy' | 'sell'>('buy') +export const asyncZapModeAtom = atom(false) export const showZapSettingsAtom = atom(false) export const zapMintInputAtom = atomWithReset('') export const indexDTFBalanceAtom = atom(0n) @@ -16,8 +17,15 @@ export const defaultSelectedTokenAtom = atom((get) => { return reducedZappableTokens[chainId][0] }) export const selectedTokenOrDefaultAtom = atom((get) => { + const asyncZapMode = get(asyncZapModeAtom) const selectedToken = get(selectedTokenAtom) const defaultToken = get(defaultSelectedTokenAtom) + + if (asyncZapMode) { + const chainId = get(chainIdAtom) + return reducedZappableTokens[chainId][2] // USDC + } + return selectedToken || defaultToken }) diff --git a/src/views/index-dtf/overview/components/zap-mint/index.tsx b/src/views/index-dtf/overview/components/zap-mint/index.tsx index 639e33467..891878edd 100644 --- a/src/views/index-dtf/overview/components/zap-mint/index.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/index.tsx @@ -15,6 +15,7 @@ import { ArrowLeft, Settings, X } from 'lucide-react' import { ReactNode, useEffect } from 'react' import { Link } from 'react-router-dom' import { + asyncZapModeAtom, currentZapMintTabAtom, defaultSelectedTokenAtom, indexDTFBalanceAtom, @@ -31,10 +32,17 @@ import LowLiquidityWarning from './low-liquidity-warning' import RefreshQuote from './refresh-quote' import Sell from './sell' import ZapSettings from './zap-settings' +import Help from '@/components/ui/help' +import { Label } from '@/components/ui/label' +import { Switch } from '@/components/ui/switch' +import AsyncMint from '../async-swaps/async-mint' +import AsyncRedeem from '../async-swaps/async-redeem' +import Collaterals from '../async-swaps/collaterals' const ZapMint = ({ children }: { children: ReactNode }) => { const [open, setOpen] = useAtom(openZapMintModalAtom) const currentTab = useAtomValue(currentZapMintTabAtom) + const [asyncZapMode, setAsyncZapMode] = useAtom(asyncZapModeAtom) const [showSettings, setShowSettings] = useAtom(showZapSettingsAtom) const defaultToken = useAtomValue(defaultSelectedTokenAtom) const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom) @@ -77,68 +85,95 @@ const ZapMint = ({ children }: { children: ReactNode }) => { {children} - - {showSettings ? ( - - ) : ( -
+
+ + {showSettings ? ( - { - trackClick('zap_refresh', tokenIn.symbol, tokenOut.symbol) - zapRefetch.fn?.() - }} - loading={zapFetching} - disabled={zapFetching || zapOngoingTx || invalidInput} + ) : ( +
+ + { + trackClick('zap_refresh', tokenIn.symbol, tokenOut.symbol) + zapRefetch.fn?.() + }} + loading={zapFetching} + disabled={zapFetching || zapOngoingTx || invalidInput} + /> +
+ )} +
+ +
- )} - - - -
- {showSettings && } -
-
- - {currentTab === 'buy' ? : } + + + + + {showSettings && } +
+
+ + {!asyncZapMode && (currentTab === 'buy' ? : )} + {asyncZapMode && + (currentTab === 'buy' ? : )} +
+
+
+ + Having issues minting? (Zaps are in beta) + + Wait and try again or{' '} + + switch to manual {currentTab === 'buy' ? 'minting' : 'redeeming'} +
-
- - Having issues minting? (Zaps are in beta) - - Wait and try again or{' '} - - switch to manual {currentTab === 'buy' ? 'minting' : 'redeeming'} - +
+
From a8e3e785e977c9da84e0ea30c3e9dc476ff0f3a2 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Fri, 2 May 2025 11:37:07 -0300 Subject: [PATCH 02/85] chore: integrate sign, submit and get status of async mint --- src/hooks/{useAsyncZap.ts => useAsyncSwap.ts} | 6 +- .../async-swaps/async-mint/index.tsx | 6 +- .../overview/components/async-swaps/atom.ts | 6 +- .../components/async-swaps/collaterals.tsx | 194 ++++++++---------- .../async-swaps/order-status-updater.tsx | 37 ++++ .../async-swaps/submit-async-swap.tsx | 55 +++-- .../overview/components/async-swaps/types.ts | 38 +++- .../overview/components/zap-mint/index.tsx | 16 +- 8 files changed, 216 insertions(+), 142 deletions(-) rename src/hooks/{useAsyncZap.ts => useAsyncSwap.ts} (96%) create mode 100644 src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx diff --git a/src/hooks/useAsyncZap.ts b/src/hooks/useAsyncSwap.ts similarity index 96% rename from src/hooks/useAsyncZap.ts rename to src/hooks/useAsyncSwap.ts index d97360606..ee726cda7 100644 --- a/src/hooks/useAsyncZap.ts +++ b/src/hooks/useAsyncSwap.ts @@ -9,7 +9,7 @@ import { Address } from 'viem' import useDebounce from './useDebounce' import { AsyncSwapResponse } from '@/views/index-dtf/overview/components/async-swaps/types' -const useAsyncZap = ({ +const useAsyncSwap = ({ dtf, amountOut, slippage, @@ -83,10 +83,10 @@ const useAsyncZap = ({ return data }, enabled: !!endpoint && !disabled, - refetchInterval: 120000, + refetchInterval: false, retry: 3, retryDelay: (attempt) => Math.min(1000 * Math.pow(2, attempt), 10000), }) } -export default useAsyncZap +export default useAsyncSwap diff --git a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx index b3426505b..a2fd87cda 100644 --- a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx @@ -1,5 +1,5 @@ import Swap from '@/components/ui/swap' -import useAsyncZap from '@/hooks/useAsyncZap' +import useAsyncSwap from '@/hooks/useAsyncSwap' import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' @@ -58,7 +58,7 @@ const AsyncMint = () => { return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER }, [inputAmount]) - const { data, isLoading, isFetching, refetch, failureReason } = useAsyncZap({ + const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ dtf: indexDTF?.id, amountOut: parseEther(amountOut.toString()).toString(), slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, @@ -132,7 +132,7 @@ const AsyncMint = () => {
diff --git a/src/views/index-dtf/overview/components/async-swaps/atom.ts b/src/views/index-dtf/overview/components/async-swaps/atom.ts index 02770c061..68e79b110 100644 --- a/src/views/index-dtf/overview/components/async-swaps/atom.ts +++ b/src/views/index-dtf/overview/components/async-swaps/atom.ts @@ -1,3 +1,7 @@ import { atom } from 'jotai' +import { AsyncSwapOrderResponse } from './types' -export const asyncSwapResponseAtom = atom(undefined) +export const asyncSwapResponseAtom = atom( + undefined +) +export const asyncSwapOrderIdAtom = atom(undefined) diff --git a/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx b/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx index 63f47a944..b11bae134 100644 --- a/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx @@ -1,135 +1,111 @@ import TokenLogo from '@/components/token-logo' +import Help from '@/components/ui/help' import { cn } from '@/lib/utils' -import { ArrowLeftRight } from 'lucide-react' -import { Address } from 'viem' +import { chainIdAtom } from '@/state/atoms' +import { indexDTFBasketAtom } from '@/state/dtf/atoms' +import { formatCurrency } from '@/utils' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { useAtomValue } from 'jotai' +import { ArrowLeftRight, ArrowUpRight, Check, Loader } from 'lucide-react' +import { Link } from 'react-router-dom' +import { formatUnits } from 'viem' +import { asyncSwapResponseAtom } from './atom' -type CollateralsProps = { - orders?: { - address: Address - symbol: string - amount: string - value: string - status: 'Filled' | 'Not Filled' | 'Pending' - }[] +const STATUS_MAP = { + open: 'Processing', + scheduled: 'Processing', + active: 'Processing', + solved: 'Filled', + executing: 'Processing', + traded: 'Filled', + cancelled: 'Not Filled', } -const mockCollaterals = [ - { - address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf' as Address, - symbol: 'cbBTC', - amount: '0.0005', - value: '3.50', - status: 'Filled' as const, - }, - { - address: '0xCb327b99fF831bF8223cCEd12B1338FF3aA322Ff' as Address, - symbol: 'bsdETH', - amount: '0.001', - value: '3.20', - status: 'Pending' as const, - }, - { - address: '0x9B8Df6E244526ab5F6e6400d331DB28C8fdDdb55' as Address, - symbol: 'uSOL', - amount: '0.1', - value: '2.50', - status: 'Not Filled' as const, - }, - { - address: '0xd403D1624DAEF243FbcBd4A80d8A6F36afFe32b2' as Address, - symbol: 'uLINK', - amount: '0.5', - value: '2.00', - status: 'Filled' as const, - }, - { - address: '0xd6a34b430C05ac78c24985f8abEE2616BC1788Cb' as Address, - symbol: 'uAVAX', - amount: '0.1', - value: '1.80', - status: 'Pending' as const, - }, - { - address: '0x378c326A472915d38b2D8D41e1345987835FaB64' as Address, - symbol: 'uXLM', - amount: '10', - value: '1.50', - status: 'Not Filled' as const, - }, - { - address: '0xb0505e5a99abd03d94a1169e638B78EDfEd26ea4' as Address, - symbol: 'uSUI', - amount: '2', - value: '1.20', - status: 'Filled' as const, - }, - { - address: '0x0F813f4785b2360009F9aC9BF6121a85f109efc6' as Address, - symbol: 'uDOT', - amount: '1', - value: '1.00', - status: 'Pending' as const, - }, - { - address: '0x3EB097375fc2FC361e4a472f5E7067238c547c52' as Address, - symbol: 'uLTC', - amount: '0.05', - value: '0.80', - status: 'Not Filled' as const, - }, - { - address: '0x7bE0Cc2cADCD4A8f9901B4a66244DcDd9Bd02e0F' as Address, - symbol: 'uBCH', - amount: '0.05', - value: '0.70', - status: 'Filled' as const, - }, - { - address: '0xc3De830EA07524a0761646a6a4e4be0e114a3C83' as Address, - symbol: 'UNI', - amount: '1', - value: '0.50', - status: 'Pending' as const, - }, - { - address: '0x5ed25E305E08F58AFD7995EaC72563E6BE65A617' as Address, - symbol: 'uNEAR', - amount: '2', - value: '0.30', - status: 'Not Filled' as const, - }, -] +const Collaterals = () => { + const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + const chainId = useAtomValue(chainIdAtom) + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + + if (!asyncSwapResponse) return null + + const { cowswapOrders } = asyncSwapResponse -const Collaterals = ({ orders = mockCollaterals }: CollateralsProps) => { return ( -
- {orders.map((order) => ( -
+
+ {cowswapOrders.map(({ quote, status }) => ( +
token.address === quote.buyToken + )?.symbol || '' + } size="xl" />
- {order.amount} {order.symbol} + {formatCurrency( + Number( + formatUnits( + BigInt(quote.buyAmount), + indexDTFBasket?.find( + (token) => token.address === quote.buyToken + )?.decimals || 18 + ) + ), + 6 + )}{' '} + {indexDTFBasket?.find( + (token) => token.address === quote.buyToken + )?.symbol || ''}
- {order.value} USDC + + {formatCurrency( + Number(formatUnits(BigInt(quote.sellAmount), 6)) + )}{' '} + USDC +
- {order.status} + {STATUS_MAP[status.type] === 'Filled' && ( + + )} + {STATUS_MAP[status.type]} + {STATUS_MAP[status.type] === 'Not Filled' && ( + + )} + {STATUS_MAP[status.type] === 'Filled' && ( + + + + )} + {STATUS_MAP[status.type] === 'Processing' && ( + + )}
))} diff --git a/src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx b/src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx new file mode 100644 index 000000000..cb57e5698 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx @@ -0,0 +1,37 @@ +import { useQuery } from '@tanstack/react-query' +import { useAtomValue, useSetAtom } from 'jotai' +import { useEffect } from 'react' +import { RESERVE_API } from '@/utils/constants' +import { asyncSwapResponseAtom, asyncSwapOrderIdAtom } from './atom' +import { AsyncSwapOrderResponse } from './types' + +const OrderStatusUpdater = () => { + const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + const swapOrderId = + useAtomValue(asyncSwapOrderIdAtom) || 'e9fd5ecd-80dd-4c98-9749-d9e12eeccde3' + + const { data } = useQuery({ + queryKey: ['async-swap-order', swapOrderId], + queryFn: async () => { + if (!swapOrderId) return null + const response = await fetch( + `${RESERVE_API}async-swap/order?orderId=${swapOrderId}` + ) + if (!response.ok) throw new Error(`Error: ${response.status}`) + return response.json() as Promise + }, + enabled: !!swapOrderId, + refetchInterval: 10000, // Poll every 10 seconds + retry: false, + }) + + useEffect(() => { + if (data) { + setAsyncSwapResponse(data) + } + }, [data, setAsyncSwapResponse]) + + return null +} + +export default OrderStatusUpdater diff --git a/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx b/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx index 4bf86226b..d6ed96516 100644 --- a/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx +++ b/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx @@ -1,12 +1,12 @@ import { Button } from '@/components/ui/button' -import { AsyncSwapResponse } from './types' +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { RESERVE_API } from '@/utils/constants' +import { useAtomValue, useSetAtom } from 'jotai' import { useCallback, useState } from 'react' +import { Address, erc20Abi } from 'viem' import { useAccount, usePublicClient, useWalletClient } from 'wagmi' -import { chainIdAtom } from '@/state/atoms' -import { useAtomValue } from 'jotai' -import { RESERVE_API } from '@/utils/constants' -import { erc20Abi } from 'viem' -import { Address } from 'viem' +import { asyncSwapOrderIdAtom } from './atom' +import { AsyncSwapResponse } from './types' const COWSWAP_VAULT_RELAYER = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' @@ -30,8 +30,10 @@ const SubmitAsyncSwap = ({ const [isApproving, setIsApproving] = useState(false) const { address: signerAddress } = useAccount() const chainId = useAtomValue(chainIdAtom) + const account = useAtomValue(walletAtom) const publicClient = usePublicClient() const { data: walletClient } = useWalletClient() + const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) const approveVaultRelayer = useCallback(async () => { if (!signerAddress || !publicClient || !walletClient) return @@ -82,7 +84,14 @@ const SubmitAsyncSwap = ({ }, [signerAddress, publicClient, walletClient]) const handleSubmit = useCallback(async () => { - if (!cowswapQuotes?.length || !signerAddress || !chainId) return + if ( + !cowswapQuotes?.length || + !signerAddress || + !chainId || + !walletClient || + !account + ) + return setIsSigning(true) try { @@ -113,26 +122,34 @@ const SubmitAsyncSwap = ({ ], }, domain: { - name: 'CoW Protocol', + name: 'Gnosis Protocol', version: 'v2', - chainId: Number(chainId), + chainId: BigInt(chainId), verifyingContract: COWSWAP_SETTLEMENT, }, primaryType: 'Order', message: { ...quote.quote.quote, - feeAmount: '0', + sellAmount: BigInt(quote.quote.quote.sellAmount), + buyAmount: BigInt(quote.quote.quote.buyAmount), + feeAmount: 0n, }, - } - - const signature = await window.ethereum.request({ - method: 'eth_signTypedData_v4', - params: [signerAddress, JSON.stringify(typedData)], + } as const + + const signature = await walletClient.signTypedData({ + account, + domain: typedData.domain, + types: typedData.types, + primaryType: typedData.primaryType, + message: typedData.message, }) return { quote: quote.quote, - orderSigningResult: signature, + orderSigningResult: { + signature, + signingScheme: 'eip712', + }, } }) ) @@ -167,7 +184,11 @@ const SubmitAsyncSwap = ({ throw new Error(`HTTP error! status: ${response.status}`) } - console.log('Orders submitted successfully:', await response.json()) + const data = await response.json() + setAsyncSwapOrderId(data.swapOrderId) + console.log('swapOrderId', data.swapOrderId) + + console.log('Orders submitted successfully:', data) } catch (error) { console.error('Error processing orders:', error) } finally { diff --git a/src/views/index-dtf/overview/components/async-swaps/types.ts b/src/views/index-dtf/overview/components/async-swaps/types.ts index 5be9f2682..3082bba20 100644 --- a/src/views/index-dtf/overview/components/async-swaps/types.ts +++ b/src/views/index-dtf/overview/components/async-swaps/types.ts @@ -1,15 +1,17 @@ +import { Address, Hex } from 'viem' + export type AsyncSwapQuote = { token: string symbol: string quote: { quote: { - sellToken: string - buyToken: string - receiver: string + sellToken: Address + buyToken: Address + receiver: Address sellAmount: string buyAmount: string validTo: number - appData: string + appData: Hex feeAmount: string kind: string partiallyFillable: boolean @@ -25,6 +27,32 @@ export type AsyncSwapQuote = { } export type AsyncSwapResponse = { - universalQuotes: AsyncSwapQuote[] + universalQuotes: AsyncSwapQuote[] // TODO: review it cowswapQuotes: AsyncSwapQuote[] } + +export type AsyncSwapOrder = { + orderId: string + quote: AsyncSwapQuote['quote']['quote'] + status: { + type: + | 'open' + | 'scheduled' + | 'active' + | 'solved' + | 'executing' + | 'traded' + | 'cancelled' + } +} + +export type AsyncSwapOrderResponse = { + swapOrderId: string + chainId: number + signer: Address + dtf: Address + amountOut: string + universalOrders: AsyncSwapOrder[] // TODO: review it + cowswapOrders: AsyncSwapOrder[] + createdAt: string +} diff --git a/src/views/index-dtf/overview/components/zap-mint/index.tsx b/src/views/index-dtf/overview/components/zap-mint/index.tsx index 891878edd..311d2ac84 100644 --- a/src/views/index-dtf/overview/components/zap-mint/index.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/index.tsx @@ -38,6 +38,8 @@ import { Switch } from '@/components/ui/switch' import AsyncMint from '../async-swaps/async-mint' import AsyncRedeem from '../async-swaps/async-redeem' import Collaterals from '../async-swaps/collaterals' +import OrderStatusUpdater from '../async-swaps/order-status-updater' +import { cn } from '@/lib/utils' const ZapMint = ({ children }: { children: ReactNode }) => { const [open, setOpen] = useAtom(openZapMintModalAtom) @@ -85,7 +87,10 @@ const ZapMint = ({ children }: { children: ReactNode }) => { {children}
@@ -172,9 +177,12 @@ const ZapMint = ({ children }: { children: ReactNode }) => {
-
- -
+ {asyncZapMode && ( +
+ + +
+ )} ) From d4466345d99e1ec51dd3dc579c204ab31acdb598 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Fri, 2 May 2025 12:10:44 -0300 Subject: [PATCH 03/85] chore: wip redirect to manual mint when collaterals are acquired --- src/utils/index.ts | 32 +++++++++ .../auctions/components/proposal-trades.tsx | 34 +--------- src/views/index-dtf/issuance/manual/index.tsx | 14 ++++ .../async-swaps/async-mint/index.tsx | 18 +++-- .../async-swaps/collateral-acquisition.tsx | 66 +++++++++++++++++++ .../async-swaps/order-status-updater.tsx | 5 +- .../overview/components/zap-mint/index.tsx | 8 ++- 7 files changed, 133 insertions(+), 44 deletions(-) create mode 100644 src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx diff --git a/src/utils/index.ts b/src/utils/index.ts index 5f71d911c..5350e48de 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -353,3 +353,35 @@ export const max = (...args: bigint[]): bigint => { return args.reduce((max, curr) => (curr > max ? curr : max), 0n) } + +export function getTimerFormat(seconds: number) { + const timeUnits = { + days: 'd', + day: 'd', + hours: 'h', + hour: 'h', + minutes: 'm', + minute: 'm', + seconds: 's', + second: 's', + } + + let str = humanizeDuration(seconds * 1000, { + units: ['h', 'm', 's'], + round: true, + spacer: '', + delimiter: ' ', + }) + + // Replace all time unit words with their shortened versions + for (const [word, short] of Object.entries(timeUnits)) { + str = str.replace(word, short) + } + + // Ensure seconds are always shown + if (!str.includes('s')) { + str += ' 0s' + } + + return str +} diff --git a/src/views/index-dtf/auctions/components/proposal-trades.tsx b/src/views/index-dtf/auctions/components/proposal-trades.tsx index dc68e524a..7e2c38a0a 100644 --- a/src/views/index-dtf/auctions/components/proposal-trades.tsx +++ b/src/views/index-dtf/auctions/components/proposal-trades.tsx @@ -21,39 +21,7 @@ import { import AuctionList from './auction-list' import ProposalTradesSkeleton from './proposal-trades-skeleton' import AuctionProposedBasket from './auction-proposed-basket' - -function getTimerFormat(seconds: number) { - const timeUnits = { - days: 'd', - day: 'd', - hours: 'h', - hour: 'h', - minutes: 'm', - minute: 'm', - seconds: 's', - second: 's', - } - - let str = humanizeDuration(seconds * 1000, { - units: ['h', 'm', 's'], - round: true, - spacer: '', - delimiter: ' ', - }) - - // Replace all time unit words with their shortened versions - for (const [word, short] of Object.entries(timeUnits)) { - str = str.replace(word, short) - } - - // Ensure seconds are always shown - if (!str.includes('s')) { - str += ' 0s' - } - - return str -} - +import { getTimerFormat } from '@/utils' const Container = ({ children }: { children: React.ReactNode }) => { return (
diff --git a/src/views/index-dtf/issuance/manual/index.tsx b/src/views/index-dtf/issuance/manual/index.tsx index 1ec4b330f..61dc79b61 100644 --- a/src/views/index-dtf/issuance/manual/index.tsx +++ b/src/views/index-dtf/issuance/manual/index.tsx @@ -1,8 +1,22 @@ +import { useSetAtom } from 'jotai' import AssetList from './components/asset-list' import IndexManualIssuance from './components/index-manual-issuance' import Updater from './updater' +import { amountAtom } from './atoms' +import { useEffect } from 'react' +import { useSearchParams } from 'react-router-dom' const IndexDTFManualIssuance = () => { + const setAmount = useSetAtom(amountAtom) + const [searchParams] = useSearchParams() + const amountIn = searchParams.get('amountIn') + + useEffect(() => { + if (amountIn) { + setAmount(amountIn) + } + }, []) + return ( <>
diff --git a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx index a2fd87cda..e7fd381df 100644 --- a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx @@ -20,6 +20,8 @@ import { zapRefetchAtom, } from '../../zap-mint/atom' import SubmitAsyncSwap from '../submit-async-swap' +import { asyncSwapResponseAtom } from '../atom' +import CollateralAcquisition from '../collateral-acquisition' const ASYNC_SWAP_BUFFER = 0.005 @@ -39,6 +41,7 @@ const AsyncMint = () => { const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const insufficientBalance = parseUnits(inputAmount, selectedToken.decimals) > @@ -129,12 +132,15 @@ const AsyncMint = () => { loading={isLoading || loadingAfterRefetch} /> {/* {!!data && } */} - + {!asyncSwapResponse && ( + + )} + {asyncSwapResponse && }
) } diff --git a/src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx new file mode 100644 index 000000000..fedf32a97 --- /dev/null +++ b/src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx @@ -0,0 +1,66 @@ +import { useAtomValue } from 'jotai' +import { asyncSwapResponseAtom } from './atom' +import { Loader } from 'lucide-react' +import humanizeDuration from 'humanize-duration' +import { useEffect, useState } from 'react' +import { getFolioRoute, getTimerFormat } from '@/utils' +import { Link } from 'react-router-dom' +import { Button } from '@/components/ui/button' +import { chainIdAtom } from '@/state/atoms' +import { ROUTES } from '@/utils/constants' + +const CollateralAcquisition = ({ dtfAmount }: { dtfAmount: number }) => { + const chainId = useAtomValue(chainIdAtom) + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const [elapsedTime, setElapsedTime] = useState(0) + + useEffect(() => { + if (!asyncSwapResponse?.createdAt) return + + const interval = setInterval(() => { + const now = new Date() + const createdAt = new Date(asyncSwapResponse.createdAt) + const elapsed = now.getTime() - createdAt.getTime() + setElapsedTime(elapsed / 1000) + }, 1000) + + return () => clearInterval(interval) + }, [asyncSwapResponse?.createdAt]) + + if (!asyncSwapResponse) return null + + const hasAllCollaterals = asyncSwapResponse.cowswapOrders.every( + (order) => order.status.type === 'traded' || order.status.type === 'solved' + ) + + if (hasAllCollaterals) { + return ( + { const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - const swapOrderId = - useAtomValue(asyncSwapOrderIdAtom) || 'e9fd5ecd-80dd-4c98-9749-d9e12eeccde3' + const swapOrderId = useAtomValue(asyncSwapOrderIdAtom) const { data } = useQuery({ queryKey: ['async-swap-order', swapOrderId], @@ -21,7 +20,7 @@ const OrderStatusUpdater = () => { return response.json() as Promise }, enabled: !!swapOrderId, - refetchInterval: 10000, // Poll every 10 seconds + refetchInterval: 2000, // Poll every 2 seconds retry: false, }) diff --git a/src/views/index-dtf/overview/components/zap-mint/index.tsx b/src/views/index-dtf/overview/components/zap-mint/index.tsx index 311d2ac84..b23d9d33a 100644 --- a/src/views/index-dtf/overview/components/zap-mint/index.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/index.tsx @@ -40,6 +40,7 @@ import AsyncRedeem from '../async-swaps/async-redeem' import Collaterals from '../async-swaps/collaterals' import OrderStatusUpdater from '../async-swaps/order-status-updater' import { cn } from '@/lib/utils' +import { asyncSwapResponseAtom } from '../async-swaps/atom' const ZapMint = ({ children }: { children: ReactNode }) => { const [open, setOpen] = useAtom(openZapMintModalAtom) @@ -53,6 +54,7 @@ const ZapMint = ({ children }: { children: ReactNode }) => { const zapFetching = useAtomValue(zapFetchingAtom) const zapOngoingTx = useAtomValue(zapOngoingTxAtom) const input = useAtomValue(zapMintInputAtom) + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 @@ -88,8 +90,10 @@ const ZapMint = ({ children }: { children: ReactNode }) => {
From cef56ff96efccebff386dbf89a78c0ca0f34686e Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 10:27:02 -0300 Subject: [PATCH 04/85] feat: add automated sub navigation menu --- src/app-routes.tsx | 2 + src/hooks/useAsyncSwap.ts | 2 +- .../index-dtf/components/navigation/index.tsx | 87 ++++++++++++++----- .../async-swaps/async-mint/index.tsx | 4 +- .../async-swaps/async-redeem/index.tsx | 10 ++- .../async-swaps/atom.ts | 0 .../async-swaps/collateral-acquisition.tsx | 0 .../async-swaps/collaterals.tsx | 0 .../index-dtf/issuance/async-swaps/index.tsx | 5 ++ .../async-swaps/order-status-updater.tsx | 0 .../async-swaps/submit-async-swap.tsx | 1 - .../async-swaps/types.ts | 0 src/views/index-dtf/issuance/index.tsx | 4 +- .../overview/components/zap-mint/index.tsx | 10 +-- 14 files changed, 90 insertions(+), 35 deletions(-) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/async-mint/index.tsx (96%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/async-redeem/index.tsx (93%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/atom.ts (100%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/collateral-acquisition.tsx (100%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/collaterals.tsx (100%) create mode 100644 src/views/index-dtf/issuance/async-swaps/index.tsx rename src/views/index-dtf/{overview/components => issuance}/async-swaps/order-status-updater.tsx (100%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/submit-async-swap.tsx (99%) rename src/views/index-dtf/{overview/components => issuance}/async-swaps/types.ts (100%) diff --git a/src/app-routes.tsx b/src/app-routes.tsx index a9aa3a2f6..c55e78182 100644 --- a/src/app-routes.tsx +++ b/src/app-routes.tsx @@ -36,6 +36,7 @@ import IndexDTFSettings from './views/index-dtf/settings' import AllYieldDTFList from './views/tokens/Tokens' import DeployComingSoon from './views/index-dtf/deploy/components/deploy-coming-soon' import IndexDTFWhitelistProposal from './views/index-dtf/governance/views/propose/vault' +import AsyncSwaps from './views/index-dtf/issuance/async-swaps' // TODO: Remove terms! // TODO: Fix recoll call on yield dtf auction page @@ -81,6 +82,7 @@ const AppRoutes = () => ( path={`${ROUTES.ISSUANCE}/manual`} element={} /> + } /> } /> } /> } /> diff --git a/src/hooks/useAsyncSwap.ts b/src/hooks/useAsyncSwap.ts index ee726cda7..df38f9e28 100644 --- a/src/hooks/useAsyncSwap.ts +++ b/src/hooks/useAsyncSwap.ts @@ -7,7 +7,7 @@ import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useEffect, useMemo } from 'react' import { Address } from 'viem' import useDebounce from './useDebounce' -import { AsyncSwapResponse } from '@/views/index-dtf/overview/components/async-swaps/types' +import { AsyncSwapResponse } from '@/views/index-dtf/issuance/async-swaps/types' const useAsyncSwap = ({ dtf, diff --git a/src/views/index-dtf/components/navigation/index.tsx b/src/views/index-dtf/components/navigation/index.tsx index e960e6333..2089e6d95 100644 --- a/src/views/index-dtf/components/navigation/index.tsx +++ b/src/views/index-dtf/components/navigation/index.tsx @@ -11,42 +11,75 @@ import { Fingerprint, } from 'lucide-react' import { useMemo } from 'react' -import { NavLink } from 'react-router-dom' +import { NavLink, useLocation } from 'react-router-dom' const NavigationItem = ({ icon, label, route, + subItems, }: { icon: React.ReactNode label: string route: string + subItems?: { + label: string + route: string + }[] }) => { + const { pathname } = useLocation() return ( - - {({ isActive }) => ( -
- {/*
+ + {({ isActive }) => ( +
*/} -
- {icon} + > +
+ {icon} +
+
{label}
- {/*
*/} -
{label}
+ )} +
+ {subItems && ( +
+ {subItems.map((item) => { + const hasMoreThanOneActiveSubItem = + subItems?.filter((item) => pathname.includes(item.route)).length > + 1 + return ( + + {({ isActive }) => { + const isLikeMainItem = isActive && route === item.route + const _isActive = + isActive && + (!isLikeMainItem || !hasMoreThanOneActiveSubItem) + return ( +
+ {_isActive && ( +
+ )} + {item.label} +
+ ) + }} + + ) + })}
)} -
+
) } @@ -64,6 +97,20 @@ const NavigationItems = () => { icon: , label: t`Mint + Redeem`, route: ROUTES.ISSUANCE, + subItems: [ + { + label: t`Zap Swap`, + route: ROUTES.ISSUANCE, + }, + { + label: t`Automated`, + route: ROUTES.ISSUANCE + '/automated', + }, + { + label: t`BYO Collateral`, + route: ROUTES.ISSUANCE + '/manual', + }, + ], }, { icon: , diff --git a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx similarity index 96% rename from src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx rename to src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index e7fd381df..0da694fe9 100644 --- a/src/views/index-dtf/overview/components/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -7,7 +7,7 @@ import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect, useMemo } from 'react' import { parseEther, parseUnits } from 'viem' -import useLoadingAfterRefetch from '../../hooks/useLoadingAfterRefetch' +import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { currentZapMintTabAtom, openZapMintModalAtom, @@ -18,7 +18,7 @@ import { zapMintInputAtom, zapOngoingTxAtom, zapRefetchAtom, -} from '../../zap-mint/atom' +} from '../../../overview/components/zap-mint/atom' import SubmitAsyncSwap from '../submit-async-swap' import { asyncSwapResponseAtom } from '../atom' import CollateralAcquisition from '../collateral-acquisition' diff --git a/src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx similarity index 93% rename from src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx rename to src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 6e5239cd1..4c0f5e326 100644 --- a/src/views/index-dtf/overview/components/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -5,7 +5,7 @@ import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect } from 'react' import { formatEther, formatUnits, parseEther } from 'viem' -import useLoadingAfterRefetch from '../../hooks/useLoadingAfterRefetch' +import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { currentZapMintTabAtom, forceMintAtom, @@ -19,9 +19,11 @@ import { zapMintInputAtom, zapOngoingTxAtom, zapRefetchAtom, -} from '../../zap-mint/atom' -import SubmitZap from '../../zap-mint/submit-zap' -import ZapDetails, { ZapPriceImpact } from '../../zap-mint/zap-details' +} from '../../../overview/components/zap-mint/atom' +import SubmitZap from '../../../overview/components/zap-mint/submit-zap' +import ZapDetails, { + ZapPriceImpact, +} from '../../../overview/components/zap-mint/zap-details' const AsyncRedeem = () => { const indexDTF = useAtomValue(indexDTFAtom) diff --git a/src/views/index-dtf/overview/components/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts similarity index 100% rename from src/views/index-dtf/overview/components/async-swaps/atom.ts rename to src/views/index-dtf/issuance/async-swaps/atom.ts diff --git a/src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx similarity index 100% rename from src/views/index-dtf/overview/components/async-swaps/collateral-acquisition.tsx rename to src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx diff --git a/src/views/index-dtf/overview/components/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx similarity index 100% rename from src/views/index-dtf/overview/components/async-swaps/collaterals.tsx rename to src/views/index-dtf/issuance/async-swaps/collaterals.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx new file mode 100644 index 000000000..d2488e3d8 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -0,0 +1,5 @@ +const AsyncSwaps = () => { + return
AsyncSwaps
+} + +export default AsyncSwaps diff --git a/src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx b/src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx similarity index 100% rename from src/views/index-dtf/overview/components/async-swaps/order-status-updater.tsx rename to src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx diff --git a/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx similarity index 99% rename from src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx rename to src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx index d6ed96516..4fd6c1c6c 100644 --- a/src/views/index-dtf/overview/components/async-swaps/submit-async-swap.tsx +++ b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx @@ -95,7 +95,6 @@ const SubmitAsyncSwap = ({ setIsSigning(true) try { - // 1. Sign CoWSwap quotes const signedCowswapOrders = await Promise.all( cowswapQuotes.map(async (quote) => { const typedData = { diff --git a/src/views/index-dtf/overview/components/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts similarity index 100% rename from src/views/index-dtf/overview/components/async-swaps/types.ts rename to src/views/index-dtf/issuance/async-swaps/types.ts diff --git a/src/views/index-dtf/issuance/index.tsx b/src/views/index-dtf/issuance/index.tsx index 981fb11c0..adfea615d 100644 --- a/src/views/index-dtf/issuance/index.tsx +++ b/src/views/index-dtf/issuance/index.tsx @@ -135,10 +135,10 @@ const IndexDTFIssuance = () => { className="mx-auto" onClick={() => trackClick('switch_to_manual')} > - + Having issues? Switch to manual{' '} {currentTab === 'buy' ? 'minting' : 'redeeming'} - +
diff --git a/src/views/index-dtf/overview/components/zap-mint/index.tsx b/src/views/index-dtf/overview/components/zap-mint/index.tsx index b23d9d33a..a02466b2c 100644 --- a/src/views/index-dtf/overview/components/zap-mint/index.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/index.tsx @@ -35,12 +35,12 @@ import ZapSettings from './zap-settings' import Help from '@/components/ui/help' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' -import AsyncMint from '../async-swaps/async-mint' -import AsyncRedeem from '../async-swaps/async-redeem' -import Collaterals from '../async-swaps/collaterals' -import OrderStatusUpdater from '../async-swaps/order-status-updater' +import AsyncMint from '../../../issuance/async-swaps/async-mint' +import AsyncRedeem from '../../../issuance/async-swaps/async-redeem' +import Collaterals from '../../../issuance/async-swaps/collaterals' +import OrderStatusUpdater from '../../../issuance/async-swaps/order-status-updater' import { cn } from '@/lib/utils' -import { asyncSwapResponseAtom } from '../async-swaps/atom' +import { asyncSwapResponseAtom } from '../../../issuance/async-swaps/atom' const ZapMint = ({ children }: { children: ReactNode }) => { const [open, setOpen] = useAtom(openZapMintModalAtom) From 992cc544e341684170014289ccc8bca56ea6f6ea Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 10:34:14 -0300 Subject: [PATCH 05/85] chore: restore zap-mint/index --- .../index-dtf/issuance/async-swaps/index.tsx | 141 +++++++++++++++- .../overview/components/zap-mint/index.tsx | 153 ++++++------------ 2 files changed, 193 insertions(+), 101 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index d2488e3d8..d11c06a24 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -1,5 +1,144 @@ +import { Button } from '@/components/ui/button' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import useERC20Balance from '@/hooks/useERC20Balance' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { ArrowLeft, Settings } from 'lucide-react' +import { useEffect } from 'react' +import { Link } from 'react-router-dom' +import useTrackIndexDTFPage, { + useTrackIndexDTFClick, +} from '../../hooks/useTrackIndexDTFPage' +import { + currentZapMintTabAtom, + defaultSelectedTokenAtom, + indexDTFBalanceAtom, + selectedTokenAtom, + showZapSettingsAtom, + tokensAtom, + zapFetchingAtom, + zapMintInputAtom, + zapOngoingTxAtom, + zapRefetchAtom, +} from '../../overview/components/zap-mint/atom' +import Buy from '../../overview/components/zap-mint/buy' +import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' +import Sell from '../../overview/components/zap-mint/sell' +import ZapSettings from '../../overview/components/zap-mint/zap-settings' +import LowLiquidityWarning from '../../overview/components/zap-mint/low-liquidity-warning' +import OrderStatusUpdater from './order-status-updater' +import Collaterals from './collaterals' +import AsyncMint from './async-mint' +import AsyncRedeem from './async-redeem' + const AsyncSwaps = () => { - return
AsyncSwaps
+ useTrackIndexDTFPage('mint') + const [currentTab, setCurrentTab] = useAtom(currentZapMintTabAtom) + const [showSettings, setShowSettings] = useAtom(showZapSettingsAtom) + const defaultToken = useAtomValue(defaultSelectedTokenAtom) + const setSelectedToken = useSetAtom(selectedTokenAtom) + const tokens = useAtomValue(tokensAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const zapRefetch = useAtomValue(zapRefetchAtom) + const zapFetching = useAtomValue(zapFetchingAtom) + const zapOngoingTx = useAtomValue(zapOngoingTxAtom) + const input = useAtomValue(zapMintInputAtom) + const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) + const invalidInput = isNaN(Number(input)) || Number(input) === 0 + + const { data: balance } = useERC20Balance(indexDTF?.id) + const { trackClick } = useTrackIndexDTFClick('overview', 'mint') + + useEffect(() => { + setIndexDTFBalance(balance || 0n) + }, [balance, setIndexDTFBalance]) + + const reset = () => { + setShowSettings(false) + setSelectedToken(defaultToken) + } + + const changeTab = (tab: string) => { + setCurrentTab(tab as 'buy' | 'sell') + setSelectedToken(tab === 'buy' ? tokens[0] : tokens[1]) + } + + useEffect(() => { + return () => { + reset() + } + }, []) + + if (!indexDTF) return null + + return ( +
+
+
+ +
+ {showSettings ? ( + + ) : ( + <> + + Buy + Sell + +
+ + +
+ + )} +
+ {showSettings && ( +
+ +
+ )} + +
+
+ + + + + + + +
+
+
+
+
+
+ + +
+
+ ) } export default AsyncSwaps diff --git a/src/views/index-dtf/overview/components/zap-mint/index.tsx b/src/views/index-dtf/overview/components/zap-mint/index.tsx index a02466b2c..639e33467 100644 --- a/src/views/index-dtf/overview/components/zap-mint/index.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/index.tsx @@ -15,7 +15,6 @@ import { ArrowLeft, Settings, X } from 'lucide-react' import { ReactNode, useEffect } from 'react' import { Link } from 'react-router-dom' import { - asyncZapModeAtom, currentZapMintTabAtom, defaultSelectedTokenAtom, indexDTFBalanceAtom, @@ -32,20 +31,10 @@ import LowLiquidityWarning from './low-liquidity-warning' import RefreshQuote from './refresh-quote' import Sell from './sell' import ZapSettings from './zap-settings' -import Help from '@/components/ui/help' -import { Label } from '@/components/ui/label' -import { Switch } from '@/components/ui/switch' -import AsyncMint from '../../../issuance/async-swaps/async-mint' -import AsyncRedeem from '../../../issuance/async-swaps/async-redeem' -import Collaterals from '../../../issuance/async-swaps/collaterals' -import OrderStatusUpdater from '../../../issuance/async-swaps/order-status-updater' -import { cn } from '@/lib/utils' -import { asyncSwapResponseAtom } from '../../../issuance/async-swaps/atom' const ZapMint = ({ children }: { children: ReactNode }) => { const [open, setOpen] = useAtom(openZapMintModalAtom) const currentTab = useAtomValue(currentZapMintTabAtom) - const [asyncZapMode, setAsyncZapMode] = useAtom(asyncZapModeAtom) const [showSettings, setShowSettings] = useAtom(showZapSettingsAtom) const defaultToken = useAtomValue(defaultSelectedTokenAtom) const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom) @@ -54,7 +43,6 @@ const ZapMint = ({ children }: { children: ReactNode }) => { const zapFetching = useAtomValue(zapFetchingAtom) const zapOngoingTx = useAtomValue(zapOngoingTxAtom) const input = useAtomValue(zapMintInputAtom) - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 @@ -89,104 +77,69 @@ const ZapMint = ({ children }: { children: ReactNode }) => { {children} -
- - {showSettings ? ( + + {showSettings ? ( + + ) : ( +
- ) : ( -
- - { - trackClick('zap_refresh', tokenIn.symbol, tokenOut.symbol) - zapRefetch.fn?.() - }} - loading={zapFetching} - disabled={zapFetching || zapOngoingTx || invalidInput} - /> -
- )} -
- - { + trackClick('zap_refresh', tokenIn.symbol, tokenOut.symbol) + zapRefetch.fn?.() + }} + loading={zapFetching} + disabled={zapFetching || zapOngoingTx || invalidInput} />
- - - - - {showSettings && } -
-
- - {!asyncZapMode && (currentTab === 'buy' ? : )} - {asyncZapMode && - (currentTab === 'buy' ? : )} -
-
-
- - Having issues minting? (Zaps are in beta) - - Wait and try again or{' '} - - switch to manual {currentTab === 'buy' ? 'minting' : 'redeeming'} - + )} + + + + + {showSettings && } +
+
+ + {currentTab === 'buy' ? : }
- {asyncZapMode && ( -
- - -
- )} +
+ + Having issues minting? (Zaps are in beta) + + Wait and try again or{' '} + + switch to manual {currentTab === 'buy' ? 'minting' : 'redeeming'} + +
) From d7dc7dac788cf7cc10451f2b68a3e4564cb8ce0d Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 10:35:41 -0300 Subject: [PATCH 06/85] chore: restore zap-mint/atom.ts --- src/views/index-dtf/overview/components/zap-mint/atom.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/views/index-dtf/overview/components/zap-mint/atom.ts b/src/views/index-dtf/overview/components/zap-mint/atom.ts index c34c00c4b..406110308 100644 --- a/src/views/index-dtf/overview/components/zap-mint/atom.ts +++ b/src/views/index-dtf/overview/components/zap-mint/atom.ts @@ -6,7 +6,6 @@ import { atomWithReset } from 'jotai/utils' export const openZapMintModalAtom = atom(false) export const currentZapMintTabAtom = atom<'buy' | 'sell'>('buy') -export const asyncZapModeAtom = atom(false) export const showZapSettingsAtom = atom(false) export const zapMintInputAtom = atomWithReset('') export const indexDTFBalanceAtom = atom(0n) @@ -17,15 +16,8 @@ export const defaultSelectedTokenAtom = atom((get) => { return reducedZappableTokens[chainId][0] }) export const selectedTokenOrDefaultAtom = atom((get) => { - const asyncZapMode = get(asyncZapModeAtom) const selectedToken = get(selectedTokenAtom) const defaultToken = get(defaultSelectedTokenAtom) - - if (asyncZapMode) { - const chainId = get(chainIdAtom) - return reducedZappableTokens[chainId][2] // USDC - } - return selectedToken || defaultToken }) From c0f2341de79465f6dc33858da45c89427e62bc5b Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 10:46:09 -0300 Subject: [PATCH 07/85] chore: split automated swaps --- src/hooks/useAsyncSwap.ts | 8 ++-- .../issuance/async-swaps/async-mint/index.tsx | 37 ++++++++-------- .../index-dtf/issuance/async-swaps/atom.ts | 36 ++++++++++++++++ .../index-dtf/issuance/async-swaps/index.tsx | 43 ++++++++++--------- 4 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/hooks/useAsyncSwap.ts b/src/hooks/useAsyncSwap.ts index df38f9e28..5c6a69d33 100644 --- a/src/hooks/useAsyncSwap.ts +++ b/src/hooks/useAsyncSwap.ts @@ -1,13 +1,13 @@ import { chainIdAtom, walletAtom } from '@/state/atoms' import { RESERVE_API } from '@/utils/constants' -import { zapSwapEndpointAtom } from '@/views/index-dtf/overview/components/zap-mint/atom' +import { asyncSwapEndpointAtom } from '@/views/index-dtf/issuance/async-swaps/atom' +import { AsyncSwapResponse } from '@/views/index-dtf/issuance/async-swaps/types' import { useQuery } from '@tanstack/react-query' import { useAtomValue, useSetAtom } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useEffect, useMemo } from 'react' import { Address } from 'viem' import useDebounce from './useDebounce' -import { AsyncSwapResponse } from '@/views/index-dtf/issuance/async-swaps/types' const useAsyncSwap = ({ dtf, @@ -26,7 +26,7 @@ const useAsyncSwap = ({ }) => { const chainId = useAtomValue(chainIdAtom) const account = useAtomValue(walletAtom) - const setZapSwapEndpoint = useSetAtom(zapSwapEndpointAtom) + const setAsyncSwapEndpoint = useSetAtom(asyncSwapEndpointAtom) const getEndpoint = () => !dtf || isNaN(Number(amountOut)) || Number(amountOut) === 0 @@ -42,7 +42,7 @@ const useAsyncSwap = ({ ) useEffect(() => { - setZapSwapEndpoint(endpoint ?? '') + setAsyncSwapEndpoint(endpoint ?? '') }, [endpoint]) return useQuery({ diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index 0da694fe9..58aca69f1 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -9,19 +9,18 @@ import { useCallback, useEffect, useMemo } from 'react' import { parseEther, parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { - currentZapMintTabAtom, - openZapMintModalAtom, + asyncSwapFetchingAtom, + asyncSwapInputAtom, + asyncSwapOngoingTxAtom, + asyncSwapRefetchAtom, + asyncSwapResponseAtom, + currentAsyncSwapTabAtom, selectedTokenBalanceAtom, selectedTokenOrDefaultAtom, slippageAtom, - zapFetchingAtom, - zapMintInputAtom, - zapOngoingTxAtom, - zapRefetchAtom, -} from '../../../overview/components/zap-mint/atom' -import SubmitAsyncSwap from '../submit-async-swap' -import { asyncSwapResponseAtom } from '../atom' +} from '../atom' import CollateralAcquisition from '../collateral-acquisition' +import SubmitAsyncSwap from '../submit-async-swap' const ASYNC_SWAP_BUFFER = 0.005 @@ -29,15 +28,14 @@ const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) const dtfPrice = useAtomValue(indexDTFPriceAtom) - const [inputAmount, setInputAmount] = useAtom(zapMintInputAtom) + const [inputAmount, setInputAmount] = useAtom(asyncSwapInputAtom) const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const slippage = useAtomValue(slippageAtom) - const [ongoingTx, setOngoingTx] = useAtom(zapOngoingTxAtom) - const setZapRefetch = useSetAtom(zapRefetchAtom) - const setZapFetching = useSetAtom(zapFetchingAtom) - const setCurrentTab = useSetAtom(currentZapMintTabAtom) - const setOpen = useSetAtom(openZapMintModalAtom) + const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) + const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) + const setAsyncSwapFetching = useSetAtom(asyncSwapFetchingAtom) + const setCurrentTab = useSetAtom(currentAsyncSwapTabAtom) const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') @@ -89,12 +87,12 @@ const AsyncMint = () => { } useEffect(() => { - setZapRefetch({ fn: refetch }) - }, [refetch, setZapRefetch]) + setAsyncSwapRefetch({ fn: refetch }) + }, [refetch, setAsyncSwapRefetch]) useEffect(() => { - setZapFetching(fetchingZapper) - }, [fetchingZapper, setZapFetching]) + setAsyncSwapFetching(fetchingZapper) + }, [fetchingZapper, setAsyncSwapFetching]) useEffect(() => { setOngoingTx(false) @@ -103,7 +101,6 @@ const AsyncMint = () => { const onSuccess = useCallback(() => { setInputAmount('') - setOpen(false) }, []) if (!indexDTF) return null diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 68e79b110..ff8c94a1c 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -1,7 +1,43 @@ import { atom } from 'jotai' import { AsyncSwapOrderResponse } from './types' +import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' +import { Token } from '@/types' +import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' +import { atomWithReset } from 'jotai/utils' export const asyncSwapResponseAtom = atom( undefined ) export const asyncSwapOrderIdAtom = atom(undefined) + +export const currentAsyncSwapTabAtom = atom<'buy' | 'sell'>('buy') +export const showAsyncSwapSettingsAtom = atom(false) +export const asyncSwapInputAtom = atomWithReset('') +export const indexDTFBalanceAtom = atom(0n) + +export const selectedTokenAtom = atom(undefined) +export const defaultSelectedTokenAtom = atom((get) => { + const chainId = get(chainIdAtom) + return reducedZappableTokens[chainId][2] // USDC +}) +export const selectedTokenOrDefaultAtom = atom((get) => { + const chainId = get(chainIdAtom) + return reducedZappableTokens[chainId][2] // USDC +}) + +export const selectedTokenBalanceAtom = atom( + (get) => { + const balances = get(balancesAtom) + const token = get(selectedTokenOrDefaultAtom) + return balances[token.address] + } +) + +export const slippageAtom = atomWithReset('100') +export const forceMintAtom = atomWithReset(false) +export const asyncSwapRefetchAtom = atom<{ fn: () => void }>({ fn: () => {} }) +export const asyncSwapFetchingAtom = atom(false) +export const asyncSwapOngoingTxAtom = atom(false) +export const asyncSwapEndpointAtom = atom('') +export const asyncSwapPriceImpactWarningCheckboxAtom = atom(false) +export const asyncSwapHighPriceImpactAtom = atom(false) diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index d11c06a24..42f87a55b 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -5,44 +5,43 @@ import { indexDTFAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' -import { Link } from 'react-router-dom' import useTrackIndexDTFPage, { useTrackIndexDTFClick, } from '../../hooks/useTrackIndexDTFPage' import { - currentZapMintTabAtom, defaultSelectedTokenAtom, indexDTFBalanceAtom, selectedTokenAtom, - showZapSettingsAtom, tokensAtom, - zapFetchingAtom, - zapMintInputAtom, - zapOngoingTxAtom, - zapRefetchAtom, } from '../../overview/components/zap-mint/atom' -import Buy from '../../overview/components/zap-mint/buy' +import LowLiquidityWarning from '../../overview/components/zap-mint/low-liquidity-warning' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' -import Sell from '../../overview/components/zap-mint/sell' import ZapSettings from '../../overview/components/zap-mint/zap-settings' -import LowLiquidityWarning from '../../overview/components/zap-mint/low-liquidity-warning' -import OrderStatusUpdater from './order-status-updater' -import Collaterals from './collaterals' import AsyncMint from './async-mint' import AsyncRedeem from './async-redeem' +import { + asyncSwapFetchingAtom, + asyncSwapInputAtom, + asyncSwapOngoingTxAtom, + asyncSwapRefetchAtom, + currentAsyncSwapTabAtom, + showAsyncSwapSettingsAtom, +} from './atom' +import Collaterals from './collaterals' +import OrderStatusUpdater from './order-status-updater' const AsyncSwaps = () => { useTrackIndexDTFPage('mint') - const [currentTab, setCurrentTab] = useAtom(currentZapMintTabAtom) - const [showSettings, setShowSettings] = useAtom(showZapSettingsAtom) + const [currentTab, setCurrentTab] = useAtom(currentAsyncSwapTabAtom) + const [showSettings, setShowSettings] = useAtom(showAsyncSwapSettingsAtom) const defaultToken = useAtomValue(defaultSelectedTokenAtom) const setSelectedToken = useSetAtom(selectedTokenAtom) const tokens = useAtomValue(tokensAtom) const indexDTF = useAtomValue(indexDTFAtom) - const zapRefetch = useAtomValue(zapRefetchAtom) - const zapFetching = useAtomValue(zapFetchingAtom) - const zapOngoingTx = useAtomValue(zapOngoingTxAtom) - const input = useAtomValue(zapMintInputAtom) + const asyncSwapRefetch = useAtomValue(asyncSwapRefetchAtom) + const asyncSwapFetching = useAtomValue(asyncSwapFetchingAtom) + const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) + const input = useAtomValue(asyncSwapInputAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 @@ -105,9 +104,11 @@ const AsyncSwaps = () => {
From 9dc42819bff4b98eb56e261b3b6e652eb84c9d22 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 12:03:20 -0300 Subject: [PATCH 08/85] feat: add gnosis safe required modal --- src/state/chain/atoms/chainAtoms.ts | 1 + src/state/chain/updaters/AtomUpdater.tsx | 24 ++++ .../async-swaps/gnosis-safe-required.tsx | 114 ++++++++++++++++++ .../index-dtf/issuance/async-swaps/index.tsx | 22 ++-- 4 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx diff --git a/src/state/chain/atoms/chainAtoms.ts b/src/state/chain/atoms/chainAtoms.ts index b4a5c1914..51d8e6b59 100644 --- a/src/state/chain/atoms/chainAtoms.ts +++ b/src/state/chain/atoms/chainAtoms.ts @@ -18,6 +18,7 @@ export const timestampAtom = atom(getCurrentTime()) export const debouncedBlockAtom = atom(undefined) export const walletAtom = atom
(null) +export const isSafeMultisigAtom = atom(false) export const walletChainAtom = atom(undefined) export const isWalletInvalidAtom = atom((get) => { const chainId = get(chainIdAtom) diff --git a/src/state/chain/updaters/AtomUpdater.tsx b/src/state/chain/updaters/AtomUpdater.tsx index 8432f3b00..8034e99db 100644 --- a/src/state/chain/updaters/AtomUpdater.tsx +++ b/src/state/chain/updaters/AtomUpdater.tsx @@ -8,11 +8,13 @@ import { blockTimestampAtom, chainIdAtom, debouncedBlockAtom, + isSafeMultisigAtom, timestampAtom, walletAtom, walletChainAtom, } from 'state/atoms' import { useAccount, useBlockNumber, usePublicClient } from 'wagmi' +import { Address } from 'viem' // Keep web3 state in sync with atoms const AtomUpdater = () => { @@ -21,6 +23,7 @@ const AtomUpdater = () => { // Setters const setWallet = useSetAtom(walletAtom) const setWalletChain = useSetAtom(walletChainAtom) + const setIsSafeMultisig = useSetAtom(isSafeMultisigAtom) const setBlockNumber = useSetAtom(blockAtom) const chainId = useAtomValue(chainIdAtom) const { data: blockNumber } = useBlockNumber({ watch: true, chainId }) @@ -57,9 +60,30 @@ const AtomUpdater = () => { mixpanel.register({ wa: account.address, }) + // Check if the wallet is a Safe Multisig + const checkIfSafe = async () => { + try { + if (!client) return + // Safe contracts have a specific bytecode pattern + const code = await client.getCode({ + address: account.address as Address, + }) + // If code is undefined or '0x', it's not a contract + const isSafe = + typeof code === 'string' && code !== '0x' && code.length > 2 + setIsSafeMultisig(isSafe) + console.log('Is Safe Multisig:', isSafe) + } catch (e) { + console.log('Error checking if wallet is Safe:', e) + setIsSafeMultisig(false) + } + } + + checkIfSafe() } else { setWallet(null) setWalletChain(undefined) + setIsSafeMultisig(false) } }, [account?.address, account?.chainId]) diff --git a/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx b/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx new file mode 100644 index 000000000..fffae6843 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx @@ -0,0 +1,114 @@ +import { Button } from '@/components/ui/button' +import Help from '@/components/ui/help' +import { useConnectModal } from '@rainbow-me/rainbowkit' +import { ArrowUpRightIcon, OctagonAlert } from 'lucide-react' +import { useDisconnect, useAccount } from 'wagmi' +import { useEffect, useState } from 'react' + +const GnosisSafeIcon = () => ( + + + +) +const GnosisSafeRequired = () => { + const { openConnectModal } = useConnectModal() + const { disconnect } = useDisconnect() + const { isConnected } = useAccount() + const [shouldOpenModal, setShouldOpenModal] = useState(false) + + useEffect(() => { + if (shouldOpenModal && !isConnected && openConnectModal) { + openConnectModal() + setShouldOpenModal(false) + } + }, [shouldOpenModal, isConnected, openConnectModal]) + + const handleSwitchWallet = async () => { + try { + setShouldOpenModal(true) + await disconnect() + } catch (error) { + console.error('Error switching wallets:', error) + setShouldOpenModal(false) + } + } + + return ( +
+
+
+
+ CoW Protocol + Universal Protocol +
+
+ +
Gnosis Safe Required
+ +
+
+
+
+ Get better prices by accessing off-chain liquidity +
+
+ Automated Slow Mints can provide better quotes for minting or + redeeming a DTF, particularly when dealing with significant amounts + of capital or DTFs that involve bridged or low DEX liquidity + collateral assets. +
+
+
+
+ + +
+ +
Deploy new Gnosis Safe
+
+
+ +
+
+
+
+ ) +} + +export default GnosisSafeRequired diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 42f87a55b..edeaed0c9 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -5,9 +5,7 @@ import { indexDTFAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' -import useTrackIndexDTFPage, { - useTrackIndexDTFClick, -} from '../../hooks/useTrackIndexDTFPage' +import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' import { defaultSelectedTokenAtom, indexDTFBalanceAtom, @@ -29,9 +27,12 @@ import { } from './atom' import Collaterals from './collaterals' import OrderStatusUpdater from './order-status-updater' +import { isSafeMultisigAtom } from '@/state/atoms' +import GnosisSafeRequired from './gnosis-safe-required' const AsyncSwaps = () => { - useTrackIndexDTFPage('mint') + useTrackIndexDTFPage('mint-async-swap') + const isSafeMultisig = useAtomValue(isSafeMultisigAtom) const [currentTab, setCurrentTab] = useAtom(currentAsyncSwapTabAtom) const [showSettings, setShowSettings] = useAtom(showAsyncSwapSettingsAtom) const defaultToken = useAtomValue(defaultSelectedTokenAtom) @@ -46,7 +47,6 @@ const AsyncSwaps = () => { const invalidInput = isNaN(Number(input)) || Number(input) === 0 const { data: balance } = useERC20Balance(indexDTF?.id) - const { trackClick } = useTrackIndexDTFClick('overview', 'mint') useEffect(() => { setIndexDTFBalance(balance || 0n) @@ -70,10 +70,18 @@ const AsyncSwaps = () => { if (!indexDTF) return null + if (!isSafeMultisig) { + return ( +
+ +
+ ) + } + return ( -
+
-
+
Date: Mon, 5 May 2025 16:11:19 -0300 Subject: [PATCH 09/85] chore: change navigation side panel --- .../index-dtf/components/navigation/index.tsx | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/views/index-dtf/components/navigation/index.tsx b/src/views/index-dtf/components/navigation/index.tsx index 2089e6d95..bc94c7b46 100644 --- a/src/views/index-dtf/components/navigation/index.tsx +++ b/src/views/index-dtf/components/navigation/index.tsx @@ -28,27 +28,38 @@ const NavigationItem = ({ }[] }) => { const { pathname } = useLocation() + const showSubItems = subItems && pathname.includes(route) + return ( -
+
- {({ isActive }) => ( -
-
- {icon} + {({ isActive }) => { + return ( +
+
+ {icon} +
+
{label}
-
{label}
-
- )} + ) + }} {subItems && ( -
+
{subItems.map((item) => { const hasMoreThanOneActiveSubItem = subItems?.filter((item) => pathname.includes(item.route)).length > @@ -99,7 +110,7 @@ const NavigationItems = () => { route: ROUTES.ISSUANCE, subItems: [ { - label: t`Zap Swap`, + label: t`Zap`, route: ROUTES.ISSUANCE, }, { @@ -107,7 +118,7 @@ const NavigationItems = () => { route: ROUTES.ISSUANCE + '/automated', }, { - label: t`BYO Collateral`, + label: t`Manual`, route: ROUTES.ISSUANCE + '/manual', }, ], From 6d401fefd2f80fc84d6ae3c06a2cade65d2f5087 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 5 May 2025 16:16:18 -0300 Subject: [PATCH 10/85] chore: change gnosis safe required component --- .../async-swaps/gnosis-safe-required.tsx | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx b/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx index fffae6843..d2df1720e 100644 --- a/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx +++ b/src/views/index-dtf/issuance/async-swaps/gnosis-safe-required.tsx @@ -1,24 +1,10 @@ import { Button } from '@/components/ui/button' import Help from '@/components/ui/help' import { useConnectModal } from '@rainbow-me/rainbowkit' -import { ArrowUpRightIcon, OctagonAlert } from 'lucide-react' -import { useDisconnect, useAccount } from 'wagmi' +import { ExternalLink, OctagonAlert } from 'lucide-react' import { useEffect, useState } from 'react' +import { useAccount, useDisconnect } from 'wagmi' -const GnosisSafeIcon = () => ( - - - -) const GnosisSafeRequired = () => { const { openConnectModal } = useConnectModal() const { disconnect } = useDisconnect() @@ -93,18 +79,13 @@ const GnosisSafeRequired = () => { -
- -
Deploy new Gnosis Safe
-
-
- -
+ Create a new Gnosis Safe +
From 7db6fea72998d2d1ca493deff10a1a0e668c16bc Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Tue, 6 May 2025 15:02:36 -0300 Subject: [PATCH 11/85] chore: change async mint styles --- src/components/ui/swap.tsx | 71 ++++++++++++++++--- .../issuance/async-swaps/async-mint/index.tsx | 47 ++++++++---- .../index-dtf/issuance/async-swaps/atom.ts | 6 +- .../async-swaps/collateral-acquisition.tsx | 19 +++-- .../issuance/async-swaps/collaterals.tsx | 4 +- .../index-dtf/issuance/async-swaps/index.tsx | 63 +++++++++------- .../async-swaps/submit-async-swap.tsx | 26 ++++++- tailwind.config.ts | 5 ++ 8 files changed, 177 insertions(+), 64 deletions(-) diff --git a/src/components/ui/swap.tsx b/src/components/ui/swap.tsx index 29df35164..af410db4c 100644 --- a/src/components/ui/swap.tsx +++ b/src/components/ui/swap.tsx @@ -60,11 +60,16 @@ type SwapProps = { to: SwapItem onSwap?: () => void loading?: boolean + classNameInput?: string + classNameOutput?: string + classNameSeparator?: string + disabled?: boolean } const TokenInput = ({ value = '', onChange = () => {}, -}: Pick) => { + disabled = false, +}: Pick & { disabled?: boolean }) => { const ref = useRef(null) const isDesktop = useMediaQuery('(min-width: 768px)') @@ -86,6 +91,7 @@ const TokenInput = ({ className="placeholder:text-primary/70 text-primary" ref={ref} autoFocus={isDesktop} + disabled={disabled} /> ) } @@ -187,7 +193,11 @@ const PriceValue = ({ price }: Pick) => (
) -const MaxButton = ({ balance, onMax }: Pick) => ( +const MaxButton = ({ + balance, + onMax, + disabled, +}: Pick & { disabled?: boolean }) => (
Balance {balance} @@ -196,26 +206,43 @@ const MaxButton = ({ balance, onMax }: Pick) => ( className="h-6 rounded-full ml-1 bg-primary/15 text-primary/80 hover:bg-primary/15 hover:text-primary/80 font-semibold" size="xs" onClick={onMax} + disabled={disabled} > Max
) -const TokenInputBox = ({ from }: Pick) => { +const TokenInputBox = ({ + from, + classNameInput, + disabled, +}: Pick & { + classNameInput?: string + disabled?: boolean +}) => { return ( -
+

{from?.title || 'You use:'}

- +
- +
@@ -280,7 +307,13 @@ const SlowLoading = ({ enabled }: { enabled: boolean }) => { ) } -const TokenOutputBox = ({ to, loading }: Pick) => { +const TokenOutputBox = ({ + to, + loading, + classNameOutput, +}: Pick & { + classNameOutput?: string +}) => { const [slowLoading, setSlowLoading] = useState(false) useEffect(() => { @@ -309,7 +342,12 @@ const TokenOutputBox = ({ to, loading }: Pick) => { }, [loading]) return ( -
+

{to.title || 'You receive:'}

@@ -339,11 +377,17 @@ const TokenOutputBox = ({ to, loading }: Pick) => { ) } -const ArrowSeparator = ({ onSwap }: Pick) => { +const ArrowSeparator = ({ + onSwap, + classNameSeparator, +}: Pick & { classNameSeparator?: string }) => { if (onSwap) { return ( ) : ( <> - - Buy - Sell - -
+
+ + + Auto Mint + + + Auto Redeem + + +
+
)} -
-
- - - - - - - +
+
+
+ + + + + + +
+
+
+ +
-
- - -
) } diff --git a/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx index 4fd6c1c6c..4cb06e3b4 100644 --- a/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx +++ b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx @@ -7,6 +7,7 @@ import { Address, erc20Abi } from 'viem' import { useAccount, usePublicClient, useWalletClient } from 'wagmi' import { asyncSwapOrderIdAtom } from './atom' import { AsyncSwapResponse } from './types' +import { cn } from '@/lib/utils' const COWSWAP_VAULT_RELAYER = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' @@ -17,6 +18,7 @@ type SubmitAsyncSwapProps = { dtfAddress: string amountOut: string operation: string + loadingQuote?: boolean } const SubmitAsyncSwap = ({ @@ -24,6 +26,7 @@ const SubmitAsyncSwap = ({ dtfAddress, amountOut, operation, + loadingQuote, }: SubmitAsyncSwapProps) => { const { cowswapQuotes } = data || {} const [isSigning, setIsSigning] = useState(false) @@ -203,15 +206,32 @@ const SubmitAsyncSwap = ({ approveVaultRelayer, ]) + const isDisabled = + !cowswapQuotes?.length || isSigning || isApproving || loadingQuote + return (
) diff --git a/tailwind.config.ts b/tailwind.config.ts index 49e7dd437..d1bce770a 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -131,6 +131,10 @@ const config = { transform: 'rotate(360deg)', }, }, + shimmer: { + '0%': { backgroundPosition: '200% 0' }, + '100%': { backgroundPosition: '-200% 0' }, + }, }, animation: { 'accordion-down': 'accordion-down 0.2s ease-out', @@ -140,6 +144,7 @@ const config = { 'width-expand': 'width-expand 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) forwards', 'spin-slow': 'spin-slow 4s linear infinite', + shimmer: 'shimmer 2s linear infinite', }, }, }, From 603edd41a2df46ae4b10b4bc446d0088b5efc897 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 7 May 2025 11:59:01 -0300 Subject: [PATCH 12/85] chore: add approve & mint button --- .../issuance/async-swaps/async-mint/index.tsx | 51 +++---- .../index-dtf/issuance/async-swaps/atom.ts | 44 +++++- .../async-swaps/collateral-acquisition.tsx | 76 ++++++---- .../issuance/async-swaps/collaterals.tsx | 31 +++- .../index-dtf/issuance/async-swaps/index.tsx | 2 +- .../issuance/async-swaps/mint-button.tsx | 136 ++++++++++++++++++ .../async-swaps/submit-async-swap.tsx | 4 +- 7 files changed, 280 insertions(+), 64 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/mint-button.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index 2bbc3ebb6..dfb159028 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -1,12 +1,13 @@ import Swap from '@/components/ui/swap' import useAsyncSwap from '@/hooks/useAsyncSwap' import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' +import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' -import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect, useMemo } from 'react' -import { parseEther, parseUnits } from 'viem' +import { parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { asyncSwapFetchingAtom, @@ -14,24 +15,27 @@ import { asyncSwapOngoingTxAtom, asyncSwapRefetchAtom, asyncSwapResponseAtom, + bufferValueAtom, + collateralAcquiredAtom, currentAsyncSwapTabAtom, + isMintingAtom, + mintValueAtom, + mintValueUSDAtom, + mintValueWeiAtom, selectedTokenBalanceAtom, selectedTokenOrDefaultAtom, slippageAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' import SubmitAsyncSwap from '../submit-async-swap' -import { cn } from '@/lib/utils' - -const ASYNC_SWAP_BUFFER = 0.005 const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) - const dtfPrice = useAtomValue(indexDTFPriceAtom) const [inputAmount, setInputAmount] = useAtom(asyncSwapInputAtom) const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) + const isMinting = useAtomValue(isMintingAtom) const slippage = useAtomValue(slippageAtom) const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) @@ -41,29 +45,20 @@ const AsyncMint = () => { const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const collateralAcquired = useAtomValue(collateralAcquiredAtom) const orderSubmitted = !!asyncSwapResponse + const amountOut = useAtomValue(mintValueAtom) + const amountOutWei = useAtomValue(mintValueWeiAtom) + const amountOutValue = useAtomValue(mintValueUSDAtom) + const bufferValue = useAtomValue(bufferValueAtom) const insufficientBalance = parseUnits(inputAmount, selectedToken.decimals) > (selectedTokenBalance?.value || 0n) - const amountOut = useMemo(() => { - return ( - ((Number(inputAmount) || 0) / (dtfPrice ?? 1)) * (1 - ASYNC_SWAP_BUFFER) - ) - }, [inputAmount, dtfPrice]) - - const amountOutValue = useMemo(() => { - return (Number(inputAmount) || 0) * (1 - ASYNC_SWAP_BUFFER) - }, [inputAmount]) - - const bufferValue = useMemo(() => { - return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER - }, [inputAmount]) - const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ dtf: indexDTF?.id, - amountOut: parseEther(amountOut.toString()).toString(), + amountOut: amountOutWei.toString(), slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, disabled: insufficientBalance || ongoingTx, dtfTicker: indexDTF?.token.symbol || '', @@ -135,7 +130,8 @@ const AsyncMint = () => { )} classNameOutput={cn( 'rounded-3xl border-8 border-card rounded-b-none pb-2', - orderSubmitted && 'border-background bg-background' + orderSubmitted && 'border-background bg-background', + collateralAcquired && !isMinting && 'border-card bg-card' )} classNameSeparator={cn( 'h-10 px-[8px] w-max mx-auto border-secondary border-4 -mt-[18px] -mb-[18px] z-20 text-foreground rounded-full bg-card hover:bg-card', @@ -143,17 +139,22 @@ const AsyncMint = () => { )} /> {/* {!!data && } */} -
+
{!orderSubmitted && ( )} - {orderSubmitted && } + {orderSubmitted && }
) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index c2af90300..a65ba5e03 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -1,17 +1,32 @@ -import { atom } from 'jotai' -import { AsyncSwapOrderResponse } from './types' import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' +import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' +import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' +import { parseEther } from 'viem' +import { AsyncSwapOrderResponse } from './types' + +const ASYNC_SWAP_BUFFER = 0.005 export const asyncSwapResponseAtom = atom( undefined ) export const asyncSwapOrderIdAtom = atom( '5d3b5c96-ea7e-4bb2-bb54-40f082fb318d' + // undefined ) +export const collateralAcquiredAtom = atom((get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + return Boolean( + asyncSwapResponse?.cowswapOrders.every( + (order) => + order.status.type === 'traded' || order.status.type === 'solved' + ) + ) +}) +export const collateralPanelOpenAtom = atom(false) export const currentAsyncSwapTabAtom = atom<'mint' | 'redeem'>('mint') export const showAsyncSwapSettingsAtom = atom(false) export const asyncSwapInputAtom = atomWithReset('') @@ -43,3 +58,28 @@ export const asyncSwapOngoingTxAtom = atom(false) export const asyncSwapEndpointAtom = atom('') export const asyncSwapPriceImpactWarningCheckboxAtom = atom(false) export const asyncSwapHighPriceImpactAtom = atom(false) +export const isMintingAtom = atom(false) +export const mintTxHashAtom = atom(undefined) + +export const mintValueAtom = atom((get) => { + const inputAmount = get(asyncSwapInputAtom) + const dtfPrice = get(indexDTFPriceAtom) + return ( + ((Number(inputAmount) || 0) / (dtfPrice ?? 1)) * (1 - ASYNC_SWAP_BUFFER) + ) +}) + +export const mintValueUSDAtom = atom((get) => { + const inputAmount = get(asyncSwapInputAtom) + return (Number(inputAmount) || 0) * (1 - ASYNC_SWAP_BUFFER) +}) + +export const bufferValueAtom = atom((get) => { + const inputAmount = get(asyncSwapInputAtom) + return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER +}) + +export const mintValueWeiAtom = atom((get) => { + const amountOut = get(mintValueAtom) + return parseEther(amountOut.toString()) +}) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 55431d9b4..6923803c7 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -1,16 +1,37 @@ -import { useAtomValue } from 'jotai' -import { asyncSwapResponseAtom } from './atom' -import { Loader } from 'lucide-react' -import humanizeDuration from 'humanize-duration' -import { useEffect, useState } from 'react' -import { getFolioRoute, getTimerFormat } from '@/utils' -import { Link } from 'react-router-dom' +import StackTokenLogo from '@/components/token-logo/StackTokenLogo' import { Button } from '@/components/ui/button' -import { chainIdAtom } from '@/state/atoms' -import { ROUTES } from '@/utils/constants' +import { indexDTFBasketAtom } from '@/state/dtf/atoms' +import { getTimerFormat } from '@/utils' +import { useAtom, useAtomValue } from 'jotai' +import { ArrowLeft, ArrowRight, Check, Loader } from 'lucide-react' +import { useEffect, useState } from 'react' +import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' +import MintButton from './mint-button' + +const OpenCollateralPanel = () => { + const basket = useAtomValue(indexDTFBasketAtom) + const [open, setOpen] = useAtom(collateralPanelOpenAtom) -const CollateralAcquisition = ({ dtfAmount }: { dtfAmount: number }) => { - const chainId = useAtomValue(chainIdAtom) + return ( + + ) +} + +const CollateralAcquisition = () => { const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const [elapsedTime, setElapsedTime] = useState(0) @@ -35,29 +56,26 @@ const CollateralAcquisition = ({ dtfAmount }: { dtfAmount: number }) => { if (hasAllCollaterals) { return ( - { const indexDTFBasket = useAtomValue(indexDTFBasketAtom) const chainId = useAtomValue(chainIdAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const open = useAtomValue(collateralPanelOpenAtom) + const [isVisible, setIsVisible] = useState(false) + const [shouldRender, setShouldRender] = useState(false) - if (!asyncSwapResponse) return null + useEffect(() => { + if (asyncSwapResponse && open) { + setShouldRender(true) + setTimeout(() => setIsVisible(true), 0) + } else { + setIsVisible(false) + setTimeout(() => setShouldRender(false), 300) + } + }, [asyncSwapResponse, open]) - const { cowswapOrders } = asyncSwapResponse + if (!shouldRender) return null + + const { cowswapOrders = [] } = asyncSwapResponse || {} return ( -
- {cowswapOrders.map(({ quote, status }) => ( +
+ {cowswapOrders.map(({ orderId, quote, status }) => (
{ )} {STATUS_MAP[status.type] === 'Filled' && ( diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index cee595014..8d6e5dad7 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -140,7 +140,7 @@ const AsyncSwaps = () => {
)} -
+
diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx new file mode 100644 index 000000000..d255f78ee --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -0,0 +1,136 @@ +import dtfIndexAbi from '@/abis/dtf-index-abi' +import TokenLogo from '@/components/token-logo' +import { Button } from '@/components/ui/button' +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { Loader } from 'lucide-react' +import { useCallback } from 'react' +import { erc20Abi, parseEther } from 'viem' +import { usePublicClient, useWalletClient } from 'wagmi' +import { asyncSwapResponseAtom, isMintingAtom, mintTxHashAtom } from './atom' +import { wagmiConfig } from '@/state/chain' + +const MintButton = () => { + const indexDTF = useAtomValue(indexDTFAtom) + const orders = useAtomValue(asyncSwapResponseAtom) + const [isMinting, setIsMinting] = useAtom(isMintingAtom) + const setMintTxHash = useSetAtom(mintTxHashAtom) + const { data: walletClient } = useWalletClient({ config: wagmiConfig }) + const publicClient = usePublicClient({ config: wagmiConfig }) + const account = useAtomValue(walletAtom) + + const handleMint = useCallback(async () => { + if ( + !indexDTF || + !walletClient || + !publicClient || + !orders?.cowswapOrders?.length || + !account + ) + return + + setIsMinting(true) + try { + // Approve each token with a 10% buffer + for (const order of orders.cowswapOrders) { + const buyAmount = BigInt(order.quote.buyAmount) + const amountWithBuffer = (buyAmount * 150n) / 100n // 50% buffer + + // Check current allowance + const currentAllowance = await publicClient.readContract({ + address: order.quote.buyToken, + abi: erc20Abi, + functionName: 'allowance', + args: [account, indexDTF.id], + }) + + // Only approve if current allowance is insufficient + if (currentAllowance < amountWithBuffer) { + // Simulate approval + const { request } = await publicClient.simulateContract({ + address: order.quote.buyToken, + abi: erc20Abi, + functionName: 'approve', + args: [indexDTF.id, amountWithBuffer], + account, + }) + + // Send approval + const hash = await walletClient.writeContract(request) + const receipt = await publicClient.waitForTransactionReceipt({ hash }) + + // Verify the approval was successful + if (receipt.status !== 'success') { + throw new Error('Approval transaction failed') + } + + // Double check the new allowance + const newAllowance = await publicClient.readContract({ + address: order.quote.buyToken, + abi: erc20Abi, + functionName: 'allowance', + args: [account, indexDTF.id], + }) + + if (newAllowance < amountWithBuffer) { + throw new Error('Approval amount is still insufficient') + } + } + } + + // Perform minting + const shares = BigInt(orders.amountOut) + + const { request } = await publicClient.simulateContract({ + address: indexDTF.id, + abi: dtfIndexAbi, + functionName: 'mint', + args: [shares, account], + account, + }) + + const hash = await walletClient.writeContract(request) + const receipt = await publicClient.waitForTransactionReceipt({ hash }) + setMintTxHash(receipt.transactionHash) + } catch (error) { + console.error('Error during mint process:', error) + } finally { + setIsMinting(false) + } + }, [indexDTF, walletClient, publicClient, orders, setMintTxHash, account]) + + if (!indexDTF) return null + + if (isMinting) { + return ( +
+
+
+ +
Confirm Mint
+
+
+ +
+
+
+ ) + } + + return ( + + ) +} + +export default MintButton diff --git a/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx index 4cb06e3b4..30b318383 100644 --- a/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx +++ b/src/views/index-dtf/issuance/async-swaps/submit-async-swap.tsx @@ -5,7 +5,7 @@ import { useAtomValue, useSetAtom } from 'jotai' import { useCallback, useState } from 'react' import { Address, erc20Abi } from 'viem' import { useAccount, usePublicClient, useWalletClient } from 'wagmi' -import { asyncSwapOrderIdAtom } from './atom' +import { asyncSwapOrderIdAtom, collateralPanelOpenAtom } from './atom' import { AsyncSwapResponse } from './types' import { cn } from '@/lib/utils' @@ -37,6 +37,7 @@ const SubmitAsyncSwap = ({ const publicClient = usePublicClient() const { data: walletClient } = useWalletClient() const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) + const setCollateralPanelOpen = useSetAtom(collateralPanelOpenAtom) const approveVaultRelayer = useCallback(async () => { if (!signerAddress || !publicClient || !walletClient) return @@ -188,6 +189,7 @@ const SubmitAsyncSwap = ({ const data = await response.json() setAsyncSwapOrderId(data.swapOrderId) + setCollateralPanelOpen(true) console.log('swapOrderId', data.swapOrderId) console.log('Orders submitted successfully:', data) From c9b85ea42e6af8a47dd2cc01127adb2333cb9f82 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 8 May 2025 11:04:55 -0300 Subject: [PATCH 13/85] chore: add success msg to async mint --- .../index-dtf/issuance/async-swaps/atom.ts | 5 +- .../issuance/async-swaps/collaterals.tsx | 41 +-- .../index-dtf/issuance/async-swaps/index.tsx | 15 + .../issuance/async-swaps/mint-button.tsx | 6 +- .../issuance/async-swaps/success.tsx | 309 ++++++++++++++++++ 5 files changed, 349 insertions(+), 27 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/success.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index a65ba5e03..1b13e6b63 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -59,7 +59,10 @@ export const asyncSwapEndpointAtom = atom('') export const asyncSwapPriceImpactWarningCheckboxAtom = atom(false) export const asyncSwapHighPriceImpactAtom = atom(false) export const isMintingAtom = atom(false) -export const mintTxHashAtom = atom(undefined) +export const mintTxHashAtom = atom( + '0x7dc75b765f28b2875c9b2ae52c2fe06472baf17ba0486f195b5b69212018582e' + // undefined +) export const mintValueAtom = atom((get) => { const inputAmount = get(asyncSwapInputAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 3ae1afd59..bcbba35f6 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -1,30 +1,27 @@ import TokenLogo from '@/components/token-logo' import Help from '@/components/ui/help' import { cn } from '@/lib/utils' -import { chainIdAtom } from '@/state/atoms' import { indexDTFBasketAtom } from '@/state/dtf/atoms' -import { formatCurrency } from '@/utils' -import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { formatCurrency, formatTokenAmount } from '@/utils' import { useAtomValue } from 'jotai' -import { ArrowLeftRight, ArrowUpRight, Check, Loader } from 'lucide-react' +import { ArrowUpRight, Check, Loader } from 'lucide-react' +import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { formatUnits } from 'viem' import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' -import { useEffect, useState } from 'react' const STATUS_MAP = { open: 'Processing', scheduled: 'Processing', active: 'Processing', - solved: 'Filled', + solved: 'Order Filled', executing: 'Processing', - traded: 'Filled', + traded: 'Order Filled', cancelled: 'Not Filled', } const Collaterals = () => { const indexDTFBasket = useAtomValue(indexDTFBasketAtom) - const chainId = useAtomValue(chainIdAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const open = useAtomValue(collateralPanelOpenAtom) const [isVisible, setIsVisible] = useState(false) @@ -67,8 +64,16 @@ const Collaterals = () => { size="xl" />
- +
+ - {formatCurrency( + Number(formatUnits(BigInt(quote.sellAmount), 6)) + )}{' '} + USDC +
+
+ + + {formatTokenAmount( Number( formatUnits( BigInt(quote.buyAmount), @@ -76,21 +81,11 @@ const Collaterals = () => { (token) => token.address === quote.buyToken )?.decimals || 18 ) - ), - 6 + ) )}{' '} {indexDTFBasket?.find( (token) => token.address === quote.buyToken )?.symbol || ''} - -
- - - {formatCurrency( - Number(formatUnits(BigInt(quote.sellAmount), 6)) - )}{' '} - USDC -
@@ -100,10 +95,10 @@ const Collaterals = () => { STATUS_MAP[status.type] === 'Not Filled' && 'text-[#D05A67]', STATUS_MAP[status.type] === 'Processing' && 'text-muted-foreground', - STATUS_MAP[status.type] === 'Filled' && 'text-primary' + STATUS_MAP[status.type] === 'Order Filled' && 'text-primary' )} > - {STATUS_MAP[status.type] === 'Filled' && ( + {STATUS_MAP[status.type] === 'Order Filled' && ( )} {STATUS_MAP[status.type]} @@ -113,7 +108,7 @@ const Collaterals = () => { size={16} /> )} - {STATUS_MAP[status.type] === 'Filled' && ( + {STATUS_MAP[status.type] === 'Order Filled' && ( { useTrackIndexDTFPage('mint-async-swap') @@ -44,6 +46,7 @@ const AsyncSwaps = () => { const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) const input = useAtomValue(asyncSwapInputAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) + const mintTxHash = useAtomValue(mintTxHashAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 const { data: balance } = useERC20Balance(indexDTF?.id) @@ -78,6 +81,18 @@ const AsyncSwaps = () => { ) } + if (mintTxHash) { + return ( +
+
+
+ +
+
+
+ ) + } + return (
diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx index d255f78ee..325342d6c 100644 --- a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -1,15 +1,15 @@ import dtfIndexAbi from '@/abis/dtf-index-abi' import TokenLogo from '@/components/token-logo' import { Button } from '@/components/ui/button' -import { chainIdAtom, walletAtom } from '@/state/atoms' +import { walletAtom } from '@/state/atoms' +import { wagmiConfig } from '@/state/chain' import { indexDTFAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { Loader } from 'lucide-react' import { useCallback } from 'react' -import { erc20Abi, parseEther } from 'viem' +import { erc20Abi } from 'viem' import { usePublicClient, useWalletClient } from 'wagmi' import { asyncSwapResponseAtom, isMintingAtom, mintTxHashAtom } from './atom' -import { wagmiConfig } from '@/state/chain' const MintButton = () => { const indexDTF = useAtomValue(indexDTFAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx new file mode 100644 index 000000000..663df1bd0 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -0,0 +1,309 @@ +import TokenLogo from '@/components/token-logo' +import StackTokenLogo from '@/components/token-logo/StackTokenLogo' +import { Button } from '@/components/ui/button' +import Copy from '@/components/ui/copy' +import Help from '@/components/ui/help' +import { chainIdAtom } from '@/state/atoms' +import { + indexDTFAtom, + indexDTFBasketAtom, + indexDTFPriceAtom, +} from '@/state/dtf/atoms' +import { formatCurrency, formatTokenAmount, shortenAddress } from '@/utils' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' +import { + ArrowLeft, + ArrowUpRight, + Check, + ChevronRight, + HandCoins, + X, +} from 'lucide-react' +import { Link } from 'react-router-dom' +import { formatEther, formatUnits } from 'viem' +import { + asyncSwapInputAtom, + asyncSwapResponseAtom, + bufferValueAtom, + mintTxHashAtom, + mintValueUSDAtom, +} from './atom' + +const viewTransactionsAtom = atom(false) + +const CloseButton = () => { + const setMintTxHash = useSetAtom(mintTxHashAtom) + + const handleClose = () => { + // TODO: reset atoms + setMintTxHash(undefined) + } + + return ( + + ) +} + +const Transactions = () => { + const setViewTransactions = useSetAtom(viewTransactionsAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + const mintTxHash = useAtomValue(mintTxHashAtom) + const orders = useAtomValue(asyncSwapResponseAtom) + + const { cowswapOrders = [] } = orders || {} + + return ( +
+
+ +
+ All Transactions +
+ +
+
+
+
+ +
+ + {indexDTF?.token.symbol} Minted + +
+ {shortenAddress(indexDTF?.id || '')} +
+
+
+
+
+ +
+ + + +
+
+
+ {cowswapOrders.map(({ orderId, quote }) => ( +
+
+ token.address === quote.buyToken + )?.symbol || '' + } + size="xl" + /> +
+
+ - + {formatCurrency( + Number(formatUnits(BigInt(quote.sellAmount), 6)) + )}{' '} + USDC +
+
+ + + {formatTokenAmount( + Number( + formatUnits( + BigInt(quote.buyAmount), + indexDTFBasket?.find( + (token) => token.address === quote.buyToken + )?.decimals || 18 + ) + ) + )}{' '} + {indexDTFBasket?.find( + (token) => token.address === quote.buyToken + )?.symbol || ''} +
+
+
+
+ + Order Filled + + + +
+
+ ))} +
+
+
+ ) +} + +const Success = () => { + const chainId = useAtomValue(chainIdAtom) + const [viewTransactions, setViewTransactions] = useAtom(viewTransactionsAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) + const basket = useAtomValue(indexDTFBasketAtom) + const inputAmount = useAtomValue(asyncSwapInputAtom) + const inputAmountUSD = useAtomValue(mintValueUSDAtom) + const buffer = useAtomValue(bufferValueAtom) + const orders = useAtomValue(asyncSwapResponseAtom) + + const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) + const valueMinted = (indexDTFPrice || 0) * sharesMinted + const priceImpact = inputAmountUSD + ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) + : 0 + + if (viewTransactions) { + return + } + + return ( +
+
+
+ + + +
+ + +
+
+
+
+
+
You Minted:
+
+
+
+ {formatTokenAmount(sharesMinted)} +
+
VTF
+
+ +
+
+ ${formatCurrency(valueMinted)}{' '} + ({priceImpact}%) +
+
+
+
You Used:
+
+
+
+ {formatCurrency(inputAmountUSD)} +
+
USDC
+
+
+ + {formatCurrency(Number(inputAmount))} USDC + + +
+
+
+ ${formatCurrency(inputAmountUSD)}{' '} + + ${formatCurrency(Number(inputAmount))} + +
+
+
+ +
You Saved:
+ {' '} +
+
+ $ + {formatCurrency(buffer)} +
+
+
+
+
+ ) +} + +export default Success From bfc51f7653d711e645254e11efa552883d458c77 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 8 May 2025 11:44:36 -0300 Subject: [PATCH 14/85] fix: collaterals height --- .../issuance/async-swaps/collaterals.tsx | 2 +- .../index-dtf/issuance/async-swaps/index.tsx | 14 +- .../issuance/async-swaps/success.tsx | 225 ++++++++++-------- 3 files changed, 141 insertions(+), 100 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index bcbba35f6..17e90fae5 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -44,7 +44,7 @@ const Collaterals = () => { return (
diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 642543ff7..149e9dd9e 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -31,6 +31,7 @@ import OrderStatusUpdater from './order-status-updater' import { isSafeMultisigAtom } from '@/state/atoms' import GnosisSafeRequired from './gnosis-safe-required' import Success from './success' +import { cn } from '@/lib/utils' const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') @@ -155,9 +156,14 @@ const AsyncSwaps = () => {
)} -
-
-
+
+
+
@@ -166,7 +172,7 @@ const AsyncSwaps = () => {
-
+
diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 663df1bd0..cf6ada287 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -20,10 +20,12 @@ import { HandCoins, X, } from 'lucide-react' +import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { formatEther, formatUnits } from 'viem' import { asyncSwapInputAtom, + asyncSwapOrderIdAtom, asyncSwapResponseAtom, bufferValueAtom, mintTxHashAtom, @@ -34,10 +36,15 @@ const viewTransactionsAtom = atom(false) const CloseButton = () => { const setMintTxHash = useSetAtom(mintTxHashAtom) + const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) + const setAsyncSwapInput = useSetAtom(asyncSwapInputAtom) const handleClose = () => { - // TODO: reset atoms setMintTxHash(undefined) + // setAsyncSwapResponse(undefined) + // setAsyncSwapOrderId(undefined) + // setAsyncSwapInput('') } return ( @@ -182,6 +189,7 @@ const Success = () => { const inputAmountUSD = useAtomValue(mintValueUSDAtom) const buffer = useAtomValue(bufferValueAtom) const orders = useAtomValue(asyncSwapResponseAtom) + const [showConfetti, setShowConfetti] = useState(true) const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) const valueMinted = (indexDTFPrice || 0) * sharesMinted @@ -189,115 +197,142 @@ const Success = () => { ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) : 0 + useEffect(() => { + const timer = setTimeout(() => { + setShowConfetti(false) + }, 2000) + + return () => clearTimeout(timer) + }, []) + if (viewTransactions) { return } return ( -
-
-
- - - -
- - + + +
+ + +
-
-
-
-
You Minted:
-
-
-
- {formatTokenAmount(sharesMinted)} +
+
+
You Minted:
+
+
+
+ {formatTokenAmount(sharesMinted)} +
+
VTF
-
VTF
+ +
+
+ ${formatCurrency(valueMinted)}{' '} + ({priceImpact}%)
- -
-
- ${formatCurrency(valueMinted)}{' '} - ({priceImpact}%)
-
-
-
You Used:
-
-
-
- {formatCurrency(inputAmountUSD)} +
+
You Used:
+
+
+
+ {formatCurrency(inputAmountUSD)} +
+
USDC
+
+
+ + {formatCurrency(Number(inputAmount))} USDC + +
-
USDC
-
- - {formatCurrency(Number(inputAmount))} USDC +
+ ${formatCurrency(inputAmountUSD)}{' '} + + ${formatCurrency(Number(inputAmount))} - -
-
-
- ${formatCurrency(inputAmountUSD)}{' '} - - ${formatCurrency(Number(inputAmount))} - -
-
-
- -
You Saved:
- {' '}
-
- $ - {formatCurrency(buffer)} +
+
+ +
You Saved:
+ {' '} +
+
+ + ${formatCurrency(buffer)} +
From fde1488cfd231ca8032599520b68647ec27a7429 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Fri, 9 May 2025 10:08:56 -0300 Subject: [PATCH 15/85] chore: wip async redeem --- src/utils/constants.ts | 4 +- .../issuance/async-swaps/async-mint/index.tsx | 13 +- .../async-swaps/async-redeem/index.tsx | 197 +++++++++--------- .../index-dtf/issuance/async-swaps/atom.ts | 8 +- .../index-dtf/issuance/async-swaps/index.tsx | 18 +- 5 files changed, 112 insertions(+), 128 deletions(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 3290b5e31..66a069407 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -22,7 +22,9 @@ export const RESERVE_FORUM = 'https://forum.reserve.org/' export const REGISTER_BUGS = 'https://reserve.canny.io/defi-surfaces-bug-reporting' export const RESERVE_STORAGE = 'https://storage.reserve.org/' -export const RESERVE_API = 'https://api-staging.reserve.org/' +// export const RESERVE_API = 'https://api-staging.reserve.org/' +export const RESERVE_API = + 'https://reserve-api-staging.reserve-337.workers.dev/' export const DUNE_DASHBOARD = 'https://dune.com/reserve-protocol/reserve-protocol-overview' export const REPOSITORY_URL = 'https://github.com/reserve-protocol/register' diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index dfb159028..ba0d743c1 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -6,7 +6,7 @@ import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { useCallback, useEffect, useMemo } from 'react' +import { useEffect } from 'react' import { parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { @@ -17,7 +17,6 @@ import { asyncSwapResponseAtom, bufferValueAtom, collateralAcquiredAtom, - currentAsyncSwapTabAtom, isMintingAtom, mintValueAtom, mintValueUSDAtom, @@ -40,7 +39,6 @@ const AsyncMint = () => { const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) const setAsyncSwapFetching = useSetAtom(asyncSwapFetchingAtom) - const setCurrentTab = useSetAtom(currentAsyncSwapTabAtom) const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') @@ -78,11 +76,6 @@ const AsyncMint = () => { // ) const awaitingQuote = isLoading || isFetching - const changeTab = () => { - setCurrentTab((prev) => (prev === 'mint' ? 'redeem' : 'mint')) - setInputAmount('') - } - useEffect(() => { setAsyncSwapRefetch({ fn: refetch }) }, [refetch, setAsyncSwapRefetch]) @@ -96,10 +89,6 @@ const AsyncMint = () => { setInputAmount('') }, []) - const onSuccess = useCallback(() => { - setInputAmount('') - }, []) - if (!indexDTF) return null return ( diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 4c0f5e326..3a6087488 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -1,111 +1,102 @@ import Swap from '@/components/ui/swap' -import useZapSwapQuery from '@/hooks/useZapSwapQuery' +import useAsyncSwap from '@/hooks/useAsyncSwap' +import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' +import { cn } from '@/lib/utils' +import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { useCallback, useEffect } from 'react' -import { formatEther, formatUnits, parseEther } from 'viem' +import { useEffect } from 'react' +import { formatEther, parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { - currentZapMintTabAtom, - forceMintAtom, + asyncSwapFetchingAtom, + asyncSwapInputAtom, + asyncSwapOngoingTxAtom, + asyncSwapRefetchAtom, + asyncSwapResponseAtom, + bufferValueAtom, + collateralAcquiredAtom, indexDTFBalanceAtom, - openZapMintModalAtom, - selectedTokenAtom, + isMintingAtom, + mintValueAtom, + mintValueUSDAtom, + mintValueWeiAtom, + selectedTokenBalanceAtom, selectedTokenOrDefaultAtom, slippageAtom, - tokensAtom, - zapFetchingAtom, - zapMintInputAtom, - zapOngoingTxAtom, - zapRefetchAtom, -} from '../../../overview/components/zap-mint/atom' -import SubmitZap from '../../../overview/components/zap-mint/submit-zap' -import ZapDetails, { - ZapPriceImpact, -} from '../../../overview/components/zap-mint/zap-details' +} from '../atom' +import CollateralAcquisition from '../collateral-acquisition' +import SubmitAsyncSwap from '../submit-async-swap' const AsyncRedeem = () => { + const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) - const indexDTFPrice = useAtomValue(indexDTFPriceAtom) - const [inputAmount, setInputAmount] = useAtom(zapMintInputAtom) + const [inputAmount, setInputAmount] = useAtom(asyncSwapInputAtom) const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) - const indexDTFBalance = useAtomValue(indexDTFBalanceAtom) - const indxDTFParsedBalance = formatEther(indexDTFBalance) - const tokens = useAtomValue(tokensAtom) + const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) + const isMinting = useAtomValue(isMintingAtom) const slippage = useAtomValue(slippageAtom) - const forceMint = useAtomValue(forceMintAtom) - const setOutputToken = useSetAtom(selectedTokenAtom) - const [ongoingTx, setOngoingTx] = useAtom(zapOngoingTxAtom) - const setZapRefetch = useSetAtom(zapRefetchAtom) - const setZapFetching = useSetAtom(zapFetchingAtom) - const setCurrentTab = useSetAtom(currentZapMintTabAtom) - const setOpen = useSetAtom(openZapMintModalAtom) + const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) + const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) + const setAsyncSwapFetching = useSetAtom(asyncSwapFetchingAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputPrice = (indexDTFPrice || 0) * Number(inputAmount) + const indexDTFBalance = useAtomValue(indexDTFBalanceAtom) + const indxDTFParsedBalance = formatEther(indexDTFBalance) const onMax = () => setInputAmount(indxDTFParsedBalance) + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const collateralAcquired = useAtomValue(collateralAcquiredAtom) + const orderSubmitted = !!asyncSwapResponse + const amountOut = useAtomValue(mintValueAtom) + const amountOutWei = useAtomValue(mintValueWeiAtom) + const amountOutValue = useAtomValue(mintValueUSDAtom) + const bufferValue = useAtomValue(bufferValueAtom) - const insufficientBalance = parseEther(inputAmount) > indexDTFBalance + const insufficientBalance = + parseUnits(inputAmount, selectedToken.decimals) > + (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, refetch, failureReason } = - useZapSwapQuery({ - tokenIn: indexDTF?.id, - tokenOut: selectedToken.address, - amountIn: parseEther(inputAmount).toString(), - slippage: Number(slippage), - disabled: insufficientBalance || ongoingTx, - forceMint, - dtfTicker: indexDTF?.token.symbol || '', - type: 'sell', - }) + const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ + dtf: indexDTF?.id, + amountOut: amountOutWei.toString(), + slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, + disabled: insufficientBalance || ongoingTx, + dtfTicker: indexDTF?.token.symbol || '', + type: 'mint', + }) const { loadingAfterRefetch } = useLoadingAfterRefetch(data) - const priceFrom = data?.result?.amountInValue - const priceTo = data?.result?.amountOutValue - const valueTo = data?.result?.amountOut - const showTxButton = Boolean( - data?.status === 'success' && - data?.result && - !insufficientBalance && - !isLoading - ) - const fetchingZapper = isLoading || isFetching - const zapperErrorMessage = isFetching - ? '' - : data?.error || failureReason?.message || '' - const dustValue = data?.result?.dustValue || 0 - - const changeTab = () => { - setCurrentTab((prev) => (prev === 'sell' ? 'buy' : 'sell')) - setOutputToken(tokens[0]) - setInputAmount('') - } + // const valueTo = data?.result?.amountOut + // const showTxButton = Boolean( + // data?.status === 'success' && + // data?.result && + // !insufficientBalance && + // !isLoading + // ) + const awaitingQuote = isLoading || isFetching useEffect(() => { - setZapRefetch({ fn: refetch }) - }, [refetch, setZapRefetch]) + setAsyncSwapRefetch({ fn: refetch }) + }, [refetch, setAsyncSwapRefetch]) useEffect(() => { - setZapFetching(fetchingZapper) - }, [fetchingZapper, setZapFetching]) + setAsyncSwapFetching(awaitingQuote) + }, [awaitingQuote, setAsyncSwapFetching]) useEffect(() => { setOngoingTx(false) setInputAmount('') }, []) - const onSuccess = useCallback(() => { - setInputAmount('') - setOpen(false) - }, []) - if (!indexDTF) return null return ( -
+
{ to={{ address: selectedToken.address, symbol: selectedToken.symbol, - price: priceTo ? ( - - ${formatCurrency(priceTo)} - {dustValue > 0.01 - ? ` + $${formatCurrency(dustValue)} in dust ` - : ' '} - - + price: amountOutValue ? ( + ${formatCurrency(amountOutValue)} ) : undefined, - value: formatUnits(BigInt(valueTo || 0), selectedToken.decimals), - tokens, - onTokenSelect: setOutputToken, + value: amountOut.toString(), }} - onSwap={changeTab} loading={isLoading || loadingAfterRefetch} + disabled={orderSubmitted} + classNameInput={cn( + 'rounded-3xl border-8 border-card', + orderSubmitted && 'border-background bg-background' + )} + classNameOutput={cn( + 'rounded-3xl border-8 border-card rounded-b-none pb-2', + orderSubmitted && 'border-background bg-background', + collateralAcquired && !isMinting && 'border-card bg-card' + )} + classNameSeparator={cn( + 'h-10 px-[8px] w-max mx-auto border-secondary border-4 -mt-[18px] -mb-[18px] z-20 text-foreground rounded-full bg-card hover:bg-card', + orderSubmitted && 'bg-background' + )} /> - {!!data?.result && } - + {/* {!!data && } */} +
+ {!orderSubmitted && ( + + )} + {orderSubmitted && } +
) } diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 1b13e6b63..b05566a4d 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -13,8 +13,8 @@ export const asyncSwapResponseAtom = atom( undefined ) export const asyncSwapOrderIdAtom = atom( - '5d3b5c96-ea7e-4bb2-bb54-40f082fb318d' - // undefined + // '5d3b5c96-ea7e-4bb2-bb54-40f082fb318d' + undefined ) export const collateralAcquiredAtom = atom((get) => { @@ -60,8 +60,8 @@ export const asyncSwapPriceImpactWarningCheckboxAtom = atom(false) export const asyncSwapHighPriceImpactAtom = atom(false) export const isMintingAtom = atom(false) export const mintTxHashAtom = atom( - '0x7dc75b765f28b2875c9b2ae52c2fe06472baf17ba0486f195b5b69212018582e' - // undefined + // '0x7dc75b765f28b2875c9b2ae52c2fe06472baf17ba0486f195b5b69212018582e' + undefined ) export const mintValueAtom = atom((get) => { diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 149e9dd9e..69a9a7352 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -1,18 +1,13 @@ import { Button } from '@/components/ui/button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import useERC20Balance from '@/hooks/useERC20Balance' +import { cn } from '@/lib/utils' +import { isSafeMultisigAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' -import { - defaultSelectedTokenAtom, - indexDTFBalanceAtom, - selectedTokenAtom, - tokensAtom, -} from '../../overview/components/zap-mint/atom' -import LowLiquidityWarning from '../../overview/components/zap-mint/low-liquidity-warning' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' import ZapSettings from '../../overview/components/zap-mint/zap-settings' import AsyncMint from './async-mint' @@ -23,15 +18,16 @@ import { asyncSwapOngoingTxAtom, asyncSwapRefetchAtom, currentAsyncSwapTabAtom, + defaultSelectedTokenAtom, + indexDTFBalanceAtom, mintTxHashAtom, + selectedTokenAtom, showAsyncSwapSettingsAtom, } from './atom' import Collaterals from './collaterals' -import OrderStatusUpdater from './order-status-updater' -import { isSafeMultisigAtom } from '@/state/atoms' import GnosisSafeRequired from './gnosis-safe-required' +import OrderStatusUpdater from './order-status-updater' import Success from './success' -import { cn } from '@/lib/utils' const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') @@ -40,7 +36,6 @@ const AsyncSwaps = () => { const [showSettings, setShowSettings] = useAtom(showAsyncSwapSettingsAtom) const defaultToken = useAtomValue(defaultSelectedTokenAtom) const setSelectedToken = useSetAtom(selectedTokenAtom) - const tokens = useAtomValue(tokensAtom) const indexDTF = useAtomValue(indexDTFAtom) const asyncSwapRefetch = useAtomValue(asyncSwapRefetchAtom) const asyncSwapFetching = useAtomValue(asyncSwapFetchingAtom) @@ -63,7 +58,6 @@ const AsyncSwaps = () => { const changeTab = (tab: string) => { setCurrentTab(tab as 'mint' | 'redeem') - setSelectedToken(tab === 'mint' ? tokens[0] : tokens[1]) } useEffect(() => { From 547f691b740a1aaf864ec7cd7be714464951d2a3 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 12 May 2025 10:08:40 -0300 Subject: [PATCH 16/85] feat: async redeem --- src/components/ui/swap.tsx | 3 +- .../issuance/async-swaps/async-mint/index.tsx | 4 +- .../submit-mint-orders.tsx} | 12 +- .../async-swaps/async-redeem/index.tsx | 55 ++++++-- .../async-redeem/submit-redeem.tsx | 132 ++++++++++++++++++ .../index-dtf/issuance/async-swaps/atom.ts | 4 +- .../async-swaps/collateral-acquisition.tsx | 13 +- .../issuance/async-swaps/collaterals.tsx | 11 +- .../index-dtf/issuance/async-swaps/index.tsx | 2 + 9 files changed, 209 insertions(+), 27 deletions(-) rename src/views/index-dtf/issuance/async-swaps/{submit-async-swap.tsx => async-mint/submit-mint-orders.tsx} (97%) create mode 100644 src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx diff --git a/src/components/ui/swap.tsx b/src/components/ui/swap.tsx index af410db4c..5cdcbe0c1 100644 --- a/src/components/ui/swap.tsx +++ b/src/components/ui/swap.tsx @@ -64,6 +64,7 @@ type SwapProps = { classNameOutput?: string classNameSeparator?: string disabled?: boolean + customInput?: ReactNode } const TokenInput = ({ value = '', @@ -564,7 +565,7 @@ export const SwapDetails = ({ visible, details }: SwapDetailsProps) => { const Swap = (props: SwapProps) => { return (
- + {!!props.customInput ? props.customInput : }
diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index ba0d743c1..cddf30be6 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -26,7 +26,7 @@ import { slippageAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' -import SubmitAsyncSwap from '../submit-async-swap' +import SubmitMint from './submit-mint-orders' const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) @@ -135,7 +135,7 @@ const AsyncMint = () => { )} > {!orderSubmitted && ( - { +}: SubmitMintProps) => { const { cowswapQuotes } = data || {} const [isSigning, setIsSigning] = useState(false) const [isApproving, setIsApproving] = useState(false) @@ -239,4 +239,4 @@ const SubmitAsyncSwap = ({ ) } -export default SubmitAsyncSwap +export default SubmitMint diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 3a6087488..88020cc8b 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -1,9 +1,12 @@ import Swap from '@/components/ui/swap' import useAsyncSwap from '@/hooks/useAsyncSwap' -import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' -import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' +import { + indexDTFAtom, + indexDTFBasketAtom, + indexDTFPriceAtom, +} from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' @@ -22,12 +25,15 @@ import { mintValueAtom, mintValueUSDAtom, mintValueWeiAtom, + redeemAssetsAtom, selectedTokenBalanceAtom, selectedTokenOrDefaultAtom, slippageAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' -import SubmitAsyncSwap from '../submit-async-swap' +import SubmitRedeem from './submit-redeem' +import TokenLogo from '@/components/token-logo' +import StackTokenLogo from '@/components/token-logo/StackTokenLogo' const AsyncRedeem = () => { const chainId = useAtomValue(chainIdAtom) @@ -52,6 +58,8 @@ const AsyncRedeem = () => { const amountOutWei = useAtomValue(mintValueWeiAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) const bufferValue = useAtomValue(bufferValueAtom) + const redeemAssets = useAtomValue(redeemAssetsAtom) + const basket = useAtomValue(indexDTFBasketAtom) const insufficientBalance = parseUnits(inputAmount, selectedToken.decimals) > @@ -96,6 +104,7 @@ const AsyncRedeem = () => {
{ onChange: setInputAmount, onMax, }} + customInput={ + Object.keys(redeemAssets).length > 0 ? ( +
+ +
+ You Redeemed: + + + {inputAmount || 10000}{' '} + + VTF + + for {basket?.length} underlying collateral tokens +
+
+
+ +
+
+ ) : undefined + } to={{ + title: 'Estimated Out:', address: selectedToken.address, symbol: selectedToken.symbol, price: amountOutValue ? ( @@ -135,15 +174,7 @@ const AsyncRedeem = () => { isMinting ? 'bg-background' : 'bg-card' )} > - {!orderSubmitted && ( - - )} + {!orderSubmitted && } {orderSubmitted && }
diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx new file mode 100644 index 000000000..289d01f43 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx @@ -0,0 +1,132 @@ +import dtfIndexAbi from '@/abis/dtf-index-abi' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { safeParseEther } from '@/utils' +import { useAtomValue, useSetAtom } from 'jotai' +import { useCallback, useEffect } from 'react' +import { Address, parseEventLogs } from 'viem' +import { + useWaitForTransactionReceipt, + useWalletClient, + useWriteContract, +} from 'wagmi' +import { assetDistributionAtom } from '../../manual/atoms' +import { asyncSwapInputAtom, redeemAssetsAtom } from '../atom' + +const SubmitRedeem = () => { + const chainId = useAtomValue(chainIdAtom) + const account = useAtomValue(walletAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const assetDistribution = useAtomValue(assetDistributionAtom) + const amount = useAtomValue(asyncSwapInputAtom) + const setRedeemAssets = useSetAtom(redeemAssetsAtom) + + const { data: walletClient } = useWalletClient() + const { + data, + isPending, + error: signError, + writeContract, + } = useWriteContract() + + const { + data: receipt, + isLoading: isReceiptLoading, + error: txError, + } = useWaitForTransactionReceipt({ + hash: data, + chainId, + }) + + useEffect(() => { + if (receipt?.status === 'success') { + const events = parseEventLogs({ + abi: dtfIndexAbi, + logs: receipt.logs, + eventName: 'Transfer', + }) + + events + .filter((event) => event.address !== indexDTF?.id) + .forEach((event) => { + const assetAddress = event.address as Address + const amount = event.args.value as bigint + setRedeemAssets((prev: Record) => ({ + ...prev, + [assetAddress]: amount, + })) + }) + } + }, [receipt]) + + const handleSubmit = useCallback(async () => { + if (!chainId || !walletClient || !account || !indexDTF || !amount) return + + try { + const assets: Address[] = [] + const minAmounts: bigint[] = [] + const sharesToRedeem = safeParseEther(amount) + + const requiredAmounts = Object.keys(assetDistribution).reduce( + (acc, asset) => { + acc[asset] = + (assetDistribution[asset] * sharesToRedeem) / safeParseEther('1') + return acc + }, + {} as Record + ) + + for (const asset of Object.keys(requiredAmounts)) { + assets.push(asset as Address) + // 5% slippage + // TODO: This is worst case scenario, but it maybe too much? + minAmounts.push((requiredAmounts[asset] * 95n) / 100n) + } + + const hash = writeContract({ + address: indexDTF.id, + abi: dtfIndexAbi, + functionName: 'redeem', + args: [ + sharesToRedeem, + account, + assets as `0x${string}`[], + minAmounts as bigint[], + ], + }) + + console.log('Redeem transaction sent:', hash) + } catch (error) { + console.error('Error processing orders:', error) + } + }, [chainId, walletClient, account, indexDTF, amount]) + + const disabled = isPending || isReceiptLoading || !amount + + return ( +
+ +
+ ) +} + +export default SubmitRedeem diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index b05566a4d..949b932fa 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -4,7 +4,7 @@ import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' -import { parseEther } from 'viem' +import { Address, parseEther } from 'viem' import { AsyncSwapOrderResponse } from './types' const ASYNC_SWAP_BUFFER = 0.005 @@ -86,3 +86,5 @@ export const mintValueWeiAtom = atom((get) => { const amountOut = get(mintValueAtom) return parseEther(amountOut.toString()) }) + +export const redeemAssetsAtom = atom>({}) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 6923803c7..3fdb0d933 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -5,7 +5,11 @@ import { getTimerFormat } from '@/utils' import { useAtom, useAtomValue } from 'jotai' import { ArrowLeft, ArrowRight, Check, Loader } from 'lucide-react' import { useEffect, useState } from 'react' -import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' +import { + asyncSwapResponseAtom, + collateralPanelOpenAtom, + currentAsyncSwapTabAtom, +} from './atom' import MintButton from './mint-button' const OpenCollateralPanel = () => { @@ -32,6 +36,7 @@ const OpenCollateralPanel = () => { } const CollateralAcquisition = () => { + const tab = useAtomValue(currentAsyncSwapTabAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const [elapsedTime, setElapsedTime] = useState(0) @@ -78,7 +83,11 @@ const CollateralAcquisition = () => {
-
Acquiring Collateral
+
+ {tab === 'mint' + ? 'Acquiring Collateral' + : 'Selling collateral for USDC'} +
{getTimerFormat(elapsedTime)} diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 17e90fae5..00e3110f8 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -8,7 +8,11 @@ import { ArrowUpRight, Check, Loader } from 'lucide-react' import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { formatUnits } from 'viem' -import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' +import { + asyncSwapResponseAtom, + collateralPanelOpenAtom, + currentAsyncSwapTabAtom, +} from './atom' const STATUS_MAP = { open: 'Processing', @@ -21,6 +25,7 @@ const STATUS_MAP = { } const Collaterals = () => { + const tab = useAtomValue(currentAsyncSwapTabAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const open = useAtomValue(collateralPanelOpenAtom) @@ -65,14 +70,14 @@ const Collaterals = () => { />
- - + {tab === 'mint' ? '-' : '+'}{' '} {formatCurrency( Number(formatUnits(BigInt(quote.sellAmount), 6)) )}{' '} USDC
- + + {tab === 'mint' ? '+' : '-'}{' '} {formatTokenAmount( Number( formatUnits( diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 69a9a7352..fa304a97d 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -28,6 +28,7 @@ import Collaterals from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' import OrderStatusUpdater from './order-status-updater' import Success from './success' +import Updater from '../manual/updater' const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') @@ -91,6 +92,7 @@ const AsyncSwaps = () => { return (
+
Date: Mon, 12 May 2025 11:09:26 -0300 Subject: [PATCH 17/85] chore: restore constant --- src/utils/constants.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 66a069407..3290b5e31 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -22,9 +22,7 @@ export const RESERVE_FORUM = 'https://forum.reserve.org/' export const REGISTER_BUGS = 'https://reserve.canny.io/defi-surfaces-bug-reporting' export const RESERVE_STORAGE = 'https://storage.reserve.org/' -// export const RESERVE_API = 'https://api-staging.reserve.org/' -export const RESERVE_API = - 'https://reserve-api-staging.reserve-337.workers.dev/' +export const RESERVE_API = 'https://api-staging.reserve.org/' export const DUNE_DASHBOARD = 'https://dune.com/reserve-protocol/reserve-protocol-overview' export const REPOSITORY_URL = 'https://github.com/reserve-protocol/register' From 6a9351de194df7981f1dc9142c631ea300ebd86e Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 12 May 2025 15:05:00 -0300 Subject: [PATCH 18/85] chore: refactor swap component --- src/components/ui/swap.tsx | 54 +++---- .../issuance/async-swaps/async-mint/index.tsx | 40 +++-- .../async-swaps/async-redeem/index.tsx | 153 ++++++++++-------- 3 files changed, 133 insertions(+), 114 deletions(-) diff --git a/src/components/ui/swap.tsx b/src/components/ui/swap.tsx index 5cdcbe0c1..b5984fc4c 100644 --- a/src/components/ui/swap.tsx +++ b/src/components/ui/swap.tsx @@ -7,8 +7,10 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Input, NumericalInput } from '@/components/ui/input' +import useMediaQuery from '@/hooks/useMediaQuery' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' +import { indexDTFAtom, indexDTFBrandAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { formatCurrency } from '@/utils' import { useAtomValue } from 'jotai' @@ -27,18 +29,16 @@ import React, { useState, } from 'react' import GaugeIcon from '../icons/GaugeIcon' -import { ToggleGroup, ToggleGroupItem } from './toggle-group' -import { Skeleton } from './skeleton' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from './accordion' -import { Separator } from './separator' import Help from './help' -import { indexDTFAtom, indexDTFBrandAtom } from '@/state/dtf/atoms' -import useMediaQuery from '@/hooks/useMediaQuery' +import { Separator } from './separator' +import { Skeleton } from './skeleton' +import { ToggleGroup, ToggleGroupItem } from './toggle-group' type TokenWithBalance = Token & { balance?: string } @@ -53,6 +53,8 @@ type SwapItem = { onChange?: (value: string) => void tokens?: TokenWithBalance[] onTokenSelect?: (token: Token) => void + disabled?: boolean + className?: string } type SwapProps = { @@ -60,12 +62,8 @@ type SwapProps = { to: SwapItem onSwap?: () => void loading?: boolean - classNameInput?: string - classNameOutput?: string - classNameSeparator?: string - disabled?: boolean - customInput?: ReactNode } + const TokenInput = ({ value = '', onChange = () => {}, @@ -214,25 +212,18 @@ const MaxButton = ({
) -const TokenInputBox = ({ - from, - classNameInput, - disabled, -}: Pick & { - classNameInput?: string - disabled?: boolean -}) => { +export const TokenInputBox = ({ from }: Pick) => { return (

{from?.title || 'You use:'}

- +
@@ -242,7 +233,7 @@ const TokenInputBox = ({
@@ -308,13 +299,10 @@ const SlowLoading = ({ enabled }: { enabled: boolean }) => { ) } -const TokenOutputBox = ({ +export const TokenOutputBox = ({ to, loading, - classNameOutput, -}: Pick & { - classNameOutput?: string -}) => { +}: Pick) => { const [slowLoading, setSlowLoading] = useState(false) useEffect(() => { @@ -346,7 +334,7 @@ const TokenOutputBox = ({
@@ -378,16 +366,16 @@ const TokenOutputBox = ({ ) } -const ArrowSeparator = ({ +export const ArrowSeparator = ({ onSwap, - classNameSeparator, -}: Pick & { classNameSeparator?: string }) => { + className, +}: Pick & { className?: string }) => { if (onSwap) { return ( + +
+ + +
+
+ ) +} + +const MintedAmount = () => { + const chainId = useAtomValue(chainIdAtom) + const indexDTF = useAtomValue(indexDTFAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) + const inputAmountUSD = useAtomValue(mintValueUSDAtom) + const orders = useAtomValue(asyncSwapResponseAtom) + + const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) + const valueMinted = (indexDTFPrice || 0) * sharesMinted + const priceImpact = inputAmountUSD + ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) + : 0 + + return ( +
+
You Minted:
+
+
+
+ {formatTokenAmount(sharesMinted)} +
+
VTF
+
+ +
+
+ ${formatCurrency(valueMinted)}{' '} + ({priceImpact}%) +
+
+ ) +} + +const UsedAmount = () => { + const inputAmount = useAtomValue(asyncSwapInputAtom) + const inputAmountUSD = useAtomValue(mintValueUSDAtom) + + return ( +
+
You Used:
+
+
+
+ {formatCurrency(inputAmountUSD)} +
+
USDC
+
+
+ + {formatCurrency(Number(inputAmount))} USDC + + +
+
+
+ ${formatCurrency(inputAmountUSD)}{' '} + + ${formatCurrency(Number(inputAmount))} + +
+ +
+ ) +} + +const BufferInfo = () => { + const buffer = useAtomValue(bufferValueAtom) + + return ( +
+
+ +
You Saved:
+ {' '} +
+
+ $ + {formatCurrency(buffer)} +
+
+ ) +} + const Transactions = () => { const setViewTransactions = useSetAtom(viewTransactionsAtom) const indexDTF = useAtomValue(indexDTFAtom) @@ -180,23 +326,9 @@ const Transactions = () => { } const Success = () => { - const chainId = useAtomValue(chainIdAtom) const [viewTransactions, setViewTransactions] = useAtom(viewTransactionsAtom) - const indexDTF = useAtomValue(indexDTFAtom) - const indexDTFPrice = useAtomValue(indexDTFPriceAtom) - const basket = useAtomValue(indexDTFBasketAtom) - const inputAmount = useAtomValue(asyncSwapInputAtom) - const inputAmountUSD = useAtomValue(mintValueUSDAtom) - const buffer = useAtomValue(bufferValueAtom) - const orders = useAtomValue(asyncSwapResponseAtom) const [showConfetti, setShowConfetti] = useState(true) - const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) - const valueMinted = (indexDTFPrice || 0) * sharesMinted - const priceImpact = inputAmountUSD - ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) - : 0 - useEffect(() => { const timer = setTimeout(() => { setShowConfetti(false) @@ -230,111 +362,11 @@ const Success = () => { )}
-
- - - -
- - -
-
+
-
-
You Minted:
-
-
-
- {formatTokenAmount(sharesMinted)} -
-
VTF
-
- -
-
- ${formatCurrency(valueMinted)}{' '} - ({priceImpact}%) -
-
-
-
You Used:
-
-
-
- {formatCurrency(inputAmountUSD)} -
-
USDC
-
-
- - {formatCurrency(Number(inputAmount))} USDC - - -
-
-
- ${formatCurrency(inputAmountUSD)}{' '} - - ${formatCurrency(Number(inputAmount))} - -
-
-
- -
You Saved:
- {' '} -
-
- - ${formatCurrency(buffer)} -
-
-
+ +
From ee5aeed7f7e04e7984779a33cc85855ed5a238cb Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 19 May 2025 15:39:43 -0300 Subject: [PATCH 27/85] fix: collaterals height --- .../index-dtf/issuance/async-swaps/atom.ts | 3 +- .../issuance/async-swaps/collaterals.tsx | 46 ++++++++++++--- .../index-dtf/issuance/async-swaps/index.tsx | 59 +++++++++++-------- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index af9d1f626..b994b7912 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -14,6 +14,7 @@ export const asyncSwapResponseAtom = atom( ) export const asyncSwapOrderIdAtom = atom( // '5d3b5c96-ea7e-4bb2-bb54-40f082fb318d' + // 'fb4f234d-5b66-4436-a5d7-9748db2965de' undefined ) @@ -26,7 +27,7 @@ export const collateralAcquiredAtom = atom((get) => { ) ) }) -export const collateralPanelOpenAtom = atom(false) +export const collateralPanelOpenAtom = atom(true) export const currentAsyncSwapTabAtom = atom<'mint' | 'redeem'>('mint') export const showAsyncSwapSettingsAtom = atom(false) export const asyncSwapInputAtom = atomWithReset('') diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index fccae8203..03d3536e5 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -1,14 +1,33 @@ import { cn } from '@/lib/utils' -import { useAtomValue } from 'jotai' -import { useEffect, useState } from 'react' +import { useAtom, useAtomValue } from 'jotai' +import { atom } from 'jotai' +import { useEffect, useMemo } from 'react' import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' import CowSwapOrder from './cowswap-order' +const STATUS_ORDER_MAP = { + open: 1, + scheduled: 1, + active: 1, + solved: 2, + executing: 1, + traded: 2, + cancelled: 0, +} + +const isVisibleAtom = atom(false) +const shouldRenderAtom = atom(false) +export const showCollateralsAtom = atom((get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + const open = get(collateralPanelOpenAtom) + return asyncSwapResponse && open +}) + const Collaterals = () => { const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const open = useAtomValue(collateralPanelOpenAtom) - const [isVisible, setIsVisible] = useState(false) - const [shouldRender, setShouldRender] = useState(false) + const [isVisible, setIsVisible] = useAtom(isVisibleAtom) + const [shouldRender, setShouldRender] = useAtom(shouldRenderAtom) useEffect(() => { if (asyncSwapResponse && open) { @@ -20,20 +39,29 @@ const Collaterals = () => { const timer = setTimeout(() => setShouldRender(false), 300) return () => clearTimeout(timer) } - }, [asyncSwapResponse, open]) - - if (!shouldRender) return null + }, [asyncSwapResponse, open, setIsVisible, setShouldRender]) const { cowswapOrders = [] } = asyncSwapResponse || {} + const sortedOrders = useMemo( + () => + cowswapOrders.sort( + (a, b) => + STATUS_ORDER_MAP[a.status.type] - STATUS_ORDER_MAP[b.status.type] + ), + [cowswapOrders] + ) + + if (!shouldRender) return null + return (
- {cowswapOrders.map((order) => ( + {sortedOrders.map((order) => ( ))}
diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index fa304a97d..d4a42345c 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -10,6 +10,7 @@ import { useEffect } from 'react' import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' import ZapSettings from '../../overview/components/zap-mint/zap-settings' +import Updater from '../manual/updater' import AsyncMint from './async-mint' import AsyncRedeem from './async-redeem' import { @@ -24,11 +25,43 @@ import { selectedTokenAtom, showAsyncSwapSettingsAtom, } from './atom' -import Collaterals from './collaterals' +import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' import OrderStatusUpdater from './order-status-updater' import Success from './success' -import Updater from '../manual/updater' + +function Content() { + const showSettings = useAtomValue(showAsyncSwapSettingsAtom) + const showCollaterals = useAtomValue(showCollateralsAtom) + + return ( +
+
+
+ + + + + + +
+
+
+ + +
+
+ ) +} const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') @@ -152,27 +185,7 @@ const AsyncSwaps = () => {
)} -
-
-
- - - - - - -
-
-
- - -
-
+
From fe2cd30a3e84e36d54397d3260c6afd0ef1da775 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 22 May 2025 11:11:01 -0300 Subject: [PATCH 28/85] wip: integration --- package.json | 7 +- src/abis/CowSwapSettlement.ts | 329 ++++++++++++++++++ src/components/ui/label.tsx | 12 +- src/components/ui/toggle.tsx | 2 - .../issuance/async-swaps/async-mint/index.tsx | 24 +- .../async-mint/submit-mint-orders.tsx | 218 +----------- .../index-dtf/issuance/async-swaps/atom.ts | 6 +- .../async-swaps/hooks/useFolioDetails.ts | 56 +++ .../async-swaps/hooks/useOrderStatus.ts | 40 +++ .../issuance/async-swaps/hooks/useQuote.ts | 176 ++++++++++ .../async-swaps/hooks/useQuoteSignatures.ts | 205 +++++++++++ .../index-dtf/issuance/async-swaps/index.tsx | 122 ++++--- .../providers/GlobalProtocolKitProvider.tsx | 61 ++++ .../index-dtf/issuance/async-swaps/types.ts | 25 ++ 14 files changed, 987 insertions(+), 296 deletions(-) create mode 100644 src/abis/CowSwapSettlement.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useFolioDetails.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx diff --git a/package.json b/package.json index 8e9d7cda8..ca7d628c5 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "type": "module", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", + "@cowprotocol/cow-sdk": "^5.10.3", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", @@ -32,7 +33,7 @@ "@radix-ui/react-toggle": "^1.1.1", "@radix-ui/react-toggle-group": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.8", - "@rainbow-me/rainbowkit": "2.2.3", + "@rainbow-me/rainbowkit": "^2.2.5", "@react-spring/web": "^9.7.1", "@reserve-protocol/rtokens": "^1.1.23", "@tanstack/react-query": "5.61.0", @@ -76,8 +77,8 @@ "tailwindcss-animate": "^1.0.7", "theme-ui": "0.17.1", "vaul": "^1.1.1", - "viem": "2.23.0", - "wagmi": "2.14.11", + "viem": "^2.30.0", + "wagmi": "^2.15.4", "zod": "^3.23.8" }, "scripts": { diff --git a/src/abis/CowSwapSettlement.ts b/src/abis/CowSwapSettlement.ts new file mode 100644 index 000000000..e160e3d62 --- /dev/null +++ b/src/abis/CowSwapSettlement.ts @@ -0,0 +1,329 @@ +export default [ + { + inputs: [ + { + internalType: 'contract GPv2Authentication', + name: 'authenticator_', + type: 'address', + }, + { internalType: 'contract IVault', name: 'vault_', type: 'address' }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'target', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes4', + name: 'selector', + type: 'bytes4', + }, + ], + name: 'Interaction', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: false, + internalType: 'bytes', + name: 'orderUid', + type: 'bytes', + }, + ], + name: 'OrderInvalidated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: false, + internalType: 'bytes', + name: 'orderUid', + type: 'bytes', + }, + { indexed: false, internalType: 'bool', name: 'signed', type: 'bool' }, + ], + name: 'PreSignature', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'solver', + type: 'address', + }, + ], + name: 'Settlement', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: false, + internalType: 'contract IERC20', + name: 'sellToken', + type: 'address', + }, + { + indexed: false, + internalType: 'contract IERC20', + name: 'buyToken', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'sellAmount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'buyAmount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'feeAmount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes', + name: 'orderUid', + type: 'bytes', + }, + ], + name: 'Trade', + type: 'event', + }, + { + inputs: [], + name: 'authenticator', + outputs: [ + { + internalType: 'contract GPv2Authentication', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'domainSeparator', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], + name: 'filledAmount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes[]', name: 'orderUids', type: 'bytes[]' }], + name: 'freeFilledAmountStorage', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes[]', name: 'orderUids', type: 'bytes[]' }], + name: 'freePreSignatureStorage', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: 'offset', type: 'uint256' }, + { internalType: 'uint256', name: 'length', type: 'uint256' }, + ], + name: 'getStorageAt', + outputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes', name: 'orderUid', type: 'bytes' }], + name: 'invalidateOrder', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], + name: 'preSignature', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes', name: 'orderUid', type: 'bytes' }, + { internalType: 'bool', name: 'signed', type: 'bool' }, + ], + name: 'setPreSignature', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'contract IERC20[]', name: 'tokens', type: 'address[]' }, + { internalType: 'uint256[]', name: 'clearingPrices', type: 'uint256[]' }, + { + components: [ + { internalType: 'uint256', name: 'sellTokenIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'buyTokenIndex', type: 'uint256' }, + { internalType: 'address', name: 'receiver', type: 'address' }, + { internalType: 'uint256', name: 'sellAmount', type: 'uint256' }, + { internalType: 'uint256', name: 'buyAmount', type: 'uint256' }, + { internalType: 'uint32', name: 'validTo', type: 'uint32' }, + { internalType: 'bytes32', name: 'appData', type: 'bytes32' }, + { internalType: 'uint256', name: 'feeAmount', type: 'uint256' }, + { internalType: 'uint256', name: 'flags', type: 'uint256' }, + { internalType: 'uint256', name: 'executedAmount', type: 'uint256' }, + { internalType: 'bytes', name: 'signature', type: 'bytes' }, + ], + internalType: 'struct GPv2Trade.Data[]', + name: 'trades', + type: 'tuple[]', + }, + { + components: [ + { internalType: 'address', name: 'target', type: 'address' }, + { internalType: 'uint256', name: 'value', type: 'uint256' }, + { internalType: 'bytes', name: 'callData', type: 'bytes' }, + ], + internalType: 'struct GPv2Interaction.Data[][3]', + name: 'interactions', + type: 'tuple[][3]', + }, + ], + name: 'settle', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'targetContract', type: 'address' }, + { internalType: 'bytes', name: 'calldataPayload', type: 'bytes' }, + ], + name: 'simulateDelegatecall', + outputs: [{ internalType: 'bytes', name: 'response', type: 'bytes' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'targetContract', type: 'address' }, + { internalType: 'bytes', name: 'calldataPayload', type: 'bytes' }, + ], + name: 'simulateDelegatecallInternal', + outputs: [{ internalType: 'bytes', name: 'response', type: 'bytes' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { internalType: 'bytes32', name: 'poolId', type: 'bytes32' }, + { internalType: 'uint256', name: 'assetInIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'assetOutIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + { internalType: 'bytes', name: 'userData', type: 'bytes' }, + ], + internalType: 'struct IVault.BatchSwapStep[]', + name: 'swaps', + type: 'tuple[]', + }, + { internalType: 'contract IERC20[]', name: 'tokens', type: 'address[]' }, + { + components: [ + { internalType: 'uint256', name: 'sellTokenIndex', type: 'uint256' }, + { internalType: 'uint256', name: 'buyTokenIndex', type: 'uint256' }, + { internalType: 'address', name: 'receiver', type: 'address' }, + { internalType: 'uint256', name: 'sellAmount', type: 'uint256' }, + { internalType: 'uint256', name: 'buyAmount', type: 'uint256' }, + { internalType: 'uint32', name: 'validTo', type: 'uint32' }, + { internalType: 'bytes32', name: 'appData', type: 'bytes32' }, + { internalType: 'uint256', name: 'feeAmount', type: 'uint256' }, + { internalType: 'uint256', name: 'flags', type: 'uint256' }, + { internalType: 'uint256', name: 'executedAmount', type: 'uint256' }, + { internalType: 'bytes', name: 'signature', type: 'bytes' }, + ], + internalType: 'struct GPv2Trade.Data', + name: 'trade', + type: 'tuple', + }, + ], + name: 'swap', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'vault', + outputs: [{ internalType: 'contract IVault', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'vaultRelayer', + outputs: [ + { internalType: 'contract GPv2VaultRelayer', name: '', type: 'address' }, + ], + stateMutability: 'view', + type: 'function', + }, + { stateMutability: 'payable', type: 'receive' }, +] as const diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index 534182176..841669ee9 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -1,13 +1,11 @@ -"use client" +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' +import { cva, type VariantProps } from 'class-variance-authority' -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils' const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" + 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70' ) const Label = React.forwardRef< diff --git a/src/components/ui/toggle.tsx b/src/components/ui/toggle.tsx index 017e46a47..bd6d59d06 100644 --- a/src/components/ui/toggle.tsx +++ b/src/components/ui/toggle.tsx @@ -1,5 +1,3 @@ -'use client' - import * as React from 'react' import * as TogglePrimitive from '@radix-ui/react-toggle' import { cva, type VariantProps } from 'class-variance-authority' diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index a5c558f80..af22dcc01 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -1,9 +1,8 @@ -import Swap, { +import { ArrowSeparator, TokenInputBox, TokenOutputBox, } from '@/components/ui/swap' -import useAsyncSwap from '@/hooks/useAsyncSwap' import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' @@ -30,6 +29,7 @@ import { slippageAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' +import { useQuotesForMint } from '../hooks/useQuote' import SubmitMint from './submit-mint-orders' const AsyncMint = () => { @@ -58,14 +58,8 @@ const AsyncMint = () => { parseUnits(inputAmount, selectedToken.decimals) > (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ - dtf: indexDTF?.id, - amountOut: amountOutWei.toString(), - slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, - disabled: insufficientBalance || ongoingTx, - dtfTicker: indexDTF?.token.symbol || '', - type: 'mint', - }) + const { data, isLoading, isFetching, refetch, failureReason } = + useQuotesForMint() const { loadingAfterRefetch } = useLoadingAfterRefetch(data) @@ -142,15 +136,7 @@ const AsyncMint = () => { isMinting ? 'bg-background' : 'bg-card' )} > - {!orderSubmitted && ( - - )} + {!orderSubmitted && } {orderSubmitted && }
diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index f1fe76be0..149bf9e51 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -1,215 +1,13 @@ import { Button } from '@/components/ui/button' -import { chainIdAtom, walletAtom } from '@/state/atoms' -import { RESERVE_API } from '@/utils/constants' -import { useAtomValue, useSetAtom } from 'jotai' -import { useCallback, useState } from 'react' -import { Address, erc20Abi } from 'viem' -import { useAccount, usePublicClient, useWalletClient } from 'wagmi' -import { asyncSwapOrderIdAtom, collateralPanelOpenAtom } from '../atom' -import { AsyncSwapResponse } from '../types' import { cn } from '@/lib/utils' - -const COWSWAP_VAULT_RELAYER = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' -const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' -const USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' +import { useQuoteSignatures } from '../hooks/useQuoteSignatures' type SubmitMintProps = { - data?: AsyncSwapResponse - dtfAddress: string - amountOut: string - operation: string loadingQuote?: boolean } -const SubmitMint = ({ - data, - dtfAddress, - amountOut, - operation, - loadingQuote, -}: SubmitMintProps) => { - const { cowswapQuotes } = data || {} - const [isSigning, setIsSigning] = useState(false) - const [isApproving, setIsApproving] = useState(false) - const { address: signerAddress } = useAccount() - const chainId = useAtomValue(chainIdAtom) - const account = useAtomValue(walletAtom) - const publicClient = usePublicClient() - const { data: walletClient } = useWalletClient() - const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) - const setCollateralPanelOpen = useSetAtom(collateralPanelOpenAtom) - - const approveVaultRelayer = useCallback(async () => { - if (!signerAddress || !publicClient || !walletClient) return - - try { - setIsApproving(true) - - // Check current allowance - const allowance = await publicClient.readContract({ - address: USDC_ADDRESS as Address, - abi: erc20Abi, - functionName: 'allowance', - args: [signerAddress, COWSWAP_VAULT_RELAYER as Address], - }) - - if (allowance > 0n) { - console.log('CoWSwap VaultRelayer already approved for USDC') - return true - } - - // Simulate approval - const { request } = await publicClient.simulateContract({ - account: signerAddress, - address: USDC_ADDRESS as Address, - abi: erc20Abi, - functionName: 'approve', - args: [ - COWSWAP_VAULT_RELAYER as Address, - BigInt(2) ** BigInt(256) - BigInt(1), - ], - }) - - // Send approval transaction - const hash = await walletClient.writeContract(request) - console.log('VaultRelayer approval transaction sent:', hash) - - // Wait for confirmation - const receipt = await publicClient.waitForTransactionReceipt({ hash }) - console.log('VaultRelayer approval completed:', receipt.status) - - return receipt.status === 'success' - } catch (error) { - console.error('Error approving VaultRelayer:', error) - return false - } finally { - setIsApproving(false) - } - }, [signerAddress, publicClient, walletClient]) - - const handleSubmit = useCallback(async () => { - if ( - !cowswapQuotes?.length || - !signerAddress || - !chainId || - !walletClient || - !account - ) - return - - setIsSigning(true) - try { - const signedCowswapOrders = await Promise.all( - cowswapQuotes.map(async (quote) => { - const typedData = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Order: [ - { name: 'sellToken', type: 'address' }, - { name: 'buyToken', type: 'address' }, - { name: 'receiver', type: 'address' }, - { name: 'sellAmount', type: 'uint256' }, - { name: 'buyAmount', type: 'uint256' }, - { name: 'validTo', type: 'uint32' }, - { name: 'appData', type: 'bytes32' }, - { name: 'feeAmount', type: 'uint256' }, - { name: 'kind', type: 'string' }, - { name: 'partiallyFillable', type: 'bool' }, - { name: 'sellTokenBalance', type: 'string' }, - { name: 'buyTokenBalance', type: 'string' }, - ], - }, - domain: { - name: 'Gnosis Protocol', - version: 'v2', - chainId: BigInt(chainId), - verifyingContract: COWSWAP_SETTLEMENT, - }, - primaryType: 'Order', - message: { - ...quote.quote.quote, - sellAmount: BigInt(quote.quote.quote.sellAmount), - buyAmount: BigInt(quote.quote.quote.buyAmount), - feeAmount: 0n, - }, - } as const - - const signature = await walletClient.signTypedData({ - account, - domain: typedData.domain, - types: typedData.types, - primaryType: typedData.primaryType, - message: typedData.message, - }) - - return { - quote: quote.quote, - orderSigningResult: { - signature, - signingScheme: 'eip712', - }, - } - }) - ) - - // 2. Approve Vault Relayer - const approved = await approveVaultRelayer() - if (!approved) { - throw new Error('Failed to approve Vault Relayer') - } - - // 3. Prepare signed orders for API submission - const signedOrders = { - universalOrders: [], // Empty for now as per requirements - cowswapOrders: signedCowswapOrders, - } - - // 4. Submit signed orders to API - const response = await fetch(`${RESERVE_API}async-swap/order`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - dtf: dtfAddress, - chainId, - amountOut, - operation, - signer: signerAddress, - signedOrders, - }), - }) - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`) - } - - const data = await response.json() - setAsyncSwapOrderId(data.swapOrderId) - setCollateralPanelOpen(true) - console.log('swapOrderId', data.swapOrderId) - - console.log('Orders submitted successfully:', data) - } catch (error) { - console.error('Error processing orders:', error) - } finally { - setIsSigning(false) - } - }, [ - cowswapQuotes, - signerAddress, - chainId, - dtfAddress, - amountOut, - operation, - approveVaultRelayer, - ]) - - const isDisabled = - !cowswapQuotes?.length || isSigning || isApproving || loadingQuote +const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { + const { mutate, data: orderData, isPending } = useQuoteSignatures() return (
@@ -217,14 +15,12 @@ const SubmitMint = ({ size="lg" className={cn( 'w-full rounded-xl', - isDisabled && 'opacity-50 cursor-not-allowed' + isPending && 'opacity-50 cursor-not-allowed' )} - onClick={handleSubmit} - disabled={isDisabled} + onClick={() => mutate()} + disabled={isPending} > - {isApproving ? ( - 'Approving...' - ) : isSigning ? ( + {isPending ? ( 'Signing...' ) : loadingQuote ? ( 'Awaiting Quote' diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index b994b7912..4f2f6bdef 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -2,10 +2,11 @@ import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' +import { EnrichedOrder } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther } from 'viem' -import { AsyncSwapOrderResponse } from './types' +import { AsyncSwapOrderResponse, QuoteAggregated } from './types' const ASYNC_SWAP_BUFFER = 0.005 @@ -88,3 +89,6 @@ export const mintValueWeiAtom = atom((get) => { }) export const redeemAssetsAtom = atom>({}) + +export const quotesAtom = atom>({}) +export const ordersAtom = atom([]) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useFolioDetails.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useFolioDetails.ts new file mode 100644 index 000000000..25adbc75b --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useFolioDetails.ts @@ -0,0 +1,56 @@ +import dtfIndexAbi from '@/abis/dtf-index-abi' +import { chainIdAtom } from '@/state/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { useAtomValue } from 'jotai' +import { parseUnits } from 'viem' +import { useReadContracts } from 'wagmi' + +interface UseFolioDetailsProps { + shares?: bigint +} + +export function useFolioDetails({ + shares = parseUnits('1', 18), +}: UseFolioDetailsProps) { + const indexDTF = useAtomValue(indexDTFAtom) + const chainId = useAtomValue(chainIdAtom) + + if (!indexDTF) { + return { + data: { + assets: [], + redeemValues: [], + mintValues: [], + }, + } + } + + return useReadContracts({ + allowFailure: false, + contracts: [ + { + abi: dtfIndexAbi, + address: indexDTF.id, + functionName: 'toAssets', + args: [shares, 0], + chainId, + }, + { + abi: dtfIndexAbi, + address: indexDTF.id, + functionName: 'toAssets', + args: [shares, 1], + chainId, + }, + ], + query: { + select(data) { + return { + assets: data[0][0], + redeemValues: data[0][1], + mintValues: data[1][1], + } + }, + }, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts new file mode 100644 index 000000000..b0b531be0 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts @@ -0,0 +1,40 @@ +import { OrderStatus } from '@cowprotocol/cow-sdk' +import { useQuery } from '@tanstack/react-query' +import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' + +interface UseOrderStatusParams { + orderId: string +} + +export function useOrderStatus({ orderId }: UseOrderStatusParams) { + const { orderBookApi } = useGlobalProtocolKit() + + return useQuery({ + queryKey: ['order/status', orderId], + enabled: !!orderId && !!orderBookApi, + queryFn: async () => { + if (!orderBookApi) { + throw new Error('OrderBookApi not initialized') + } + + const order = await orderBookApi.getOrder(orderId) + + return order + }, + refetchInterval(query) { + if (query.state.data) { + if ( + [ + OrderStatus.FULFILLED, + OrderStatus.EXPIRED, + OrderStatus.CANCELLED, + ].includes(query.state.data.status) + ) { + return false + } + } + + return 3_000 + }, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts new file mode 100644 index 000000000..8fa102698 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -0,0 +1,176 @@ +import { useERC20Balances } from '@/hooks/useERC20Balance' +import useTokensInfo from '@/hooks/useTokensInfo' +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { Token } from '@/types' +import { safeParseEther } from '@/utils' +import { + OrderQuoteSideKindBuy, + OrderQuoteSideKindSell, + PriceQuality, + SigningScheme, +} from '@cowprotocol/cow-sdk' +import { useQuery } from '@tanstack/react-query' +import { useAtomValue, useSetAtom } from 'jotai' +import { Address, zeroAddress } from 'viem' +import { + asyncSwapInputAtom, + currentAsyncSwapTabAtom, + quotesAtom, + selectedTokenOrDefaultAtom, +} from '../atom' +import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' +import { QuoteProvider } from '../types' +import { useFolioDetails } from './useFolioDetails' + +interface UseQuoteParams { + sellToken: Token + buyToken: Token + amount: bigint +} + +export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { + const indexDTF = useAtomValue(indexDTFAtom) + const folioAddress = indexDTF?.id + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const chainId = useAtomValue(chainIdAtom) + const address = useAtomValue(walletAtom) + const setQuotes = useSetAtom(quotesAtom) + + const { orderBookApi } = useGlobalProtocolKit() + + return useQuery({ + queryKey: ['quote/single', sellToken, buyToken, amount, address], + enabled: !!chainId && !!address && !!sellToken && !!buyToken, + queryFn: async ({ signal }) => { + if ( + !folioAddress || + !address || + address == zeroAddress || + buyToken.address == zeroAddress || + sellToken.address == zeroAddress || + !orderBookApi + ) { + throw new Error('useQuote: Invalid params') + } + + // TODO: Add logic for "best quote" response between multiple providers. + try { + if (amount <= 0n) { + throw new Error('useQuote: Amount is 0') + } + + // TODO: Add appData here + const quote = await orderBookApi.getQuote({ + sellToken: sellToken.address, + buyToken: buyToken.address, + from: address, + receiver: address, + validFor: 60 * 15, // 15 minutes + priceQuality: PriceQuality.VERIFIED, + ...(zapDirection === 'redeem' + ? { + kind: OrderQuoteSideKindSell.SELL, + sellAmountBeforeFee: amount.toString(), + } + : { + kind: OrderQuoteSideKindBuy.BUY, + buyAmountAfterFee: amount.toString(), + }), + signingScheme: SigningScheme.PRESIGN, + }) + + // CowSwap orders sometimes return every so slightly different amounts than requested. + if (zapDirection === 'redeem') { + quote.quote.sellAmount = amount.toString() + } else { + quote.quote.buyAmount = amount.toString() + } + + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [folioAddress]: { + success: true, + type: QuoteProvider.CowSwap, + data: quote, + }, + })) + } + + return { + token: zapDirection ? buyToken : sellToken, + success: true, + source: QuoteProvider.CowSwap, + quote, + } + } catch { + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [folioAddress]: { + success: false, + }, + })) + } + + return { + success: false, + } + } + }, + retry: false, + staleTime: Infinity, + }) +} + +export const useQuotesForMint = () => { + const chainId = useAtomValue(chainIdAtom) + const inputAmount = useAtomValue(asyncSwapInputAtom) + const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const folioAmount = safeParseEther(inputAmount) + const quotes = useAtomValue(quotesAtom) + const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) + const { data: balances } = useERC20Balances( + (folioDetails?.assets || []).map((address) => ({ + address, + chainId, + })) + ) + + const { data: tokensInfo } = useTokensInfo( + folioDetails?.assets.map((address) => address as Address) || [] + ) + + return useQuery({ + queryKey: ['quotes/mint', folioDetails?.assets, folioDetails?.mintValues], + queryFn: async () => { + if (!folioDetails || !tokensInfo) { + return {} + } + + await Promise.all( + folioDetails?.assets.map((asset, i) => { + const token = tokensInfo[asset.toLowerCase()] + const mintValue = folioDetails?.mintValues[i] + const walletValue = (balances?.[i] as bigint) ?? 0n + const amount = mintValue - walletValue + + if (amount <= 0n) { + return + } + + return useQuote({ + sellToken: selectedToken, + buyToken: token, + amount, + }) + }) || [] + ) + }, + select: () => { + return quotes + }, + enabled: !!folioDetails && !!tokensInfo, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts new file mode 100644 index 000000000..ed179a51a --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -0,0 +1,205 @@ +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { OrderBalance } from '@cowprotocol/contracts' +import { + OrderCreation, + OrderSigningUtils, + SigningScheme, +} from '@cowprotocol/cow-sdk' +import { useMutation } from '@tanstack/react-query' +import { useAtomValue, useSetAtom } from 'jotai' +import { Address, encodeFunctionData, erc20Abi, Hex, maxUint256 } from 'viem' +import { useSendCalls } from 'wagmi' +import { + currentAsyncSwapTabAtom, + ordersAtom, + quotesAtom, + selectedTokenOrDefaultAtom, +} from '../atom' +import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' +import { QuoteProvider } from '../types' +import CowswapSettlement from '@/abis/CowSwapSettlement' + +const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const +const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const + +export function useQuoteSignatures() { + const chainId = useAtomValue(chainIdAtom) + const address = useAtomValue(walletAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const quoteToken = useAtomValue(selectedTokenOrDefaultAtom).address + const quotes = Object.values(useAtomValue(quotesAtom)) + const setOrders = useSetAtom(ordersAtom) + + const { orderBookApi } = useGlobalProtocolKit() + const { sendCallsAsync } = useSendCalls() + + return useMutation({ + mutationFn: async () => { + if (!address || !orderBookApi || !chainId) { + console.error('No global kit') + return { + orders: [], + } + } + + const successfulQuotes = quotes.filter((quote) => quote.success) + + console.log({ successfulQuotes }) + + if (successfulQuotes.length === 0) { + return { + orders: [], + } + } + + // Generate order IDs and hashed messages for all quotes + const orderData = await Promise.all( + successfulQuotes.map(async (quote) => { + if (quote.success && quote.type === QuoteProvider.CowSwap) { + if (quote.data.quote.sellAmount === '0') { + return null + } + + const modifiedQuote = { + ...quote.data.quote, + feeAmount: '0', + buyAmount: + zapDirection === 'mint' + ? quote.data.quote.buyAmount + : ( + (BigInt(quote.data.quote.buyAmount) * 98n) / + 100n + ).toString(), + sellAmount: + zapDirection === 'mint' + ? ( + (BigInt(quote.data.quote.sellAmount) * 101n) / + 100n + ).toString() + : quote.data.quote.sellAmount, + from: address, + receiver: address!, + signature: address!, + signingScheme: SigningScheme.PRESIGN, + } as const satisfies OrderCreation + + const orderId = await OrderSigningUtils.generateOrderId( + chainId, + { + ...modifiedQuote, + sellTokenBalance: OrderBalance.ERC20, + buyTokenBalance: OrderBalance.ERC20, + }, + { + owner: address, + } + ) + + const encodedPreSignTx = encodeFunctionData({ + abi: CowswapSettlement, + functionName: 'setPreSignature', + args: [orderId.orderId as Hex, true], + }) + + return { + type: QuoteProvider.CowSwap, + data: { + orderId: orderId.orderId, + quote: modifiedQuote, + preSignTx: encodedPreSignTx, + sellToken: modifiedQuote.sellToken, + amount: modifiedQuote.sellAmount, + }, + } + } + + return null + }) + ) + + const validOrderData = orderData.filter((data) => data !== null) + + const txData = validOrderData + .map(({ type, data }) => { + if (type === QuoteProvider.CowSwap) { + return [ + zapDirection === 'redeem' + ? { + to: data.sellToken as Address, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [COWSWAP_VAULT, BigInt(data.amount)], + }), + value: 0n, + } + : null, + { + to: COWSWAP_SETTLEMENT, + data: data.preSignTx, + value: 0n, + }, + ].filter((e) => e !== null) + } + + return null + }) + .filter((data) => data !== null) + .flat() + + if (zapDirection === 'mint') { + txData.unshift({ + to: quoteToken, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [COWSWAP_VAULT, maxUint256], + }), + value: 0n, + }) + } + + // TODO: tx confirmation checks + const txBundle = await sendCallsAsync({ + calls: txData, + account: address, + forceAtomic: true, + }) + + // TODO: Turns out this is buggy + // const receipt = await walletClient.waitForCallsStatus({ + // id: txBundle.id, + // }); + + console.log({ txBundle }) + + // TODO: Wait here until Safe tx is onchain + // I wonder if this is better suited for a different hook tbh + + // TODO: Create an order Index which is independently managed + await Promise.all( + orderData + .filter((e) => e != null) + .map(async ({ data }) => { + const e = await orderBookApi.sendOrder({ + ...data.quote, + from: address, + signature: address, + signingScheme: SigningScheme.PRESIGN, + }) + console.log(data, e) + return e + }) + ) + + setOrders(validOrderData.map(({ data }) => data.orderId)) + + return { + orders: validOrderData.map(({ data }) => data.orderId), + } + }, + onError(error) { + console.error(error) + }, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index d4a42345c..8ce4d179d 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -28,6 +28,7 @@ import { import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' import OrderStatusUpdater from './order-status-updater' +import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Success from './success' function Content() { @@ -63,6 +64,63 @@ function Content() { ) } +const Header = () => { + const [showSettings, setShowSettings] = useAtom(showAsyncSwapSettingsAtom) + const asyncSwapRefetch = useAtomValue(asyncSwapRefetchAtom) + const asyncSwapFetching = useAtomValue(asyncSwapFetchingAtom) + const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) + const input = useAtomValue(asyncSwapInputAtom) + const invalidInput = isNaN(Number(input)) || Number(input) === 0 + + return ( +
+ {showSettings ? ( + + ) : ( + <> +
+ + + Auto Mint + + + Auto Redeem + + +
+
+ + +
+ + )} +
+ ) +} + const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') const isSafeMultisig = useAtomValue(isSafeMultisigAtom) @@ -71,13 +129,8 @@ const AsyncSwaps = () => { const defaultToken = useAtomValue(defaultSelectedTokenAtom) const setSelectedToken = useSetAtom(selectedTokenAtom) const indexDTF = useAtomValue(indexDTFAtom) - const asyncSwapRefetch = useAtomValue(asyncSwapRefetchAtom) - const asyncSwapFetching = useAtomValue(asyncSwapFetchingAtom) - const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) - const input = useAtomValue(asyncSwapInputAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) const mintTxHash = useAtomValue(mintTxHashAtom) - const invalidInput = isNaN(Number(input)) || Number(input) === 0 const { data: balance } = useERC20Balance(indexDTF?.id) @@ -132,53 +185,8 @@ const AsyncSwaps = () => { className="flex flex-col flex-grow" onValueChange={changeTab} > -
- {showSettings ? ( - - ) : ( - <> -
- - - Auto Mint - - - Auto Redeem - - -
-
- - -
- - )} -
+
+ {showSettings && (
@@ -193,4 +201,12 @@ const AsyncSwaps = () => { ) } -export default AsyncSwaps +const AsyncSwapsWithProvider = () => { + return ( + + + + ) +} + +export default AsyncSwapsWithProvider diff --git a/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx b/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx new file mode 100644 index 000000000..34791bd52 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx @@ -0,0 +1,61 @@ +import { chainIdAtom } from '@/state/atoms' +import { OrderBookApi } from '@cowprotocol/cow-sdk' +import { useAtomValue } from 'jotai' +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from 'react' + +type GlobalProtocolKitContextType = { + orderBookApi: OrderBookApi | null +} + +const GlobalProtocolKitContext = createContext({ + orderBookApi: null, +}) + +export const useGlobalProtocolKit = () => useContext(GlobalProtocolKitContext) + +interface GlobalProtocolKitProviderProps { + children: ReactNode +} + +export function GlobalProtocolKitProvider({ + children, +}: GlobalProtocolKitProviderProps) { + const chainId = useAtomValue(chainIdAtom) + + const [orderBookApi, setOrderBookApi] = useState(null) + + useEffect(() => { + if (chainId) { + setOrderBookApi( + new OrderBookApi({ + chainId: chainId, + limiterOpts: { + tokensPerInterval: 4, + interval: 'second', + }, + backoffOpts: { + numOfAttempts: 3, + maxDelay: Infinity, + jitter: 'full', + }, + }) + ) + } + }, [chainId]) + + return ( + + {children} + + ) +} diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index 3082bba20..76d87fda3 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,5 +1,30 @@ +import { Token } from '@/types' +import { OrderQuoteResponse } from '@cowprotocol/cow-sdk' import { Address, Hex } from 'viem' +export enum QuoteProvider { + CowSwap = 'CowSwap', + Universal = 'Universal', +} + +export type QuoteAggregated = + | { + token: Token + success: false + } + | { + token: Token + success: true + type: QuoteProvider.CowSwap + data: OrderQuoteResponse + } + | { + token: Token + success: true + type: QuoteProvider.Universal + data: unknown // TODO: Type Universal Quote Response + } + export type AsyncSwapQuote = { token: string symbol: string From 857347f2922301dedbe6cdddbc79c1bec64da143 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 22 May 2025 11:24:04 -0300 Subject: [PATCH 29/85] chore: fix build --- package-lock.json | 7521 ++++++++++++++++++++++++++++++++++----------- package.json | 1 + vite.config.ts | 5 + 3 files changed, 5677 insertions(+), 1850 deletions(-) diff --git a/package-lock.json b/package-lock.json index a29a8dad0..eb716622a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", + "@cowprotocol/cow-sdk": "^5.10.3", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", @@ -37,7 +38,7 @@ "@radix-ui/react-toggle": "^1.1.1", "@radix-ui/react-toggle-group": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.8", - "@rainbow-me/rainbowkit": "2.2.3", + "@rainbow-me/rainbowkit": "^2.2.5", "@react-spring/web": "^9.7.1", "@reserve-protocol/rtokens": "^1.1.23", "@tanstack/react-query": "5.61.0", @@ -81,8 +82,8 @@ "tailwindcss-animate": "^1.0.7", "theme-ui": "0.17.1", "vaul": "^1.1.1", - "viem": "2.23.0", - "wagmi": "2.14.11", + "viem": "^2.30.0", + "wagmi": "^2.15.4", "zod": "^3.23.8" }, "devDependencies": { @@ -111,6 +112,7 @@ "typescript": "5.6.3", "vite": "5.4.8", "vite-bundle-visualizer": "1.2.1", + "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-static-copy": "^2.1.0", "vite-tsconfig-paths": "^4.2.0" }, @@ -128,8 +130,7 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", - "license": "MIT" + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -157,6 +158,11 @@ "node": ">=6.0.0" } }, + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -2018,7 +2024,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.0.tgz", "integrity": "sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw==", - "license": "Apache-2.0", "dependencies": { "@noble/hashes": "^1.4.0", "clsx": "^1.2.1", @@ -2030,11 +2035,87 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/@cowprotocol/app-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-2.5.1.tgz", + "integrity": "sha512-GvcLQ44ZUHKdSAXiZ+YCaIehtme/OIvbvL/4go1UqNLTj3jDTDkagPh7CH/z2IPwFWTADyNZO/RSzKrW5UDNaA==", + "dependencies": { + "ajv": "^8.11.0", + "cross-fetch": "^3.1.5", + "ipfs-only-hash": "^4.0.0", + "json-stringify-deterministic": "^1.0.8", + "multiformats": "^9.6.4" + }, + "peerDependencies": { + "cross-fetch": "^3.x", + "ethers": "^5.0.0", + "ipfs-only-hash": "^4.x", + "multiformats": "^9.x" + } + }, + "node_modules/@cowprotocol/app-data/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@cowprotocol/contracts": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@cowprotocol/contracts/-/contracts-1.8.0.tgz", + "integrity": "sha512-rMEHo1UBB6k4kRoWejHZNGggg6IBVt7vAd8x0FhEvjxhbq3zlAex61f9HpAcDExJNuvfwwDjsOc/7UGztCzhSw==", + "peerDependencies": { + "ethers": "^5.4.0" + } + }, + "node_modules/@cowprotocol/cow-sdk": { + "version": "5.10.3", + "resolved": "https://registry.npmjs.org/@cowprotocol/cow-sdk/-/cow-sdk-5.10.3.tgz", + "integrity": "sha512-whnfufOmJqJWw7u2HqLt6k+rw8eMH+ywmB++oxG6U6zLBdQihk18mIMz1wrNwfTUk0FFtn8g8nhrQL14oV27rg==", + "dependencies": { + "@cowprotocol/app-data": "^2.4.0", + "@cowprotocol/contracts": "^1.6.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@openzeppelin/merkle-tree": "^1.0.5", + "cross-fetch": "^3.1.5", + "exponential-backoff": "^3.1.1", + "graphql": "^16.3.0", + "graphql-request": "^4.3.0", + "limiter": "^3.0.0" + }, + "peerDependencies": { + "ethers": "^5.7.2" + } + }, + "node_modules/@cowprotocol/cow-sdk/node_modules/form-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cowprotocol/cow-sdk/node_modules/graphql-request": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", + "integrity": "sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==", + "dependencies": { + "cross-fetch": "^3.1.5", + "extract-files": "^9.0.0", + "form-data": "^3.0.0" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", @@ -2092,7 +2173,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.3.tgz", "integrity": "sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==", - "license": "MIT", "engines": { "bun": ">=1", "deno": ">=2", @@ -2626,7 +2706,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", - "license": "MIT", "dependencies": { "@ethereumjs/util": "^8.1.0", "crc-32": "^1.2.0" @@ -2636,7 +2715,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "license": "MPL-2.0", "bin": { "rlp": "bin/rlp" }, @@ -2648,7 +2726,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", - "license": "MPL-2.0", "dependencies": { "@ethereumjs/common": "^3.2.0", "@ethereumjs/rlp": "^4.0.1", @@ -2659,11 +2736,76 @@ "node": ">=14" } }, + "node_modules/@ethereumjs/tx/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/tx/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/tx/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/tx/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/tx/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, "node_modules/@ethereumjs/util": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "license": "MPL-2.0", "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", @@ -2673,6 +2815,72 @@ "node": ">=14" } }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, "node_modules/@ethersproject/abi": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", @@ -2790,6 +2998,26 @@ "@ethersproject/bytes": "^5.8.0" } }, + "node_modules/@ethersproject/basex": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" + } + }, "node_modules/@ethersproject/bignumber": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", @@ -2849,6 +3077,34 @@ "@ethersproject/bignumber": "^5.8.0" } }, + "node_modules/@ethersproject/contracts": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" + } + }, "node_modules/@ethersproject/hash": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", @@ -2876,6 +3132,67 @@ "@ethersproject/strings": "^5.8.0" } }, + "node_modules/@ethersproject/hdnode": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, "node_modules/@ethersproject/keccak256": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", @@ -2931,10 +3248,10 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@ethersproject/properties": { + "node_modules/@ethersproject/pbkdf2": { "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", "funding": [ { "type": "individual", @@ -2945,8 +3262,107 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", + "peer": true, "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", + "bech32": "1.1.4", + "ws": "8.18.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "peer": true, + "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 + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, @@ -2970,6 +3386,27 @@ "@ethersproject/logger": "^5.8.0" } }, + "node_modules/@ethersproject/sha2": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "hash.js": "1.1.7" + } + }, "node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", @@ -2994,6 +3431,30 @@ "hash.js": "1.1.7" } }, + "node_modules/@ethersproject/solidity": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, "node_modules/@ethersproject/strings": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", @@ -3042,6 +3503,60 @@ "@ethersproject/signing-key": "^5.8.0" } }, + "node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" + } + }, "node_modules/@ethersproject/web": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", @@ -3065,6 +3580,29 @@ "@ethersproject/strings": "^5.8.0" } }, + "node_modules/@ethersproject/wordlists": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, "node_modules/@floating-ui/core": { "version": "1.6.9", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", @@ -3691,16 +4229,14 @@ "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" }, "node_modules/@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "license": "BSD-3-Clause", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz", + "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@locator/babel-jsx": { @@ -3772,6 +4308,18 @@ "moo": "^0.5.1" } }, + "node_modules/@metamask/abi-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-2.0.4.tgz", + "integrity": "sha512-StnIgUB75x7a7AgUhiaUZDpCsqGp7VkNnZh2XivXkJ6mPkE83U8ARGQj5MbRis7VJY8BC5V1AbB1fjdh0hupPQ==", + "dependencies": { + "@metamask/superstruct": "^3.1.0", + "@metamask/utils": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@metamask/eth-json-rpc-provider": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", @@ -3789,7 +4337,6 @@ "version": "7.3.3", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz", "integrity": "sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==", - "license": "ISC", "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", @@ -3803,7 +4350,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", - "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", @@ -3823,7 +4369,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", - "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.1.2", "@types/debug": "^4.1.7", @@ -3836,10 +4381,9 @@ } }, "node_modules/@metamask/eth-json-rpc-provider/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "bin": { "semver": "bin/semver.js" }, @@ -3847,24 +4391,10 @@ "node": ">=10" } }, - "node_modules/@metamask/eth-json-rpc-provider/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@metamask/json-rpc-engine": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz", "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==", - "license": "ISC", "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", @@ -3874,11 +4404,40 @@ "node": ">=16.0.0" } }, + "node_modules/@metamask/json-rpc-engine/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-engine/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@metamask/json-rpc-middleware-stream": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz", "integrity": "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==", - "license": "ISC", "dependencies": { "@metamask/json-rpc-engine": "^8.0.2", "@metamask/safe-event-emitter": "^3.0.0", @@ -3889,16 +4448,45 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/object-multiplex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz", - "integrity": "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==", - "license": "ISC", + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.2" - }, - "engines": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@metamask/object-multiplex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz", + "integrity": "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.2" + }, + "engines": { "node": "^16.20 || ^18.16 || >=20" } }, @@ -3906,7 +4494,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz", "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==", - "license": "MIT", "dependencies": { "bowser": "^2.9.0" } @@ -3915,7 +4502,6 @@ "version": "16.1.0", "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz", "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==", - "license": "MIT", "dependencies": { "@metamask/json-rpc-engine": "^8.0.1", "@metamask/json-rpc-middleware-stream": "^7.0.1", @@ -3934,39 +4520,13 @@ "node": "^18.18 || >=20" } }, - "node_modules/@metamask/providers/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@metamask/rpc-errors": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", - "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", - "license": "MIT", - "dependencies": { - "@metamask/utils": "^9.0.0", - "fast-safe-stringify": "^2.0.6" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", - "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", - "license": "ISC", + "node_modules/@metamask/providers/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", "dependencies": { "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.1.0", + "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", @@ -3979,11 +4539,21 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/rpc-errors/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", + "node_modules/@metamask/providers/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metamask/providers/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "bin": { "semver": "bin/semver.js" }, @@ -3991,24 +4561,22 @@ "node": ">=10" } }, - "node_modules/@metamask/rpc-errors/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@metamask/safe-event-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz", "integrity": "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==", - "license": "ISC", "engines": { "node": ">=12.0.0" } @@ -4070,7 +4638,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" } @@ -4079,7 +4646,6 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -4091,23 +4657,29 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/@metamask/sdk/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@metamask/superstruct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz", - "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==", - "license": "MIT", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.2.1.tgz", + "integrity": "sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==", "engines": { "node": ">=16.0.0" } }, "node_modules/@metamask/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", - "license": "ISC", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", "dependencies": { "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.0.0", + "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", @@ -4121,10 +4693,9 @@ } }, "node_modules/@metamask/utils/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "bin": { "semver": "bin/semver.js" }, @@ -4132,103 +4703,10 @@ "node": ">=10" } }, - "node_modules/@metamask/utils/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@motionone/animation": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", - "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", - "license": "MIT", - "dependencies": { - "@motionone/easing": "^10.18.0", - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/dom": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", - "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", - "license": "MIT", - "dependencies": { - "@motionone/animation": "^10.18.0", - "@motionone/generators": "^10.18.0", - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "hey-listen": "^1.0.8", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/easing": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", - "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", - "license": "MIT", - "dependencies": { - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/generators": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", - "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", - "license": "MIT", - "dependencies": { - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/svelte": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz", - "integrity": "sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==", - "license": "MIT", - "dependencies": { - "@motionone/dom": "^10.16.4", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/types": { - "version": "10.17.1", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", - "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", - "license": "MIT" - }, - "node_modules/@motionone/utils": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", - "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", - "license": "MIT", - "dependencies": { - "@motionone/types": "^10.17.1", - "hey-listen": "^1.0.8", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/vue": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz", - "integrity": "sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==", - "deprecated": "Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion", - "license": "MIT", - "dependencies": { - "@motionone/dom": "^10.16.4", - "tslib": "^2.3.1" - } + "node_modules/@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" }, "node_modules/@multiformats/dns": { "version": "1.0.6", @@ -4269,10 +4747,9 @@ } }, "node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "engines": { "node": "^14.21.3 || >=16" }, @@ -4342,12 +4819,20 @@ "node": ">= 8" } }, + "node_modules/@openzeppelin/merkle-tree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@openzeppelin/merkle-tree/-/merkle-tree-1.0.8.tgz", + "integrity": "sha512-E2c9/Y3vjZXwVvPZKqCKUn7upnvam1P1ZhowJyZVQSkzZm5WhumtaRr+wkUXrZVfkIc7Gfrl7xzabElqDL09ow==", + "dependencies": { + "@metamask/abi-utils": "^2.0.4", + "ethereum-cryptography": "^3.0.0" + } + }, "node_modules/@paulmillr/qr": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", "integrity": "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==", "deprecated": "The package is now available as \"qr\": npm install qr", - "license": "(MIT OR Apache-2.0)", "funding": { "url": "https://paulmillr.com/funding/" } @@ -4394,6 +4879,60 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@radix-ui/number": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", @@ -5907,10 +6446,9 @@ "license": "MIT" }, "node_modules/@rainbow-me/rainbowkit": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.3.tgz", - "integrity": "sha512-kXZ+zmKSPZhZdNHey+4TwOIW4p2vIRv5B9+5FoTJv1xktru1RykfAAQY5z+nLUdvc0l6M5hiYH4X88Jl1foXGQ==", - "license": "MIT", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.5.tgz", + "integrity": "sha512-UWEffskEeem1HnHolKvR0FO0haA7CYkm1/M3QlKz/K3gc8N1rjLXit9FG3PJ7l/EKn79VQm25mu8ACkNWBI8sA==", "dependencies": { "@vanilla-extract/css": "1.15.5", "@vanilla-extract/dynamic": "2.1.2", @@ -6028,56 +6566,1377 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@reserve-protocol/rtokens": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/@reserve-protocol/rtokens/-/rtokens-1.1.23.tgz", - "integrity": "sha512-VYP0BNhULhFzAGpzaqe1pkuMpCvLmuNYsYHE0xkKgiqaMZdztSlnCNK2BRlsDbFD/HQZwcoAoYjFpEHQbq2GoA==", - "license": "ISC" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", - "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "node_modules/@reown/appkit": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.3.tgz", + "integrity": "sha512-aA/UIwi/dVzxEB62xlw3qxHa3RK1YcPMjNxoGj/fHNCqL2qWmbcOXT7coCUa9RG7/Bh26FZ3vdVT2v71j6hebQ==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-controllers": "1.7.3", + "@reown/appkit-polyfills": "1.7.3", + "@reown/appkit-scaffold-ui": "1.7.3", + "@reown/appkit-ui": "1.7.3", + "@reown/appkit-utils": "1.7.3", + "@reown/appkit-wallet": "1.7.3", + "@walletconnect/types": "2.19.2", + "@walletconnect/universal-provider": "2.19.2", + "bs58": "6.0.0", + "valtio": "1.13.2", + "viem": ">=2.23.11" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", - "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "node_modules/@reown/appkit-common": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.3.tgz", + "integrity": "sha512-wKTr6N3z8ly17cc51xBEVkZK4zAd8J1m7RubgsdQ1olFY9YJGe61RYoNv9yFjt6tUVeYT+z7iMUwPhX2PziefQ==", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.23.11" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", - "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "node_modules/@reown/appkit-controllers": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.3.tgz", + "integrity": "sha512-aqAcX/nZe0gwqjncyCkVrAk3lEw0qZ9xGrdLOmA207RreO4J0Vxu8OJXCBn4C2AUI2OpBxCPah+vyuKTUJTeHQ==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-wallet": "1.7.3", + "@walletconnect/universal-provider": "2.19.2", + "valtio": "1.13.2", + "viem": ">=2.23.11" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.38.0", + "node_modules/@reown/appkit-controllers/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.2.tgz", + "integrity": "sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.2.tgz", + "integrity": "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==", + "dependencies": { + "@walletconnect/core": "2.19.2", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.2.tgz", + "integrity": "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.2.tgz", + "integrity": "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.2.tgz", + "integrity": "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@reown/appkit-controllers/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@reown/appkit-controllers/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "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 + } + } + }, + "node_modules/@reown/appkit-polyfills": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.3.tgz", + "integrity": "sha512-vQUiAyI7WiNTUV4iNwv27iigdeg8JJTEo6ftUowIrKZ2/gtE2YdMtGpavuztT/qrXhrIlTjDGp5CIyv9WOTu4g==", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@reown/appkit-scaffold-ui": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.3.tgz", + "integrity": "sha512-ssB15fcjmoKQ+VfoCo7JIIK66a4SXFpCH8uK1CsMmXmKIKqPN54ohLo291fniV6mKtnJxh5Xm68slGtGrO3bmA==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-controllers": "1.7.3", + "@reown/appkit-ui": "1.7.3", + "@reown/appkit-utils": "1.7.3", + "@reown/appkit-wallet": "1.7.3", + "lit": "3.1.0" + } + }, + "node_modules/@reown/appkit-ui": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.3.tgz", + "integrity": "sha512-zKmFIjLp0X24pF9KtPtSHmdsh/RjEWIvz+faIbPGm4tQbwcxdg9A35HeoP0rMgKYx49SX51LgPwVXne2gYacqQ==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-controllers": "1.7.3", + "@reown/appkit-wallet": "1.7.3", + "lit": "3.1.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@reown/appkit-ui/node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@reown/appkit-utils": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.3.tgz", + "integrity": "sha512-8/MNhmfri+2uu8WzBhZ5jm5llofOIa1dyXDXRC/hfrmGmCFJdrQKPpuqOFYoimo2s2g70pK4PYefvOKgZOWzgg==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-controllers": "1.7.3", + "@reown/appkit-polyfills": "1.7.3", + "@reown/appkit-wallet": "1.7.3", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.19.2", + "valtio": "1.13.2", + "viem": ">=2.23.11" + }, + "peerDependencies": { + "valtio": "1.13.2" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.2.tgz", + "integrity": "sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.2.tgz", + "integrity": "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==", + "dependencies": { + "@walletconnect/core": "2.19.2", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.2.tgz", + "integrity": "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.2.tgz", + "integrity": "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.2.tgz", + "integrity": "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@reown/appkit-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@reown/appkit-utils/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@reown/appkit-utils/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@reown/appkit-utils/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "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 + } + } + }, + "node_modules/@reown/appkit-wallet": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.3.tgz", + "integrity": "sha512-D0pExd0QUE71ursQPp3pq/0iFrz2oz87tOyFifrPANvH5X0RQCYn/34/kXr+BFVQzNFfCBDlYP+CniNA/S0KiQ==", + "dependencies": { + "@reown/appkit-common": "1.7.3", + "@reown/appkit-polyfills": "1.7.3", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, + "node_modules/@reown/appkit-wallet/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@reown/appkit/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/core": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.2.tgz", + "integrity": "sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.2.tgz", + "integrity": "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==", + "dependencies": { + "@walletconnect/core": "2.19.2", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/types": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.2.tgz", + "integrity": "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.2.tgz", + "integrity": "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/utils": "2.19.2", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/utils": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.2.tgz", + "integrity": "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.2", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@reown/appkit/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@reown/appkit/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@reown/appkit/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@reown/appkit/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "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 + } + } + }, + "node_modules/@reserve-protocol/rtokens": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@reserve-protocol/rtokens/-/rtokens-1.1.23.tgz", + "integrity": "sha512-VYP0BNhULhFzAGpzaqe1pkuMpCvLmuNYsYHE0xkKgiqaMZdztSlnCNK2BRlsDbFD/HQZwcoAoYjFpEHQbq2GoA==", + "license": "ISC" + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", + "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.38.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", "cpu": [ @@ -6321,10 +8180,9 @@ "license": "MIT" }, "node_modules/@safe-global/safe-apps-provider": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz", - "integrity": "sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==", - "license": "MIT", + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", + "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", "dependencies": { "@safe-global/safe-apps-sdk": "^9.1.0", "events": "^3.3.0" @@ -6334,52 +8192,83 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", - "license": "MIT", "dependencies": { "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", "viem": "^2.1.1" } }, "node_modules/@safe-global/safe-gateway-typescript-sdk": { - "version": "3.22.9", - "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.22.9.tgz", - "integrity": "sha512-7ojVK/crhOaGowEO8uYWaopZzcr5rR76emgllGIfjCLR70aY4PbASpi9Pbs+7jIRzPDBBkM0RBo+zYx5UduX8Q==", - "license": "MIT", + "version": "3.23.1", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", + "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", "engines": { "node": ">=16" } }, "node_modules/@scure/base": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz", - "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==", - "license": "MIT", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.5.tgz", + "integrity": "sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "license": "MIT", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "license": "MIT", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -6394,1177 +8283,1569 @@ "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, - "node_modules/@stablelib/aead": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz", - "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==", + "node_modules/@styled-system/background": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", + "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/border": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", + "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/color": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", + "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", + "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/@styled-system/css": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", + "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==", "license": "MIT" }, - "node_modules/@stablelib/binary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", - "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "node_modules/@styled-system/flexbox": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", + "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/grid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", + "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/layout": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", + "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/position": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", + "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", "license": "MIT", "dependencies": { - "@stablelib/int": "^1.0.1" + "@styled-system/core": "^5.1.2" } }, - "node_modules/@stablelib/bytes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", - "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==", - "license": "MIT" - }, - "node_modules/@stablelib/chacha": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz", - "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==", + "node_modules/@styled-system/shadow": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", + "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", "license": "MIT", "dependencies": { - "@stablelib/binary": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@styled-system/core": "^5.1.2" } }, - "node_modules/@stablelib/chacha20poly1305": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz", - "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==", + "node_modules/@styled-system/should-forward-prop": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz", + "integrity": "sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q==", "license": "MIT", "dependencies": { - "@stablelib/aead": "^1.0.1", - "@stablelib/binary": "^1.0.1", - "@stablelib/chacha": "^1.0.1", - "@stablelib/constant-time": "^1.0.1", - "@stablelib/poly1305": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@emotion/is-prop-valid": "^0.8.1", + "@emotion/memoize": "^0.7.1", + "styled-system": "^5.1.5" } }, - "node_modules/@stablelib/constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", - "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==", + "node_modules/@styled-system/should-forward-prop/node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==", "license": "MIT" }, - "node_modules/@stablelib/ed25519": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", - "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "node_modules/@styled-system/space": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", + "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", "license": "MIT", "dependencies": { - "@stablelib/random": "^1.0.2", - "@stablelib/sha512": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@styled-system/core": "^5.1.2" } }, - "node_modules/@stablelib/hash": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", - "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==", - "license": "MIT" - }, - "node_modules/@stablelib/hkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz", - "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==", + "node_modules/@styled-system/typography": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", + "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", "license": "MIT", "dependencies": { - "@stablelib/hash": "^1.0.1", - "@stablelib/hmac": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@styled-system/core": "^5.1.2" } }, - "node_modules/@stablelib/hmac": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", - "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", + "node_modules/@styled-system/variant": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", + "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", "license": "MIT", "dependencies": { - "@stablelib/constant-time": "^1.0.1", - "@stablelib/hash": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@styled-system/core": "^5.1.2", + "@styled-system/css": "^5.1.5" } }, - "node_modules/@stablelib/int": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", - "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", - "license": "MIT" - }, - "node_modules/@stablelib/keyagreement": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", - "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", + "node_modules/@tanstack/query-core": { + "version": "5.60.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.6.tgz", + "integrity": "sha512-tI+k0KyCo1EBJ54vxK1kY24LWj673ujTydCZmzEZKAew4NqZzTaVQJEuaG1qKj2M03kUHN46rchLRd+TxVq/zQ==", "license": "MIT", - "dependencies": { - "@stablelib/bytes": "^1.0.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@stablelib/poly1305": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", - "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", + "node_modules/@tanstack/react-query": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.61.0.tgz", + "integrity": "sha512-SBzV27XAeCRBOQ8QcC94w2H1Md0+LI0gTWwc3qRJoaGuewKn5FNW4LSqwPFJZVEItfhMfGT7RpZuSFXjTi12pQ==", "license": "MIT", "dependencies": { - "@stablelib/constant-time": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@tanstack/query-core": "5.60.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" } }, - "node_modules/@stablelib/random": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", - "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "node_modules/@tanstack/react-table": { + "version": "8.20.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", + "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", "license": "MIT", "dependencies": { - "@stablelib/binary": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/@stablelib/sha256": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz", - "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==", + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", "license": "MIT", - "dependencies": { - "@stablelib/binary": "^1.0.1", - "@stablelib/hash": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@stablelib/sha512": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", - "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@stablelib/binary": "^1.0.1", - "@stablelib/hash": "^1.0.1", - "@stablelib/wipe": "^1.0.1" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@stablelib/wipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", - "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", - "license": "MIT" - }, - "node_modules/@stablelib/x25519": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", - "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, "license": "MIT", "dependencies": { - "@stablelib/keyagreement": "^1.0.1", - "@stablelib/random": "^1.0.2", - "@stablelib/wipe": "^1.0.1" + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@styled-system/background": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", - "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@styled-system/border": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", - "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@styled-system/color": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", - "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@styled-system/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", - "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", - "license": "MIT", + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "object-assign": "^4.1.1" + "deep-equal": "^2.0.5" } }, - "node_modules/@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==", - "license": "MIT" + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } }, - "node_modules/@styled-system/flexbox": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", - "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "node_modules/@theme-ui/color-modes": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.17.2.tgz", + "integrity": "sha512-VSycDWzmEPZwZyJGbA83yKPzjzWzE88FQPRKT3QMHsvoD5dUXlF5tFOg0gEPu2cMhKbSWLCFi/Rtj7ANJDSF/w==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@theme-ui/core": "^0.17.2", + "@theme-ui/css": "^0.17.2", + "deepmerge": "^4.2.2" + }, + "peerDependencies": { + "@emotion/react": "^11.13.3", + "react": ">=18" } }, - "node_modules/@styled-system/grid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", - "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "node_modules/@theme-ui/components": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.17.2.tgz", + "integrity": "sha512-CJeflLU2P6g+B7xn0NsAaWBiRlN3BknYX8lozTBlRwg53sHlHsbQzumtVerlWUlIa+muMx8kCxJYypYBAiaHhg==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@styled-system/color": "^5.1.2", + "@styled-system/should-forward-prop": "^5.1.2", + "@styled-system/space": "^5.1.2", + "@theme-ui/core": "^0.17.2", + "@theme-ui/css": "^0.17.2", + "@types/styled-system": "^5.1.13" + }, + "peerDependencies": { + "@emotion/react": "^11.13.3", + "@theme-ui/theme-provider": "^0.17.2", + "react": ">=18" } }, - "node_modules/@styled-system/layout": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", - "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", + "node_modules/@theme-ui/core": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.17.2.tgz", + "integrity": "sha512-PMBaFCh/9HTlUZJFZRxZJoy+w/SVOJCr7v3s7XF5qyGcCuAB5tLv+fjcKpALaZ6QBT1SkHWd07AyTHrs0V2uRw==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@theme-ui/css": "^0.17.2", + "deepmerge": "^4.2.2" + }, + "peerDependencies": { + "@emotion/react": "^11.13.3", + "react": ">=18" } }, - "node_modules/@styled-system/position": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", - "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", + "node_modules/@theme-ui/css": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.17.2.tgz", + "integrity": "sha512-sYeurC8WbZBLumt8qO7rM6ZDyvneMh6JojeZov3uwu4Ty2iis8rhqGGK8LD1SfwsWcV8pu3AivQ9xyvWZeaQrw==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "csstype": "^3.0.10" + }, + "peerDependencies": { + "@emotion/react": "^11.11.1" } }, - "node_modules/@styled-system/shadow": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", - "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", + "node_modules/@theme-ui/global": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/global/-/global-0.17.2.tgz", + "integrity": "sha512-yH4Gv/ESDKlxDLz0u5lR3EWAZLfnb4T0Zn1d1LnO7mHv/9dVbF+MA/ogCWLi8Xvs5/u1+RMSJkPfHWfw+Xp5AQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@theme-ui/core": "^0.17.2", + "@theme-ui/css": "^0.17.2" + }, + "peerDependencies": { + "@emotion/react": "^11.13.3", + "react": ">=18" } }, - "node_modules/@styled-system/should-forward-prop": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz", - "integrity": "sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q==", + "node_modules/@theme-ui/theme-provider": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.17.2.tgz", + "integrity": "sha512-Y454eONQU42xHaA6oyWmc3+ViRnKjpi0SAh9zFcz+WmJ2SJVZQ4A8XWXnJHjpq38DFju/AyeEfI4puZRHTkgjQ==", "license": "MIT", "dependencies": { - "@emotion/is-prop-valid": "^0.8.1", - "@emotion/memoize": "^0.7.1", - "styled-system": "^5.1.5" + "@theme-ui/color-modes": "^0.17.2", + "@theme-ui/core": "^0.17.2", + "@theme-ui/css": "^0.17.2" + }, + "peerDependencies": { + "@emotion/react": "^11.13.3", + "react": ">=18" } }, - "node_modules/@styled-system/should-forward-prop/node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, "license": "MIT" }, - "node_modules/@styled-system/space": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", - "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@styled-system/typography": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", - "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@babel/types": "^7.0.0" } }, - "node_modules/@styled-system/variant": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", - "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2", - "@styled-system/css": "^5.1.5" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@tanstack/query-core": { - "version": "5.60.6", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.6.tgz", - "integrity": "sha512-tI+k0KyCo1EBJ54vxK1kY24LWj673ujTydCZmzEZKAew4NqZzTaVQJEuaG1qKj2M03kUHN46rchLRd+TxVq/zQ==", + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "dependencies": { + "@babel/types": "^7.20.7" } }, - "node_modules/@tanstack/react-query": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.61.0.tgz", - "integrity": "sha512-SBzV27XAeCRBOQ8QcC94w2H1Md0+LI0gTWwc3qRJoaGuewKn5FNW4LSqwPFJZVEItfhMfGT7RpZuSFXjTi12pQ==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", + "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==", + "license": "MIT" + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.60.6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" + "@types/d3-color": "*" } }, - "node_modules/@tanstack/react-table": { - "version": "8.20.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", - "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "license": "MIT", "dependencies": { - "@tanstack/table-core": "8.20.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "@types/d3-time": "*" } }, - "node_modules/@tanstack/table-core": { - "version": "8.20.5", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", - "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "dependencies": { + "@types/d3-path": "*" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" } }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dev": true, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", "license": "MIT", "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" + "@types/node": "*" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" + "@types/unist": "^2" } }, - "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "node_modules/@types/humanize-duration": { + "version": "3.27.4", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.27.4.tgz", + "integrity": "sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dev": true, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "deep-equal": "^2.0.5" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=10" }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@theme-ui/color-modes": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.17.2.tgz", - "integrity": "sha512-VSycDWzmEPZwZyJGbA83yKPzjzWzE88FQPRKT3QMHsvoD5dUXlF5tFOg0gEPu2cMhKbSWLCFi/Rtj7ANJDSF/w==", + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, "license": "MIT", "dependencies": { - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2", - "deepmerge": "^4.2.2" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@theme-ui/components": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.17.2.tgz", - "integrity": "sha512-CJeflLU2P6g+B7xn0NsAaWBiRlN3BknYX8lozTBlRwg53sHlHsbQzumtVerlWUlIa+muMx8kCxJYypYBAiaHhg==", - "license": "MIT", - "dependencies": { - "@styled-system/color": "^5.1.2", - "@styled-system/should-forward-prop": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2", - "@types/styled-system": "^5.1.13" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "@theme-ui/theme-provider": "^0.17.2", - "react": ">=18" - } + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" }, - "node_modules/@theme-ui/core": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.17.2.tgz", - "integrity": "sha512-PMBaFCh/9HTlUZJFZRxZJoy+w/SVOJCr7v3s7XF5qyGcCuAB5tLv+fjcKpALaZ6QBT1SkHWd07AyTHrs0V2uRw==", + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "license": "MIT", "dependencies": { - "@theme-ui/css": "^0.17.2", - "deepmerge": "^4.2.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" + "@types/unist": "^2" } }, - "node_modules/@theme-ui/css": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.17.2.tgz", - "integrity": "sha512-sYeurC8WbZBLumt8qO7rM6ZDyvneMh6JojeZov3uwu4Ty2iis8rhqGGK8LD1SfwsWcV8pu3AivQ9xyvWZeaQrw==", + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "node_modules/@types/mixpanel-browser": { + "version": "2.54.0", + "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.54.0.tgz", + "integrity": "sha512-7DMzIH0M9TlpCTMZidaeXris+aMUyAgMMEZtV1xeD6fSQgpCGklUKqyRgidq5hKPKuNEOWBp73549Gusig/xBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "license": "MIT", "dependencies": { - "csstype": "^3.0.10" - }, - "peerDependencies": { - "@emotion/react": "^11.11.1" + "undici-types": "~6.19.8" } }, - "node_modules/@theme-ui/global": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/global/-/global-0.17.2.tgz", - "integrity": "sha512-yH4Gv/ESDKlxDLz0u5lR3EWAZLfnb4T0Zn1d1LnO7mHv/9dVbF+MA/ogCWLi8Xvs5/u1+RMSJkPfHWfw+Xp5AQ==", - "license": "MIT", - "dependencies": { - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/@theme-ui/theme-provider": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.17.2.tgz", - "integrity": "sha512-Y454eONQU42xHaA6oyWmc3+ViRnKjpi0SAh9zFcz+WmJ2SJVZQ4A8XWXnJHjpq38DFju/AyeEfI4puZRHTkgjQ==", + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "@theme-ui/color-modes": "^0.17.2", - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" + "@types/react": "*" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "peerDependencies": { + "@types/react": "*" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@types/react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@types/react": "*" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/styled-system": { + "version": "5.1.23", + "resolved": "https://registry.npmjs.org/@types/styled-system/-/styled-system-5.1.23.tgz", + "integrity": "sha512-mIwCCdhDa2ifdQCEm8ZeD8m4UEbFsokqEoT9YNOUv4alUJ8jbMKxvpr+oOwfuZgwqLh5HjWuEzwnX7DzWvjFBg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "csstype": "^3.0.2" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@types/jest": "*" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT" + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, - "node_modules/@types/css-font-loading-module": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", - "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==", + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" + "node_modules/@uiw/copy-to-clipboard": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@uiw/copy-to-clipboard/-/copy-to-clipboard-1.0.17.tgz", + "integrity": "sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==", + "license": "MIT", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "node_modules/@uiw/react-markdown-preview": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@uiw/react-markdown-preview/-/react-markdown-preview-4.2.2.tgz", + "integrity": "sha512-Jy3GtAqcF2pKgvFtgLUEwR8u2t0Yk/DAnLTl6cf1RzhNYcAxm1auDs3KndZRBDP01xhmYLX4KiOcOg/qv+Jc0A==", "license": "MIT", "dependencies": { - "@types/d3-color": "*" + "@babel/runtime": "^7.17.2", + "@uiw/copy-to-clipboard": "~1.0.12", + "react-markdown": "~8.0.0", + "rehype-attr": "~2.1.0", + "rehype-autolink-headings": "~6.1.1", + "rehype-ignore": "^1.0.1", + "rehype-prism-plus": "1.6.3", + "rehype-raw": "^6.1.1", + "rehype-rewrite": "~3.0.6", + "rehype-slug": "~5.1.0", + "remark-gfm": "~3.0.1", + "unist-util-visit": "^4.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "node_modules/@uiw/react-md-editor": { + "version": "3.25.6", + "resolved": "https://registry.npmjs.org/@uiw/react-md-editor/-/react-md-editor-3.25.6.tgz", + "integrity": "sha512-YuDv5KiM931WFYBDCyk9/HvtLdIWk9DXvzC6d1riaLufvchM7IUHkqTkSl3HqmTod1exSN+5ZsUtKZ+S+GAsug==", "license": "MIT", "dependencies": { - "@types/d3-time": "*" + "@babel/runtime": "^7.14.6", + "@uiw/react-markdown-preview": "^4.2.1", + "rehype": "~12.0.1", + "rehype-prism-plus": "~1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "node_modules/@vanilla-extract/css": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.5.tgz", + "integrity": "sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==", "license": "MIT", "dependencies": { - "@types/d3-path": "*" + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.6", + "css-what": "^6.1.0", + "cssesc": "^3.0.0", + "csstype": "^3.0.7", + "dedent": "^1.5.3", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "lru-cache": "^10.4.3", + "media-query-parser": "^2.0.2", + "modern-ahocorasick": "^1.0.0", + "picocolors": "^1.0.0" } }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" + "node_modules/@vanilla-extract/css/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "node_modules/@vanilla-extract/dynamic": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz", + "integrity": "sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==", + "license": "MIT", + "dependencies": { + "@vanilla-extract/private": "^1.0.6" + } + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.6.tgz", + "integrity": "sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==", "license": "MIT" }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@vanilla-extract/sprinkles": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.3.tgz", + "integrity": "sha512-oCHlQeYOBIJIA2yWy2GnY5wE2A7hGHDyJplJo4lb+KEIBcJWRnDJDg8ywDwQS5VfWJrBBO3drzYZPFpWQjAMiQ==", "license": "MIT", - "dependencies": { - "@types/ms": "*" + "peerDependencies": { + "@vanilla-extract/css": "^1.0.0" } }, - "node_modules/@types/dns-packet": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", - "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "node_modules/@viem/anvil": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@viem/anvil/-/anvil-0.0.10.tgz", + "integrity": "sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "execa": "^7.1.1", + "get-port": "^6.1.2", + "http-proxy": "^1.18.1", + "ws": "^8.13.0" } }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "node_modules/@vitejs/plugin-react": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", + "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "license": "MIT", "dependencies": { - "@types/unist": "^2" + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" } }, - "node_modules/@types/humanize-duration": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.27.4.tgz", - "integrity": "sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA==", - "dev": true, - "license": "MIT" + "node_modules/@wagmi/connectors": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.8.3.tgz", + "integrity": "sha512-U4SJgi91+ny/XDGQWAMmawMafDx1BofcbYkPT/WSU6XrGL+apa7VltscqY7PVmwVGi/CYTqe8nlQiK/wmQ8D3A==", + "dependencies": { + "@coinbase/wallet-sdk": "4.3.0", + "@metamask/sdk": "0.32.0", + "@safe-global/safe-apps-provider": "0.18.6", + "@safe-global/safe-apps-sdk": "9.1.0", + "@walletconnect/ethereum-provider": "2.20.2", + "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@wagmi/core": "2.17.2", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" + "node_modules/@wagmi/core": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.17.2.tgz", + "integrity": "sha512-p1z8VU0YuRClx2bdPoFObDF7M2Reitz9AdByrJ+i5zcPCHuJ/UjaWPv6xD7ydhkWVK0hoa8vQ/KtaiEwEQS7Mg==", + "dependencies": { + "eventemitter3": "5.0.1", + "mipd": "0.0.7", + "zustand": "5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/query-core": ">=5.0.0", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "@tanstack/query-core": { + "optional": true + }, + "typescript": { + "optional": true + } + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", + "node_modules/@walletconnect/core": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.20.2.tgz", + "integrity": "sha512-48XnarxQQrpJ0KZJOjit56DxuzfVRYUdL8XVMvUh/ZNUiX2FB5w6YuljUUeTLfYOf04Et6qhVGEUkmX3W+9/8w==", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.20.2", + "@walletconnect/utils": "2.20.2", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", + "node_modules/@walletconnect/core/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", "dependencies": { - "@types/istanbul-lib-report": "*" + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } } }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/core/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/core/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@walletconnect/core/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@walletconnect/core/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "engines": { - "node": ">=10" + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/core/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "multiformats": "^9.4.2" + } + }, + "node_modules/@walletconnect/core/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } } }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", "dependencies": { - "@types/unist": "^2" + "tslib": "1.14.1" } }, - "node_modules/@types/mixpanel-browser": { - "version": "2.54.0", - "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.54.0.tgz", - "integrity": "sha512-7DMzIH0M9TlpCTMZidaeXris+aMUyAgMMEZtV1xeD6fSQgpCGklUKqyRgidq5hKPKuNEOWBp73549Gusig/xBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@types/node": { - "version": "22.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", - "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", - "license": "MIT", + "node_modules/@walletconnect/ethereum-provider": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.20.2.tgz", + "integrity": "sha512-fGNJtytHuBWZcmMXRIG1djlfEiPMvPJ0R3JlfJjAx2VfVN+O+1xdF6QSWcZxFizviIUFJV+f1zWt0V2VVD61Rg==", "dependencies": { - "undici-types": "~6.19.8" + "@reown/appkit": "1.7.3", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/sign-client": "2.20.2", + "@walletconnect/types": "2.20.2", + "@walletconnect/universal-provider": "2.20.2", + "@walletconnect/utils": "2.20.2", + "events": "3.3.0" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "license": "MIT" + "node_modules/@walletconnect/ethereum-provider/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" + "node_modules/@walletconnect/ethereum-provider/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" + "node_modules/@walletconnect/ethereum-provider/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@types/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", - "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", - "license": "MIT", + "node_modules/@walletconnect/ethereum-provider/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } } }, - "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", - "devOptional": true, - "license": "MIT", + "node_modules/@walletconnect/events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", + "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", "dependencies": { - "@types/react": "*" + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", - "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } + "node_modules/@walletconnect/events/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@types/react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/heartbeat": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", + "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", "dependencies": { - "@types/react": "*" + "@walletconnect/events": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "events": "^3.3.0" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/styled-system": { - "version": "5.1.23", - "resolved": "https://registry.npmjs.org/@types/styled-system/-/styled-system-5.1.23.tgz", - "integrity": "sha512-mIwCCdhDa2ifdQCEm8ZeD8m4UEbFsokqEoT9YNOUv4alUJ8jbMKxvpr+oOwfuZgwqLh5HjWuEzwnX7DzWvjFBg==", - "license": "MIT", + "node_modules/@walletconnect/jsonrpc-http-connection": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", + "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", "dependencies": { - "csstype": "^3.0.2" + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.1", + "cross-fetch": "^3.1.4", + "events": "^3.3.0" } }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/jsonrpc-provider": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", + "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", "dependencies": { - "@types/jest": "*" + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", + "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "dependencies": { + "events": "^3.3.0", + "keyvaluestorage-interface": "^1.0.0" + } }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", "dependencies": { - "@types/yargs-parser": "*" + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.3", + "tslib": "1.14.1" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@uiw/copy-to-clipboard": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@uiw/copy-to-clipboard/-/copy-to-clipboard-1.0.17.tgz", - "integrity": "sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==", - "license": "MIT", - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" + "node_modules/@walletconnect/jsonrpc-ws-connection": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", + "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0", + "ws": "^7.5.1" } }, - "node_modules/@uiw/react-markdown-preview": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@uiw/react-markdown-preview/-/react-markdown-preview-4.2.2.tgz", - "integrity": "sha512-Jy3GtAqcF2pKgvFtgLUEwR8u2t0Yk/DAnLTl6cf1RzhNYcAxm1auDs3KndZRBDP01xhmYLX4KiOcOg/qv+Jc0A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@uiw/copy-to-clipboard": "~1.0.12", - "react-markdown": "~8.0.0", - "rehype-attr": "~2.1.0", - "rehype-autolink-headings": "~6.1.1", - "rehype-ignore": "^1.0.1", - "rehype-prism-plus": "1.6.3", - "rehype-raw": "^6.1.1", - "rehype-rewrite": "~3.0.6", - "rehype-slug": "~5.1.0", - "remark-gfm": "~3.0.1", - "unist-util-visit": "^4.1.0" + "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@uiw/react-md-editor": { - "version": "3.25.6", - "resolved": "https://registry.npmjs.org/@uiw/react-md-editor/-/react-md-editor-3.25.6.tgz", - "integrity": "sha512-YuDv5KiM931WFYBDCyk9/HvtLdIWk9DXvzC6d1riaLufvchM7IUHkqTkSl3HqmTod1exSN+5ZsUtKZ+S+GAsug==", - "license": "MIT", + "node_modules/@walletconnect/logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", + "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", "dependencies": { - "@babel/runtime": "^7.14.6", - "@uiw/react-markdown-preview": "^4.2.1", - "rehype": "~12.0.1", - "rehype-prism-plus": "~1.6.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@walletconnect/safe-json": "^1.0.2", + "pino": "7.11.0" } }, - "node_modules/@vanilla-extract/css": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.5.tgz", - "integrity": "sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==", - "license": "MIT", + "node_modules/@walletconnect/relay-api": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", + "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.6", - "css-what": "^6.1.0", - "cssesc": "^3.0.0", - "csstype": "^3.0.7", - "dedent": "^1.5.3", - "deep-object-diff": "^1.1.9", - "deepmerge": "^4.2.2", - "lru-cache": "^10.4.3", - "media-query-parser": "^2.0.2", - "modern-ahocorasick": "^1.0.0", - "picocolors": "^1.0.0" + "@walletconnect/jsonrpc-types": "^1.0.2" } }, - "node_modules/@vanilla-extract/css/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@vanilla-extract/dynamic": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz", - "integrity": "sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==", - "license": "MIT", + "node_modules/@walletconnect/relay-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz", + "integrity": "sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==", "dependencies": { - "@vanilla-extract/private": "^1.0.6" + "@noble/curves": "1.8.0", + "@noble/hashes": "1.7.0", + "@walletconnect/safe-json": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "uint8arrays": "^3.0.0" } }, - "node_modules/@vanilla-extract/private": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.6.tgz", - "integrity": "sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==", - "license": "MIT" + "node_modules/@walletconnect/relay-auth/node_modules/@noble/curves": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz", + "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==", + "dependencies": { + "@noble/hashes": "1.7.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@vanilla-extract/sprinkles": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.3.tgz", - "integrity": "sha512-oCHlQeYOBIJIA2yWy2GnY5wE2A7hGHDyJplJo4lb+KEIBcJWRnDJDg8ywDwQS5VfWJrBBO3drzYZPFpWQjAMiQ==", - "license": "MIT", - "peerDependencies": { - "@vanilla-extract/css": "^1.0.0" + "node_modules/@walletconnect/relay-auth/node_modules/@noble/hashes": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", + "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@viem/anvil": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@viem/anvil/-/anvil-0.0.10.tgz", - "integrity": "sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/relay-auth/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@walletconnect/relay-auth/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", "dependencies": { - "execa": "^7.1.1", - "get-port": "^6.1.2", - "http-proxy": "^1.18.1", - "ws": "^8.13.0" + "multiformats": "^9.4.2" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", - "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==", - "dev": true, - "license": "MIT", + "node_modules/@walletconnect/safe-json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", + "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "tslib": "1.14.1" } }, - "node_modules/@wagmi/connectors": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.7.7.tgz", - "integrity": "sha512-hveKxuR35ZQQyteLo7aiN/TBVECYKVbLNTYGGgqzTNHJ8vVoblTP9PwPrRPGOPi5ji8raYSFWShxNK7QpGL+Kg==", - "license": "MIT", + "node_modules/@walletconnect/safe-json/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/sign-client": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.20.2.tgz", + "integrity": "sha512-KyeDToypZ1OjCbij4Jx0cAg46bMwZ6zCKt0HzCkqENcex3Zchs7xBp9r8GtfEMGw+PUnXwqrhzmLBH0x/43oIQ==", "dependencies": { - "@coinbase/wallet-sdk": "4.3.0", - "@metamask/sdk": "0.32.0", - "@safe-global/safe-apps-provider": "0.18.5", - "@safe-global/safe-apps-sdk": "9.1.0", - "@walletconnect/ethereum-provider": "2.17.0", - "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" - }, - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "@wagmi/core": "2.16.4", - "typescript": ">=5.0.4", - "viem": "2.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@walletconnect/core": "2.20.2", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.20.2", + "@walletconnect/utils": "2.20.2", + "events": "3.3.0" } }, - "node_modules/@wagmi/core": { - "version": "2.16.4", - "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.16.4.tgz", - "integrity": "sha512-E4jY4A98gwuHCjzuEajHIG/WhNDY5BChVHMjflV9Bx5CO7COqYRG2dcRLuF6Bo0LQNvVvXDAFUwR2JShJnT5pA==", - "license": "MIT", + "node_modules/@walletconnect/time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", + "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", "dependencies": { - "eventemitter3": "5.0.1", - "mipd": "0.0.7", - "zustand": "5.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "@tanstack/query-core": ">=5.0.0", - "typescript": ">=5.0.4", - "viem": "2.x" - }, - "peerDependenciesMeta": { - "@tanstack/query-core": { - "optional": true - }, - "typescript": { - "optional": true - } + "tslib": "1.14.1" } }, - "node_modules/@walletconnect/core": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.0.tgz", - "integrity": "sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw==", - "license": "Apache-2.0", + "node_modules/@walletconnect/time/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/types": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.20.2.tgz", + "integrity": "sha512-XPPbJM/mGU05i6jUxhC3yI/YvhSF6TYJQ5SXTWM53lVe6hs6ukvlEhPctu9ZBTGwGFhwPXIjtK/eWx+v4WY5iw==", "dependencies": { + "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.14", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.0.4", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.17.0", - "@walletconnect/utils": "2.17.0", - "events": "3.3.0", - "lodash.isequal": "4.5.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" + "events": "3.3.0" } }, - "node_modules/@walletconnect/core/node_modules/@walletconnect/keyvaluestorage": { + "node_modules/@walletconnect/types/node_modules/@walletconnect/keyvaluestorage": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -7579,11 +9860,10 @@ } } }, - "node_modules/@walletconnect/core/node_modules/chokidar": { + "node_modules/@walletconnect/types/node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -7594,23 +9874,15 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/core/node_modules/lru-cache": { + "node_modules/@walletconnect/types/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@walletconnect/core/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/@walletconnect/core/node_modules/readdirp": { + "node_modules/@walletconnect/types/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -7619,29 +9891,19 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/core/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/@walletconnect/core/node_modules/unstorage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", - "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", - "license": "MIT", + "node_modules/@walletconnect/types/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", - "destr": "^2.0.3", - "h3": "^1.15.0", + "destr": "^2.0.5", + "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", - "ufo": "^1.5.4" + "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -7650,7 +9912,7 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", @@ -7720,319 +9982,229 @@ } } }, - "node_modules/@walletconnect/environment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", - "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/environment/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/ethereum-provider": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.17.0.tgz", - "integrity": "sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==", - "license": "Apache-2.0", + "node_modules/@walletconnect/universal-provider": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.20.2.tgz", + "integrity": "sha512-6uVu1E88tioaXEEJCbJKwCIQlOHif1nmfY092BznZEnBn2lli5ICzQh2bxtUDNmNNLKsMDI3FV1fODFeWMVJTQ==", "dependencies": { + "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/modal": "2.7.0", - "@walletconnect/sign-client": "2.17.0", - "@walletconnect/types": "2.17.0", - "@walletconnect/universal-provider": "2.17.0", - "@walletconnect/utils": "2.17.0", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.20.2", + "@walletconnect/types": "2.20.2", + "@walletconnect/utils": "2.20.2", + "es-toolkit": "1.33.0", "events": "3.3.0" } }, - "node_modules/@walletconnect/events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", - "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", - "license": "MIT", - "dependencies": { - "keyvaluestorage-interface": "^1.0.0", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/events/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/heartbeat": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", - "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", - "license": "MIT", - "dependencies": { - "@walletconnect/events": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-http-connection": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", - "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", - "license": "MIT", + "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", "@walletconnect/safe-json": "^1.0.1", - "cross-fetch": "^3.1.4", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-provider": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", - "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.8", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0" - } - }, - "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", - "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", - "license": "MIT", - "dependencies": { - "events": "^3.3.0", - "keyvaluestorage-interface": "^1.0.0" - } - }, - "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", - "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", - "license": "MIT", - "dependencies": { - "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.3", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/jsonrpc-ws-connection": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz", - "integrity": "sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0", - "ws": "^7.5.1" - } - }, - "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@react-native-async-storage/async-storage": "1.x" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "@react-native-async-storage/async-storage": { "optional": true } } }, - "node_modules/@walletconnect/logger": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", - "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", - "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.2", - "pino": "7.11.0" - } - }, - "node_modules/@walletconnect/modal": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.7.0.tgz", - "integrity": "sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/modal-core": "2.7.0", - "@walletconnect/modal-ui": "2.7.0" - } - }, - "node_modules/@walletconnect/modal-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.7.0.tgz", - "integrity": "sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==", - "license": "Apache-2.0", - "dependencies": { - "valtio": "1.11.2" - } - }, - "node_modules/@walletconnect/modal-ui": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.7.0.tgz", - "integrity": "sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/modal-core": "2.7.0", - "lit": "2.8.0", - "motion": "10.16.2", - "qrcode": "1.5.3" - } - }, - "node_modules/@walletconnect/modal-ui/node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@walletconnect/relay-api": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", - "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", - "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-types": "^1.0.2" - } - }, - "node_modules/@walletconnect/relay-auth": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz", - "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==", - "license": "MIT", + "node_modules/@walletconnect/universal-provider/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { - "@stablelib/ed25519": "^1.0.2", - "@stablelib/random": "^1.0.1", - "@walletconnect/safe-json": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "tslib": "1.14.1", - "uint8arrays": "^3.0.0" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/relay-auth/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@walletconnect/relay-auth/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@walletconnect/universal-provider/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/@walletconnect/relay-auth/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" + "node_modules/@walletconnect/universal-provider/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/safe-json": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", - "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", - "license": "MIT", + "node_modules/@walletconnect/universal-provider/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", "dependencies": { - "tslib": "1.14.1" + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.2", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } } }, - "node_modules/@walletconnect/safe-json/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/sign-client": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.17.0.tgz", - "integrity": "sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg==", - "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", - "license": "Apache-2.0", + "node_modules/@walletconnect/utils": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.20.2.tgz", + "integrity": "sha512-2uRUDvpYSIJFYcr1WIuiFy6CEszLF030o6W8aDMkGk9/MfAZYEJQHMJcjWyaNMPHLJT0POR5lPaqkYOpuyPIQQ==", "dependencies": { - "@walletconnect/core": "2.17.0", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.17.0", - "@walletconnect/utils": "2.17.0", - "events": "3.3.0" + "@walletconnect/types": "2.20.2", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" } }, - "node_modules/@walletconnect/time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", - "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", - "license": "MIT", - "dependencies": { - "tslib": "1.14.1" + "node_modules/@walletconnect/utils/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/time/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@walletconnect/utils/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@walletconnect/types": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.17.0.tgz", - "integrity": "sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA==", - "license": "Apache-2.0", + "node_modules/@walletconnect/utils/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/types/node_modules/@walletconnect/keyvaluestorage": { + "node_modules/@walletconnect/utils/node_modules/@walletconnect/keyvaluestorage": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -8047,11 +10219,10 @@ } } }, - "node_modules/@walletconnect/types/node_modules/chokidar": { + "node_modules/@walletconnect/utils/node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -8062,17 +10233,62 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/types/node_modules/lru-cache": { + "node_modules/@walletconnect/utils/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@walletconnect/utils/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/@walletconnect/types/node_modules/readdirp": { + "node_modules/@walletconnect/utils/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/@walletconnect/utils/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/utils/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -8081,20 +10297,27 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/types/node_modules/unstorage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", - "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", - "license": "MIT", + "node_modules/@walletconnect/utils/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@walletconnect/utils/node_modules/unstorage": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", - "destr": "^2.0.3", - "h3": "^1.15.0", + "destr": "^2.0.5", + "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", - "ufo": "^1.5.4" + "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -8103,7 +10326,7 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", @@ -8173,67 +10396,59 @@ } } }, - "node_modules/@walletconnect/universal-provider": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.17.0.tgz", - "integrity": "sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.17.0", - "@walletconnect/types": "2.17.0", - "@walletconnect/utils": "2.17.0", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/utils": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.17.0.tgz", - "integrity": "sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ==", - "license": "Apache-2.0", + "node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "dependencies": { - "@stablelib/chacha20poly1305": "1.0.1", - "@stablelib/hkdf": "1.0.1", - "@stablelib/random": "1.0.2", - "@stablelib/sha256": "1.0.1", - "@stablelib/x25519": "1.0.3", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.0.4", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.17.0", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "detect-browser": "5.3.0", - "elliptic": "^6.5.7", - "query-string": "7.1.3", - "uint8arrays": "3.1.0" + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@walletconnect/utils/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@walletconnect/utils/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" + "node_modules/@walletconnect/utils/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "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 + } } }, "node_modules/@walletconnect/window-getters": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", - "license": "MIT", "dependencies": { "tslib": "1.14.1" } @@ -8241,14 +10456,12 @@ "node_modules/@walletconnect/window-getters/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@walletconnect/window-metadata": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", - "license": "MIT", "dependencies": { "@walletconnect/window-getters": "^1.0.1", "tslib": "1.14.1" @@ -8257,8 +10470,7 @@ "node_modules/@walletconnect/window-metadata/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@xstate/fsm": { "version": "1.6.5", @@ -8270,7 +10482,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -8287,6 +10498,27 @@ } } }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "peer": true + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -8407,11 +10639,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/async-mutex": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" } @@ -8426,7 +10695,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -8620,6 +10888,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==" + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -8659,6 +10932,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "peer": true + }, + "node_modules/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -8708,6 +10999,11 @@ "ieee754": "^1.1.13" } }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, "node_modules/blob-to-it": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.8.tgz", @@ -8738,8 +11034,7 @@ "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "license": "MIT" + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -8776,6 +11071,138 @@ "integrity": "sha512-+aDq+8QoTxIklc9m21oVg96Bm18EpeVke4/8vWPNu+9Ktd+G4PYavitE4gv/pjIndw1q+vxE/Rcnv1zYHrEQbQ==", "license": "Apache-2.0 OR MIT" }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -8809,6 +11236,14 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -8833,6 +11268,12 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, "node_modules/bufferutil": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", @@ -8846,6 +11287,12 @@ "node": ">=6.14.2" } }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -8933,6 +11380,30 @@ "node": ">= 6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001707", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", @@ -8968,7 +11439,6 @@ "version": "3.9.3", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz", "integrity": "sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.1", "buffer": "^6.0.3", @@ -8985,7 +11455,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -9098,7 +11567,49 @@ ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/cids": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz", + "integrity": "sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/cids/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/class-variance-authority": { @@ -9258,6 +11769,18 @@ "dev": true, "license": "MIT" }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -9276,8 +11799,7 @@ "node_modules/cookie-es": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", - "license": "MIT" + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" }, "node_modules/core-js-compat": { "version": "3.41.0", @@ -9296,8 +11818,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "8.3.6", @@ -9329,7 +11850,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -9337,6 +11857,55 @@ "node": ">=0.8" } }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-fetch": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -9361,14 +11930,39 @@ } }, "node_modules/crossws": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", - "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", - "license": "MIT", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "dependencies": { "uncrypto": "^0.1.3" } }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/css-selector-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", @@ -9592,6 +12186,29 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", @@ -9615,7 +12232,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", "engines": { "node": ">=0.10" } @@ -9743,8 +12359,7 @@ "node_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -9764,17 +12379,33 @@ "node": ">=6" } }, + "node_modules/derive-valtio": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/derive-valtio/-/derive-valtio-0.1.0.tgz", + "integrity": "sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==", + "peerDependencies": { + "valtio": "*" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", - "license": "MIT" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" }, "node_modules/detect-browser": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", - "license": "MIT" + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" }, "node_modules/detect-node-es": { "version": "1.1.0", @@ -9807,6 +12438,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -9861,6 +12509,18 @@ "csstype": "^3.0.2" } }, + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -9879,7 +12539,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -9894,15 +12553,14 @@ "license": "MIT" }, "node_modules/eciesjs": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.14.tgz", - "integrity": "sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==", - "license": "MIT", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", + "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", "dependencies": { - "@ecies/ciphers": "^0.2.2", - "@noble/ciphers": "^1.0.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0" + "@ecies/ciphers": "^0.2.3", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0" }, "engines": { "bun": ">=1", @@ -9910,6 +12568,31 @@ "node": ">=16" } }, + "node_modules/eciesjs/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eciesjs/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/eip1193-provider": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz", @@ -9969,8 +12652,7 @@ "node_modules/encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "license": "MIT" + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" }, "node_modules/encoding": { "version": "0.1.13", @@ -9997,7 +12679,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -10006,7 +12687,6 @@ "version": "6.6.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -10019,7 +12699,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -10036,7 +12715,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -10057,7 +12735,6 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -10143,6 +12820,15 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.33.0.tgz", + "integrity": "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/esbuild": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", @@ -10203,6 +12889,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -10217,7 +12909,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz", "integrity": "sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==", - "license": "MIT", "dependencies": { "@metamask/eth-json-rpc-provider": "^1.0.0", "@metamask/safe-event-emitter": "^3.0.0", @@ -10233,7 +12924,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", - "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.1.2", "@types/debug": "^4.1.7", @@ -10249,16 +12939,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/eth-block-tracker/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "bin": { "semver": "bin/semver.js" }, @@ -10270,7 +12958,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz", "integrity": "sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==", - "license": "ISC", "dependencies": { "@metamask/safe-event-emitter": "^3.0.0", "async-mutex": "^0.2.6", @@ -10286,7 +12973,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -10298,7 +12984,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "license": "ISC", "dependencies": { "json-rpc-random-id": "^1.0.0", "xtend": "^4.0.1" @@ -10308,88 +12993,103 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", - "license": "MIT", "dependencies": { "fast-safe-stringify": "^2.0.6" } }, "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz", + "integrity": "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg==", "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16", + "npm": ">=9" } }, "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", + "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.8.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethereum-cryptography/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethereum-cryptography/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethereum-cryptography/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", + "node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, "node_modules/eventemitter2": { "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT" + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -10401,11 +13101,20 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "node_modules/execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -10447,6 +13156,11 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -10457,7 +13171,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==", - "license": "ISC", "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" @@ -10496,8 +13209,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-equals": { "version": "5.2.2", @@ -10534,7 +13246,6 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -10542,8 +13253,22 @@ "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/fastq": { "version": "1.19.1", @@ -10614,7 +13339,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11006,22 +13730,55 @@ } }, "node_modules/h3": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", - "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", - "license": "MIT", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", + "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", "dependencies": { "cookie-es": "^1.2.2", - "crossws": "^0.3.3", + "crossws": "^0.3.4", "defu": "^6.1.4", - "destr": "^2.0.3", + "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", - "ufo": "^1.5.4", + "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, + "node_modules/hamt-sharding": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz", + "integrity": "sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/hamt-sharding/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/hamt-sharding/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -11077,10 +13834,23 @@ "has-symbols": "^1.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/hash.js": { @@ -11311,12 +14081,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hey-listen": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -11337,6 +14101,33 @@ "react-is": "^16.7.0" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/html-void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", @@ -11369,6 +14160,12 @@ "dev": true, "license": "MIT" }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -11399,10 +14196,9 @@ } }, "node_modules/idb-keyval": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", - "license": "Apache-2.0" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", + "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==" }, "node_modules/ieee754": { "version": "1.2.1", @@ -11469,7 +14265,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11534,6 +14329,17 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/interface-ipld-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz", + "integrity": "sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "cids": "^1.1.6", + "multicodec": "^3.0.1", + "multihashes": "^4.0.2" + } + }, "node_modules/interface-store": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.2.tgz", @@ -11564,6 +14370,18 @@ "node": ">=12" } }, + "node_modules/ipfs-only-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz", + "integrity": "sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA==", + "dependencies": { + "ipfs-unixfs-importer": "^7.0.1", + "meow": "^9.0.0" + }, + "bin": { + "ipfs-only-hash": "cli.js" + } + }, "node_modules/ipfs-unixfs": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.1.tgz", @@ -11574,11 +14392,113 @@ "uint8arraylist": "^2.4.8" } }, + "node_modules/ipfs-unixfs-importer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz", + "integrity": "sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ==", + "dependencies": { + "bl": "^5.0.0", + "cids": "^1.1.5", + "err-code": "^3.0.1", + "hamt-sharding": "^2.0.0", + "ipfs-unixfs": "^4.0.3", + "ipld-dag-pb": "^0.22.2", + "it-all": "^1.0.5", + "it-batch": "^1.0.8", + "it-first": "^1.0.6", + "it-parallel-batch": "^1.0.9", + "merge-options": "^3.0.4", + "multihashing-async": "^2.1.0", + "rabin-wasm": "^0.1.4", + "uint8arrays": "^2.1.2" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-importer/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/ipfs-unixfs-importer/node_modules/ipfs-unixfs": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz", + "integrity": "sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw==", + "dependencies": { + "err-code": "^3.0.1", + "protobufjs": "^6.10.2" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-importer/node_modules/it-all": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", + "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" + }, + "node_modules/ipfs-unixfs-importer/node_modules/it-first": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", + "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" + }, + "node_modules/ipfs-unixfs-importer/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/ipfs-unixfs-importer/node_modules/uint8arrays": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", + "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/ipld-dag-pb": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz", + "integrity": "sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg==", + "deprecated": "This module has been superseded by @ipld/dag-pb and multiformats", + "dependencies": { + "cids": "^1.0.0", + "interface-ipld-format": "^1.0.0", + "multicodec": "^3.0.1", + "multihashing-async": "^2.0.0", + "protobufjs": "^6.10.2", + "stable": "^0.1.8", + "uint8arrays": "^2.0.5" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/ipld-dag-pb/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/ipld-dag-pb/node_modules/uint8arrays": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", + "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/brc-dd" } @@ -11813,7 +14733,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -11872,6 +14791,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12006,7 +14941,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -12095,17 +15029,25 @@ "node": ">=12" } }, + "node_modules/isomorphic-timers-promises": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", + "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "peerDependencies": { "ws": "*" } @@ -12116,6 +15058,11 @@ "integrity": "sha512-PkuYtu6XhJzuPTKXImd6y0qE6H91MUPV/b9xotXMAI6GjmD2v3NoHj2g5L0lS2qZ0EzyGWZU1kp0UxW8POvNBQ==", "license": "Apache-2.0 OR MIT" }, + "node_modules/it-batch": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz", + "integrity": "sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==" + }, "node_modules/it-first": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.7.tgz", @@ -12146,6 +15093,14 @@ "it-peekable": "^3.0.0" } }, + "node_modules/it-parallel-batch": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz", + "integrity": "sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==", + "dependencies": { + "it-batch": "^1.0.9" + } + }, "node_modules/it-peekable": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.6.tgz", @@ -12564,7 +15519,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", - "license": "ISC", "dependencies": { "@metamask/safe-event-emitter": "^2.0.0", "eth-rpc-errors": "^4.0.2" @@ -12576,14 +15530,25 @@ "node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", - "license": "ISC" + "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" }, "node_modules/json-rpc-random-id": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", - "license": "ISC" + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stringify-deterministic": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.12.tgz", + "integrity": "sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==", + "engines": { + "node": ">= 4" + } }, "node_modules/json5": { "version": "2.2.3", @@ -12616,7 +15581,6 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -12632,6 +15596,14 @@ "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==", "license": "MIT" }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -12703,6 +15675,11 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/limiter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-3.0.0.tgz", + "integrity": "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -12710,32 +15687,29 @@ "license": "MIT" }, "node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "license": "BSD-3-Clause", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" } }, "node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "license": "BSD-3-Clause", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz", + "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" } }, "node_modules/lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "license": "BSD-3-Clause", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.0.tgz", + "integrity": "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -12774,13 +15748,6 @@ "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "license": "MIT" }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" - }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -12805,6 +15772,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -12856,6 +15828,26 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -12875,6 +15867,17 @@ "node": ">= 0.4" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -13118,6 +16121,50 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -13149,8 +16196,7 @@ "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "license": "MIT" + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" }, "node_modules/micromark": { "version": "3.2.0", @@ -13728,6 +16774,25 @@ "node": ">=8.6" } }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -13766,7 +16831,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -13797,6 +16861,35 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -13816,7 +16909,6 @@ "url": "https://github.com/sponsors/wagmi-dev" } ], - "license": "MIT", "peerDependencies": { "typescript": ">=5.0.4" }, @@ -13853,40 +16945,132 @@ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", "license": "BSD-3-Clause" }, - "node_modules/motion": { - "version": "10.16.2", - "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz", - "integrity": "sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==", - "license": "MIT", + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multibase": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", + "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "@multiformats/base-x": "^4.0.1" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multicodec": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz", + "integrity": "sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + } + }, + "node_modules/multicodec/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/multicodec/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/multiformats": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/multihashes": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", + "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", + "dependencies": { + "multibase": "^4.0.1", + "uint8arrays": "^3.0.0", + "varint": "^5.0.2" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multihashes/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/multihashes/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", "dependencies": { - "@motionone/animation": "^10.15.1", - "@motionone/dom": "^10.16.2", - "@motionone/svelte": "^10.16.2", - "@motionone/types": "^10.15.1", - "@motionone/utils": "^10.15.1", - "@motionone/vue": "^10.16.2" + "multiformats": "^9.4.2" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", + "node_modules/multihashes/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/multihashing-async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz", + "integrity": "sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg==", + "dependencies": { + "blakejs": "^1.1.0", + "err-code": "^3.0.0", + "js-sha3": "^0.8.0", + "multihashes": "^4.0.1", + "murmurhash3js-revisited": "^3.0.0", + "uint8arrays": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=12.0.0", + "npm": ">=6.0.0" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "node_modules/multihashing-async/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" }, - "node_modules/multiformats": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", - "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", - "license": "Apache-2.0 OR MIT" + "node_modules/multihashing-async/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "engines": { + "node": ">=8.0.0" + } }, "node_modules/mute-stream": { "version": "0.0.8", @@ -13946,8 +17130,7 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "license": "MIT" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -13972,8 +17155,7 @@ "node_modules/node-fetch-native": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", - "license": "MIT" + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" }, "node_modules/node-gyp-build": { "version": "4.8.4", @@ -13989,8 +17171,7 @@ "node_modules/node-mock-http": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", - "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==", - "license": "MIT" + "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" }, "node_modules/node-releases": { "version": "2.0.19", @@ -13999,6 +17180,99 @@ "devOptional": true, "license": "MIT" }, + "node_modules/node-stdlib-browser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", + "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "create-require": "^1.1.1", + "crypto-browserify": "^3.12.1", + "domain-browser": "4.22.0", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "isomorphic-timers-promises": "^1.0.1", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "pkg-dir": "^5.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.1", + "url": "^0.11.4", + "util": "^0.12.4", + "vm-browserify": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-stdlib-browser/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/node-stdlib-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -14068,7 +17342,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==", - "license": "ISC", "dependencies": { "end-of-stream": "^1.4.0", "once": "^1.4.0", @@ -14078,14 +17351,12 @@ "node_modules/obj-multiplex/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/obj-multiplex/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14099,14 +17370,12 @@ "node_modules/obj-multiplex/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/obj-multiplex/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -14194,7 +17463,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", - "license": "MIT", "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", @@ -14204,8 +17472,7 @@ "node_modules/on-exit-leak-free": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", - "license": "MIT" + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" }, "node_modules/once": { "version": "1.4.0", @@ -14274,6 +17541,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -14285,16 +17558,15 @@ } }, "node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", @@ -14428,6 +17700,12 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14440,6 +17718,23 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-duration": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", @@ -14495,6 +17790,12 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -14568,6 +17869,22 @@ "dev": true, "license": "MIT" }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14599,7 +17916,6 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", - "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", @@ -14621,7 +17937,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", - "license": "MIT", "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" @@ -14630,8 +17945,7 @@ "node_modules/pino-std-serializers": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", - "license": "MIT" + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" }, "node_modules/pirates": { "version": "4.0.7", @@ -14642,6 +17956,88 @@ "node": ">= 6" } }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -14722,7 +18118,6 @@ "version": "2.1.11", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "license": "0BSD", "engines": { "node": ">=12.0.0" } @@ -14898,10 +18293,9 @@ } }, "node_modules/preact": { - "version": "10.26.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz", - "integrity": "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==", - "license": "MIT", + "version": "10.26.6", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.6.tgz", + "integrity": "sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -14958,17 +18352,24 @@ "dev": true, "license": "MIT" }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-warning": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "license": "MIT" + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" }, "node_modules/progress-events": { "version": "1.0.1", @@ -14997,6 +18398,31 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/protons-runtime": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", @@ -15009,10 +18435,9 @@ } }, "node_modules/proxy-compare": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.5.1.tgz", - "integrity": "sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==", - "license": "MIT" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", + "integrity": "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==" }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -15036,11 +18461,30 @@ "node": ">=16.0.0" } }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -15082,11 +18526,25 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -15100,6 +18558,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -15123,21 +18590,72 @@ "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "license": "MIT" + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/rabin-wasm/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "license": "MIT" + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" }, "node_modules/ramda": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", "dev": true, - "license": "MIT" + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } }, "node_modules/react": { "version": "18.3.1", @@ -15573,6 +19091,118 @@ "pify": "^2.3.0" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -15604,7 +19234,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", - "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -15657,7 +19286,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -16002,6 +19630,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -16094,6 +19730,16 @@ "node": ">=0.10.0" } }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/rollup": { "version": "4.38.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", @@ -16406,7 +20052,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", "engines": { "node": ">=10" } @@ -16426,6 +20071,12 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "peer": true + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -16504,11 +20155,16 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -16635,7 +20291,6 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -16650,7 +20305,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -16667,7 +20321,6 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -16680,7 +20333,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -16709,7 +20361,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", - "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -16752,11 +20403,43 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", "engines": { "node": ">=6" } @@ -16765,11 +20448,16 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", "engines": { "node": ">= 10.x" } }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -16807,11 +20495,32 @@ "node": ">= 0.4" } }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" }, "node_modules/stream-to-it": { "version": "1.0.1", @@ -16826,7 +20535,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -16925,7 +20633,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -17049,7 +20756,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -17250,7 +20956,6 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", - "license": "MIT", "dependencies": { "real-require": "^0.1.0" } @@ -17262,6 +20967,18 @@ "dev": true, "license": "MIT" }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -17309,6 +21026,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", @@ -17352,6 +21077,12 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, "node_modules/turbo-stream": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", @@ -17412,10 +21143,9 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" }, "node_modules/uint8-varint": { "version": "2.0.4", @@ -17448,8 +21178,7 @@ "node_modules/uncrypto": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "license": "MIT" + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" }, "node_modules/undici": { "version": "7.6.0", @@ -17678,6 +21407,25 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -17761,7 +21509,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -17777,10 +21524,13 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -17803,13 +21553,22 @@ "node": ">=8" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/valtio": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.11.2.tgz", - "integrity": "sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==", - "license": "MIT", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", + "integrity": "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==", "dependencies": { - "proxy-compare": "2.5.1", + "derive-valtio": "0.1.0", + "proxy-compare": "2.6.0", "use-sync-external-store": "1.2.0" }, "engines": { @@ -17832,11 +21591,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, "node_modules/vaul": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", @@ -17917,25 +21680,24 @@ } }, "node_modules/viem": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.0.tgz", - "integrity": "sha512-OrWFRFJ4qlChse0MHqYpdN+WBzQtU/iWQmsVwbIM4IjWT112M2O1Lidbseti6RH/nn1X2MvKMGzgILpmSyV2aw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.30.0.tgz", + "integrity": "sha512-hvO4l5JIOnYPL8imULoFQiVTSkebIqzGHmIfsdMfIHpAgBaCx8rJJH9cXAxQeWCqsFuTmjEj1cX912N7HSCgpQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "dependencies": { - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", + "@noble/curves": "1.8.2", + "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", - "isows": "1.0.6", - "ox": "0.6.7", - "ws": "8.18.0" + "isows": "1.0.7", + "ox": "0.6.9", + "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -17946,25 +21708,54 @@ } } }, - "node_modules/viem/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "dependencies": { + "@noble/hashes": "1.7.2" + }, "engines": { - "node": ">=10.0.0" + "node": "^14.21.3 || >=16" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/vite": { @@ -18056,6 +21847,22 @@ "node": ">=14.14" } }, + "node_modules/vite-plugin-node-polyfills": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", + "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", + "dev": true, + "dependencies": { + "@rollup/plugin-inject": "^5.0.5", + "node-stdlib-browser": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/davidmyersdev" + }, + "peerDependencies": { + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, "node_modules/vite-plugin-static-copy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz", @@ -18547,14 +22354,19 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "node_modules/wagmi": { - "version": "2.14.11", - "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.14.11.tgz", - "integrity": "sha512-Qj79cq+9MAcnKict9QLo60Lc4S2IXVVE94HBwCmczDrFtoM31NxfX4uQP73Elj2fV9lXH4/dw3jlb8eDhlm6iQ==", - "license": "MIT", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.15.4.tgz", + "integrity": "sha512-0m7uo6t/oSFS+4UCUTBnmIhDSP7PGJz1qx4VtALcsBnw81UPPIXMSM8oGVrUNV9CptryiDgBlh4iYmRldg9iaA==", "dependencies": { - "@wagmi/connectors": "5.7.7", - "@wagmi/core": "2.16.4", + "@wagmi/connectors": "5.8.3", + "@wagmi/core": "2.17.2", "use-sync-external-store": "1.4.0" }, "funding": { @@ -18644,8 +22456,7 @@ "node_modules/webextension-polyfill": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", - "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", - "license": "MPL-2.0" + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -18828,7 +22639,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", "engines": { "node": ">=0.4" } @@ -18948,6 +22758,18 @@ "node": ">=8" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.24.2", "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", @@ -18961,7 +22783,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", - "license": "MIT", "engines": { "node": ">=12.20.0" }, diff --git a/package.json b/package.json index ca7d628c5..ba2acf6fe 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,7 @@ "typescript": "5.6.3", "vite": "5.4.8", "vite-bundle-visualizer": "1.2.1", + "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-static-copy": "^2.1.0", "vite-tsconfig-paths": "^4.2.0" } diff --git a/vite.config.ts b/vite.config.ts index 662a922cd..6a1cb38b9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,6 +4,7 @@ import viteTsconfigPaths from 'vite-tsconfig-paths' import path from 'path' import { lingui } from '@lingui/vite-plugin' import { viteStaticCopy } from 'vite-plugin-static-copy' +import { nodePolyfills } from 'vite-plugin-node-polyfills' // https://vitejs.dev/config/ export default defineConfig({ @@ -52,6 +53,10 @@ export default defineConfig({ }) }, }, + // Polyfills for node modules - @cowprotocol/cow-sdk needs it + nodePolyfills({ + protocolImports: true, + }), ], build: { outDir: 'build', From 4a9f1f6362b8edb44026a9db0003a6049df1ed91 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 22 May 2025 12:05:08 -0300 Subject: [PATCH 30/85] chore: working multi signature --- .../issuance/async-swaps/hooks/useQuote.ts | 199 ++++++++++++------ .../async-swaps/hooks/useQuoteSignatures.ts | 1 - .../index-dtf/issuance/async-swaps/index.tsx | 2 +- 3 files changed, 141 insertions(+), 61 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 8fa102698..6fb90750f 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -5,13 +5,14 @@ import { indexDTFAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { safeParseEther } from '@/utils' import { + OrderBookApi, OrderQuoteSideKindBuy, OrderQuoteSideKindSell, PriceQuality, SigningScheme, } from '@cowprotocol/cow-sdk' import { useQuery } from '@tanstack/react-query' -import { useAtomValue, useSetAtom } from 'jotai' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { Address, zeroAddress } from 'viem' import { asyncSwapInputAtom, @@ -29,6 +30,64 @@ interface UseQuoteParams { amount: bigint } +async function getQuote({ + sellToken, + buyToken, + amount, + address, + orderBookApi, + zapDirection, +}: { + sellToken: Token + buyToken: Token + amount: bigint + address: Address + orderBookApi: OrderBookApi + zapDirection: 'redeem' | 'mint' +}) { + if ( + !address || + address == zeroAddress || + buyToken.address == zeroAddress || + sellToken.address == zeroAddress || + !orderBookApi + ) { + throw new Error('getQuote: Invalid params') + } + + if (amount <= 0n) { + throw new Error('getQuote: Amount is 0') + } + + const quote = await orderBookApi.getQuote({ + sellToken: sellToken.address, + buyToken: buyToken.address, + from: address, + receiver: address, + validFor: 60 * 15, // 15 minutes + priceQuality: PriceQuality.VERIFIED, + ...(zapDirection === 'redeem' + ? { + kind: OrderQuoteSideKindSell.SELL, + sellAmountBeforeFee: amount.toString(), + } + : { + kind: OrderQuoteSideKindBuy.BUY, + buyAmountAfterFee: amount.toString(), + }), + signingScheme: SigningScheme.PRESIGN, + }) + + // CowSwap orders sometimes return every so slightly different amounts than requested. + if (zapDirection === 'redeem') { + quote.quote.sellAmount = amount.toString() + } else { + quote.quote.buyAmount = amount.toString() + } + + return quote +} + export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { const indexDTF = useAtomValue(indexDTFAtom) const folioAddress = indexDTF?.id @@ -36,61 +95,31 @@ export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) const setQuotes = useSetAtom(quotesAtom) - const { orderBookApi } = useGlobalProtocolKit() return useQuery({ queryKey: ['quote/single', sellToken, buyToken, amount, address], - enabled: !!chainId && !!address && !!sellToken && !!buyToken, + enabled: + !!chainId && !!address && !!sellToken && !!buyToken && !!orderBookApi, queryFn: async ({ signal }) => { - if ( - !folioAddress || - !address || - address == zeroAddress || - buyToken.address == zeroAddress || - sellToken.address == zeroAddress || - !orderBookApi - ) { - throw new Error('useQuote: Invalid params') + if (!orderBookApi) { + throw new Error('orderBookApi is not available') } - // TODO: Add logic for "best quote" response between multiple providers. try { - if (amount <= 0n) { - throw new Error('useQuote: Amount is 0') - } - - // TODO: Add appData here - const quote = await orderBookApi.getQuote({ - sellToken: sellToken.address, - buyToken: buyToken.address, - from: address, - receiver: address, - validFor: 60 * 15, // 15 minutes - priceQuality: PriceQuality.VERIFIED, - ...(zapDirection === 'redeem' - ? { - kind: OrderQuoteSideKindSell.SELL, - sellAmountBeforeFee: amount.toString(), - } - : { - kind: OrderQuoteSideKindBuy.BUY, - buyAmountAfterFee: amount.toString(), - }), - signingScheme: SigningScheme.PRESIGN, + const quote = await getQuote({ + sellToken, + buyToken, + amount, + address: address as Address, + orderBookApi, + zapDirection, }) - // CowSwap orders sometimes return every so slightly different amounts than requested. - if (zapDirection === 'redeem') { - quote.quote.sellAmount = amount.toString() - } else { - quote.quote.buyAmount = amount.toString() - } - if (!signal.aborted) { setQuotes((prev) => ({ ...prev, - [folioAddress]: { + [folioAddress as string]: { success: true, type: QuoteProvider.CowSwap, data: quote, @@ -108,7 +137,7 @@ export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { if (!signal.aborted) { setQuotes((prev) => ({ ...prev, - [folioAddress]: { + [folioAddress as string]: { success: false, }, })) @@ -129,7 +158,9 @@ export const useQuotesForMint = () => { const inputAmount = useAtomValue(asyncSwapInputAtom) const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) const folioAmount = safeParseEther(inputAmount) - const quotes = useAtomValue(quotesAtom) + const address = useAtomValue(walletAtom) + const [quotes, setQuotes] = useAtom(quotesAtom) + const { orderBookApi } = useGlobalProtocolKit() const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) const { data: balances } = useERC20Balances( (folioDetails?.assets || []).map((address) => ({ @@ -144,33 +175,83 @@ export const useQuotesForMint = () => { return useQuery({ queryKey: ['quotes/mint', folioDetails?.assets, folioDetails?.mintValues], - queryFn: async () => { - if (!folioDetails || !tokensInfo) { + queryFn: async ({ signal }) => { + if (!folioDetails || !tokensInfo || !orderBookApi) { return {} } - await Promise.all( - folioDetails?.assets.map((asset, i) => { + const quotePromises = + folioDetails?.assets.map(async (asset, i) => { const token = tokensInfo[asset.toLowerCase()] const mintValue = folioDetails?.mintValues[i] const walletValue = (balances?.[i] as bigint) ?? 0n const amount = mintValue - walletValue if (amount <= 0n) { - return + console.log(asset, 'already has enough balance') + return null } - return useQuote({ - sellToken: selectedToken, - buyToken: token, - amount, - }) + try { + return await getQuote({ + sellToken: selectedToken, + buyToken: token, + amount, + address: address as Address, + orderBookApi, + zapDirection: 'mint', + }) + } catch (error) { + console.error(`Error getting quote for ${asset}:`, error) + return null + } }) || [] - ) - }, - select: () => { + + const results = await Promise.all(quotePromises) + + folioDetails.assets.forEach((asset, i) => { + const token = tokensInfo[asset.toLowerCase()] + const quote = results[i] + try { + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [token.address as string]: { + success: true, + type: QuoteProvider.CowSwap, + data: quote, + }, + })) + } + + return { + token: token, + success: true, + source: QuoteProvider.CowSwap, + quote, + } + } catch { + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [token.address as string]: { + success: false, + }, + })) + } + + return { + success: false, + } + } + }) + return quotes }, - enabled: !!folioDetails && !!tokensInfo, + enabled: + !!folioDetails?.mintValues && + !!tokensInfo && + !!inputAmount && + !isNaN(Number(inputAmount)), }) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index ed179a51a..6ab96a3b3 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -29,7 +29,6 @@ export function useQuoteSignatures() { const quoteToken = useAtomValue(selectedTokenOrDefaultAtom).address const quotes = Object.values(useAtomValue(quotesAtom)) const setOrders = useSetAtom(ordersAtom) - const { orderBookApi } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 8ce4d179d..18f59215d 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -155,7 +155,7 @@ const AsyncSwaps = () => { if (!indexDTF) return null - if (isSafeMultisig) { + if (!isSafeMultisig) { return (
From 689a03cf340027b354ad3ceac80e2f461ed8692e Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 22 May 2025 14:56:39 -0300 Subject: [PATCH 31/85] chore: wip async mint integration --- src/hooks/useAsyncSwap.ts | 85 ------------- src/state/chain/updaters/AtomUpdater.tsx | 4 +- src/utils/index.ts | 8 ++ .../async-mint/submit-mint-orders.tsx | 10 +- .../async-swaps/async-redeem/index.tsx | 43 +++---- .../index-dtf/issuance/async-swaps/atom.ts | 8 +- .../async-swaps/collateral-acquisition.tsx | 3 +- .../issuance/async-swaps/collaterals.tsx | 44 ++++--- .../issuance/async-swaps/cowswap-order.tsx | 62 +++++---- .../async-swaps/hooks/useOrderStatus.ts | 16 +++ .../issuance/async-swaps/hooks/useQuote.ts | 120 +++++++++--------- .../async-swaps/hooks/useQuoteSignatures.ts | 25 +++- .../index-dtf/issuance/async-swaps/index.tsx | 14 +- .../async-swaps/order-status-updater.tsx | 36 ------ .../index-dtf/issuance/async-swaps/types.ts | 52 +------- 15 files changed, 212 insertions(+), 318 deletions(-) delete mode 100644 src/hooks/useAsyncSwap.ts delete mode 100644 src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx diff --git a/src/hooks/useAsyncSwap.ts b/src/hooks/useAsyncSwap.ts deleted file mode 100644 index dc4533e3e..000000000 --- a/src/hooks/useAsyncSwap.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { chainIdAtom, walletAtom } from '@/state/atoms' -import { RESERVE_API } from '@/utils/constants' -import { AsyncSwapResponse } from '@/views/index-dtf/issuance/async-swaps/types' -import { useQuery } from '@tanstack/react-query' -import { useAtomValue } from 'jotai' -import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' -import { useMemo } from 'react' -import { Address } from 'viem' -import useDebounce from './useDebounce' - -const useAsyncSwap = ({ - dtf, - amountOut, - slippage, - disabled, - dtfTicker, - type, -}: { - dtf?: Address - amountOut: string - slippage: number - disabled: boolean - dtfTicker: string - type: 'mint' | 'redeem' -}) => { - const chainId = useAtomValue(chainIdAtom) - const account = useAtomValue(walletAtom) - - const endpoint = useDebounce( - useMemo( - () => - !!dtf && !isNaN(Number(amountOut)) && Number(amountOut) !== 0 && account - ? `${RESERVE_API}async-swap/quote?dtf=${dtf}&chainId=${chainId}&amountOut=${amountOut}&operation=${type}&signer=${account}` - : null, - [chainId, account, dtf, amountOut, type, slippage] - ), - 500 - ) - - const commonAnalytics = { - wa: account, - dtf: dtf, - ticker: dtfTicker, - chainId, - type, - } as const - - return useQuery({ - queryKey: ['async-zap', endpoint], - queryFn: async (): Promise => { - if (!endpoint) throw new Error('No endpoint available') - const response = await fetch(endpoint) - - if (!response.ok) { - const error = response.status - mixpanel.track('async-zap', { - event: 'async-zap', - ...commonAnalytics, - endpoint, - status: 'error', - error, - }) - throw new Error(`Error: ${error}`) - } - const data = await response.json() - - if (data) { - mixpanel.track('async-zap', { - event: 'async-zap', - ...commonAnalytics, - endpoint, - status: 'success', - }) - } - - return data - }, - enabled: !!endpoint && !disabled, - refetchInterval: false, - retry: 3, - retryDelay: (attempt) => Math.min(1000 * Math.pow(2, attempt), 10000), - }) -} - -export default useAsyncSwap diff --git a/src/state/chain/updaters/AtomUpdater.tsx b/src/state/chain/updaters/AtomUpdater.tsx index 8034e99db..568ce1f07 100644 --- a/src/state/chain/updaters/AtomUpdater.tsx +++ b/src/state/chain/updaters/AtomUpdater.tsx @@ -27,7 +27,7 @@ const AtomUpdater = () => { const setBlockNumber = useSetAtom(blockAtom) const chainId = useAtomValue(chainIdAtom) const { data: blockNumber } = useBlockNumber({ watch: true, chainId }) - const client = usePublicClient({ chainId }) + const client = usePublicClient({ chainId: account?.chainId }) const setBlockTimestamp = useSetAtom(blockTimestampAtom) const [timestamp, setTimestamp] = useAtom(timestampAtom) const [debouncedBlock, setDebouncedBlock] = useAtom(debouncedBlockAtom) @@ -85,7 +85,7 @@ const AtomUpdater = () => { setWalletChain(undefined) setIsSafeMultisig(false) } - }, [account?.address, account?.chainId]) + }, [account?.address, account?.chainId, client?.chain?.id]) useEffect(() => { fetchTimestamp() // update stored block timestamp diff --git a/src/utils/index.ts b/src/utils/index.ts index 5350e48de..a6eb3981f 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -385,3 +385,11 @@ export function getTimerFormat(seconds: number) { return str } + +export const uuidv4 = () => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + const r = (Math.random() * 16) | 0, + v = c == 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 149bf9e51..1d2e2fe6a 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -1,13 +1,19 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' import { useQuoteSignatures } from '../hooks/useQuoteSignatures' +import { asyncSwapInputAtom } from '../atom' +import { useAtomValue } from 'jotai' type SubmitMintProps = { loadingQuote?: boolean } const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { - const { mutate, data: orderData, isPending } = useQuoteSignatures() + const inputAmount = useAtomValue(asyncSwapInputAtom) + const { mutate, isPending } = useQuoteSignatures() + + const disabled = + isPending || loadingQuote || !inputAmount || isNaN(Number(inputAmount)) return (
@@ -18,7 +24,7 @@ const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { isPending && 'opacity-50 cursor-not-allowed' )} onClick={() => mutate()} - disabled={isPending} + disabled={disabled} > {isPending ? ( 'Signing...' diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 7261e3850..20996979a 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -3,7 +3,6 @@ import Swap, { TokenInputBox, TokenOutputBox, } from '@/components/ui/swap' -import useAsyncSwap from '@/hooks/useAsyncSwap' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' import { @@ -105,16 +104,16 @@ const AsyncRedeem = () => { parseUnits(inputAmount, selectedToken.decimals) > (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ - dtf: indexDTF?.id, - amountOut: amountOutWei.toString(), - slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, - disabled: insufficientBalance || ongoingTx, - dtfTicker: indexDTF?.token.symbol || '', - type: 'mint', - }) + // const { data, isLoading, isFetching, refetch, failureReason } = useAsyncSwap({ + // dtf: indexDTF?.id, + // amountOut: amountOutWei.toString(), + // slippage: isFinite(Number(slippage)) ? Number(slippage) : 10000, + // disabled: insufficientBalance || ongoingTx, + // dtfTicker: indexDTF?.token.symbol || '', + // type: 'mint', + // }) - const { loadingAfterRefetch } = useLoadingAfterRefetch(data) + // const { loadingAfterRefetch } = useLoadingAfterRefetch(data) // const valueTo = data?.result?.amountOut // const showTxButton = Boolean( @@ -123,20 +122,20 @@ const AsyncRedeem = () => { // !insufficientBalance && // !isLoading // ) - const awaitingQuote = isLoading || isFetching + // const awaitingQuote = isLoading || isFetching - useEffect(() => { - setAsyncSwapRefetch({ fn: refetch }) - }, [refetch, setAsyncSwapRefetch]) + // useEffect(() => { + // setAsyncSwapRefetch({ fn: refetch }) + // }, [refetch, setAsyncSwapRefetch]) - useEffect(() => { - setAsyncSwapFetching(awaitingQuote) - }, [awaitingQuote, setAsyncSwapFetching]) + // useEffect(() => { + // setAsyncSwapFetching(awaitingQuote) + // }, [awaitingQuote, setAsyncSwapFetching]) - useEffect(() => { - setOngoingTx(false) - setInputAmount('') - }, []) + // useEffect(() => { + // setOngoingTx(false) + // setInputAmount('') + // }, []) if (!indexDTF) return null @@ -187,7 +186,7 @@ const AsyncRedeem = () => { collateralAcquired && !isMinting && 'border-card bg-card' ), }} - loading={isLoading || loadingAfterRefetch} + // loading={isLoading || loadingAfterRefetch} />
{/* {!!data && } */} diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 4f2f6bdef..a71fc9831 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -2,7 +2,7 @@ import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' -import { EnrichedOrder } from '@cowprotocol/cow-sdk' +import { EnrichedOrder, OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther } from 'viem' @@ -23,8 +23,7 @@ export const collateralAcquiredAtom = atom((get) => { const asyncSwapResponse = get(asyncSwapResponseAtom) return Boolean( asyncSwapResponse?.cowswapOrders.every( - (order) => - order.status.type === 'traded' || order.status.type === 'solved' + (order) => order.status === OrderStatus.FULFILLED ) ) }) @@ -91,4 +90,5 @@ export const mintValueWeiAtom = atom((get) => { export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) -export const ordersAtom = atom([]) +export const orderIdsAtom = atom([]) +export const ordersAtom = atom>({}) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 3fdb0d933..0955426bd 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -11,6 +11,7 @@ import { currentAsyncSwapTabAtom, } from './atom' import MintButton from './mint-button' +import { OrderStatus } from '@cowprotocol/cow-sdk' const OpenCollateralPanel = () => { const basket = useAtomValue(indexDTFBasketAtom) @@ -56,7 +57,7 @@ const CollateralAcquisition = () => { if (!asyncSwapResponse) return null const hasAllCollaterals = asyncSwapResponse.cowswapOrders.every( - (order) => order.status.type === 'traded' || order.status.type === 'solved' + (order) => order.status === OrderStatus.FULFILLED ) if (hasAllCollaterals) { diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 03d3536e5..7601fbb08 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -1,18 +1,20 @@ import { cn } from '@/lib/utils' -import { useAtom, useAtomValue } from 'jotai' -import { atom } from 'jotai' +import { atom, useAtom, useAtomValue } from 'jotai' import { useEffect, useMemo } from 'react' -import { asyncSwapResponseAtom, collateralPanelOpenAtom } from './atom' +import { + asyncSwapResponseAtom, + collateralPanelOpenAtom, + orderIdsAtom, +} from './atom' import CowSwapOrder from './cowswap-order' +import { OrderStatus } from '@cowprotocol/cow-sdk' -const STATUS_ORDER_MAP = { - open: 1, - scheduled: 1, - active: 1, - solved: 2, - executing: 1, - traded: 2, +const STATUS_PRIORITY: Record = { cancelled: 0, + expired: 0, + presignaturePending: 1, + open: 1, + fulfilled: 2, } const isVisibleAtom = atom(false) @@ -24,6 +26,7 @@ export const showCollateralsAtom = atom((get) => { }) const Collaterals = () => { + const orderIDs = useAtomValue(orderIdsAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const open = useAtomValue(collateralPanelOpenAtom) const [isVisible, setIsVisible] = useAtom(isVisibleAtom) @@ -43,12 +46,19 @@ const Collaterals = () => { const { cowswapOrders = [] } = asyncSwapResponse || {} - const sortedOrders = useMemo( + const sortedOrderIds = useMemo( () => - cowswapOrders.sort( - (a, b) => - STATUS_ORDER_MAP[a.status.type] - STATUS_ORDER_MAP[b.status.type] - ), + orderIDs.sort((a, b) => { + const orderA = cowswapOrders.find((o) => o.orderId === a) + const orderB = cowswapOrders.find((o) => o.orderId === b) + + if (!orderA?.status || !orderB?.status) return 0 + + return ( + (STATUS_PRIORITY[orderA.status] ?? 0) - + (STATUS_PRIORITY[orderB.status] ?? 0) + ) + }), [cowswapOrders] ) @@ -61,8 +71,8 @@ const Collaterals = () => { isVisible ? 'w-[400px]' : 'w-0' )} > - {sortedOrders.map((order) => ( - + {sortedOrderIds.map((orderId) => ( + ))}
) diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index 5304f552b..0dac36c59 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -3,47 +3,46 @@ import Help from '@/components/ui/help' import { cn } from '@/lib/utils' import { indexDTFBasketAtom } from '@/state/dtf/atoms' import { formatCurrency, formatTokenAmount } from '@/utils' +import { OrderStatus as CowSwapOrderStatus } from '@cowprotocol/cow-sdk' import { useAtomValue } from 'jotai' import { ArrowUpRight, Check, Loader } from 'lucide-react' import { Link } from 'react-router-dom' import { formatUnits } from 'viem' import { currentAsyncSwapTabAtom } from './atom' -import { AsyncSwapOrder } from './types' +import { useOrderStatus } from './hooks/useOrderStatus' -const STATUS_MAP = { - open: 'Processing', - scheduled: 'Processing', - active: 'Processing', - solved: 'Order Filled', - executing: 'Processing', - traded: 'Order Filled', - cancelled: 'Not Filled', +const STATUS_MAP: Record = { + [CowSwapOrderStatus.PRESIGNATURE_PENDING]: 'Processing', + [CowSwapOrderStatus.OPEN]: 'Processing', + [CowSwapOrderStatus.FULFILLED]: 'Order Filled', + [CowSwapOrderStatus.CANCELLED]: 'Not Filled', + [CowSwapOrderStatus.EXPIRED]: 'Not Filled', } const OrderStatus = ({ status, orderId, }: { - orderId: AsyncSwapOrder['orderId'] - status: AsyncSwapOrder['status'] + orderId: string + status: CowSwapOrderStatus }) => { return (
- {STATUS_MAP[status.type] === 'Order Filled' && ( + {STATUS_MAP[status] === 'Order Filled' && ( )} - {STATUS_MAP[status.type]} - {STATUS_MAP[status.type] === 'Not Filled' && ( + {STATUS_MAP[status]} + {STATUS_MAP[status] === 'Not Filled' && ( )} - {STATUS_MAP[status.type] === 'Order Filled' && ( + {STATUS_MAP[status] === 'Order Filled' && ( )} - {STATUS_MAP[status.type] === 'Processing' && ( + {STATUS_MAP[status] === 'Processing' && ( )}
) } -const CowSwapOrder = ({ - order: { orderId, quote, status }, -}: { - order: AsyncSwapOrder -}) => { +const CowSwapOrder = ({ orderId }: { orderId: string }) => { + const { data } = useOrderStatus({ orderId }) const tab = useAtomValue(currentAsyncSwapTabAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + if (!data) return null // TODO: Add a loading state + return (
token.address === quote.buyToken) + indexDTFBasket?.find((token) => token.address === data.buyToken) ?.symbol || '' } size="xl" @@ -84,7 +82,7 @@ const CowSwapOrder = ({
{tab === 'mint' ? '-' : '+'}{' '} - {formatCurrency(Number(formatUnits(BigInt(quote.sellAmount), 6)))}{' '} + {formatCurrency(Number(formatUnits(BigInt(data.sellAmount), 6)))}{' '} USDC
@@ -92,19 +90,19 @@ const CowSwapOrder = ({ {formatTokenAmount( Number( formatUnits( - BigInt(quote.buyAmount), + BigInt(data.buyAmount), indexDTFBasket?.find( - (token) => token.address === quote.buyToken + (token) => token.address === data.buyToken )?.decimals || 18 ) ) )}{' '} - {indexDTFBasket?.find((token) => token.address === quote.buyToken) + {indexDTFBasket?.find((token) => token.address === data.buyToken) ?.symbol || ''}
- +
) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts index b0b531be0..bcb3df6bc 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts @@ -1,5 +1,7 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' import { useQuery } from '@tanstack/react-query' +import { useSetAtom } from 'jotai' +import { asyncSwapResponseAtom } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' interface UseOrderStatusParams { @@ -8,6 +10,7 @@ interface UseOrderStatusParams { export function useOrderStatus({ orderId }: UseOrderStatusParams) { const { orderBookApi } = useGlobalProtocolKit() + const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) return useQuery({ queryKey: ['order/status', orderId], @@ -18,6 +21,19 @@ export function useOrderStatus({ orderId }: UseOrderStatusParams) { } const order = await orderBookApi.getOrder(orderId) + setAsyncSwapResponse((prev) => { + if (!prev) { + return undefined + } + + return { + ...prev, + cowswapOrders: [ + ...(prev?.cowswapOrders.filter((o) => o.orderId !== orderId) || []), + { ...order, orderId }, + ], + } + }) return order }, diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 6fb90750f..fb739b1eb 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -88,70 +88,70 @@ async function getQuote({ return quote } -export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { - const indexDTF = useAtomValue(indexDTFAtom) - const folioAddress = indexDTF?.id - const zapDirection = useAtomValue(currentAsyncSwapTabAtom) - const chainId = useAtomValue(chainIdAtom) - const address = useAtomValue(walletAtom) - const setQuotes = useSetAtom(quotesAtom) - const { orderBookApi } = useGlobalProtocolKit() +// export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { +// const indexDTF = useAtomValue(indexDTFAtom) +// const folioAddress = indexDTF?.id +// const zapDirection = useAtomValue(currentAsyncSwapTabAtom) +// const chainId = useAtomValue(chainIdAtom) +// const address = useAtomValue(walletAtom) +// const setQuotes = useSetAtom(quotesAtom) +// const { orderBookApi } = useGlobalProtocolKit() - return useQuery({ - queryKey: ['quote/single', sellToken, buyToken, amount, address], - enabled: - !!chainId && !!address && !!sellToken && !!buyToken && !!orderBookApi, - queryFn: async ({ signal }) => { - if (!orderBookApi) { - throw new Error('orderBookApi is not available') - } +// return useQuery({ +// queryKey: ['quote/single', sellToken, buyToken, amount, address], +// enabled: +// !!chainId && !!address && !!sellToken && !!buyToken && !!orderBookApi, +// queryFn: async ({ signal }) => { +// if (!orderBookApi) { +// throw new Error('orderBookApi is not available') +// } - try { - const quote = await getQuote({ - sellToken, - buyToken, - amount, - address: address as Address, - orderBookApi, - zapDirection, - }) +// try { +// const quote = await getQuote({ +// sellToken, +// buyToken, +// amount, +// address: address as Address, +// orderBookApi, +// zapDirection, +// }) - if (!signal.aborted) { - setQuotes((prev) => ({ - ...prev, - [folioAddress as string]: { - success: true, - type: QuoteProvider.CowSwap, - data: quote, - }, - })) - } +// if (!signal.aborted) { +// setQuotes((prev) => ({ +// ...prev, +// [folioAddress as string]: { +// success: true, +// type: QuoteProvider.CowSwap, +// data: quote, +// }, +// })) +// } - return { - token: zapDirection ? buyToken : sellToken, - success: true, - source: QuoteProvider.CowSwap, - quote, - } - } catch { - if (!signal.aborted) { - setQuotes((prev) => ({ - ...prev, - [folioAddress as string]: { - success: false, - }, - })) - } +// return { +// token: zapDirection ? buyToken : sellToken, +// success: true, +// source: QuoteProvider.CowSwap, +// quote, +// } +// } catch { +// if (!signal.aborted) { +// setQuotes((prev) => ({ +// ...prev, +// [folioAddress as string]: { +// success: false, +// }, +// })) +// } - return { - success: false, - } - } - }, - retry: false, - staleTime: Infinity, - }) -} +// return { +// success: false, +// } +// } +// }, +// retry: false, +// staleTime: Infinity, +// }) +// } export const useQuotesForMint = () => { const chainId = useAtomValue(chainIdAtom) @@ -217,7 +217,7 @@ export const useQuotesForMint = () => { setQuotes((prev) => ({ ...prev, [token.address as string]: { - success: true, + success: !!quote, type: QuoteProvider.CowSwap, data: quote, }, diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 6ab96a3b3..d98dc4071 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -1,3 +1,4 @@ +import CowswapSettlement from '@/abis/CowSwapSettlement' import { chainIdAtom, walletAtom } from '@/state/atoms' import { OrderBalance } from '@cowprotocol/contracts' import { @@ -10,31 +11,35 @@ import { useAtomValue, useSetAtom } from 'jotai' import { Address, encodeFunctionData, erc20Abi, Hex, maxUint256 } from 'viem' import { useSendCalls } from 'wagmi' import { + asyncSwapResponseAtom, currentAsyncSwapTabAtom, - ordersAtom, + orderIdsAtom, quotesAtom, selectedTokenOrDefaultAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' -import CowswapSettlement from '@/abis/CowSwapSettlement' +import { uuidv4 } from '@/utils' +import { indexDTFAtom } from '@/state/dtf/atoms' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const export function useQuoteSignatures() { + const indexDTF = useAtomValue(indexDTFAtom) const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) const zapDirection = useAtomValue(currentAsyncSwapTabAtom) const quoteToken = useAtomValue(selectedTokenOrDefaultAtom).address const quotes = Object.values(useAtomValue(quotesAtom)) - const setOrders = useSetAtom(ordersAtom) + const setOrderIDs = useSetAtom(orderIdsAtom) + const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const { orderBookApi } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() return useMutation({ mutationFn: async () => { - if (!address || !orderBookApi || !chainId) { + if (!address || !orderBookApi || !chainId || !indexDTF) { console.error('No global kit') return { orders: [], @@ -191,7 +196,17 @@ export function useQuoteSignatures() { }) ) - setOrders(validOrderData.map(({ data }) => data.orderId)) + setOrderIDs(validOrderData.map(({ data }) => data.orderId)) + setAsyncSwapResponse({ + swapOrderId: uuidv4(), + chainId, + signer: address, + dtf: indexDTF.id, + amountOut: '0', + createdAt: new Date().toISOString(), + universalOrders: [], + cowswapOrders: [], + }) return { orders: validOrderData.map(({ data }) => data.orderId), diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 18f59215d..c376daf21 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -18,6 +18,7 @@ import { asyncSwapInputAtom, asyncSwapOngoingTxAtom, asyncSwapRefetchAtom, + asyncSwapResponseAtom, currentAsyncSwapTabAtom, defaultSelectedTokenAtom, indexDTFBalanceAtom, @@ -27,7 +28,6 @@ import { } from './atom' import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' -import OrderStatusUpdater from './order-status-updater' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Success from './success' @@ -57,7 +57,6 @@ function Content() { showCollaterals && 'border-l-4' )} > -
@@ -71,6 +70,7 @@ const Header = () => { const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) const input = useAtomValue(asyncSwapInputAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 + const disableActions = !!useAtomValue(asyncSwapResponseAtom) return (
@@ -89,12 +89,14 @@ const Header = () => { Auto Mint Auto Redeem @@ -105,6 +107,7 @@ const Header = () => { variant="outline" className="h-[34px] px-2 rounded-xl" onClick={() => setShowSettings(true)} + disabled={disableActions} > @@ -112,7 +115,12 @@ const Header = () => { small onClick={asyncSwapRefetch.fn} loading={asyncSwapFetching} - disabled={asyncSwapFetching || asyncSwapOngoingTx || invalidInput} + disabled={ + asyncSwapFetching || + asyncSwapOngoingTx || + invalidInput || + disableActions + } />
diff --git a/src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx b/src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx deleted file mode 100644 index 0d1d0ad8a..000000000 --- a/src/views/index-dtf/issuance/async-swaps/order-status-updater.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useQuery } from '@tanstack/react-query' -import { useAtomValue, useSetAtom } from 'jotai' -import { useEffect } from 'react' -import { RESERVE_API } from '@/utils/constants' -import { asyncSwapResponseAtom, asyncSwapOrderIdAtom } from './atom' -import { AsyncSwapOrderResponse } from './types' - -const OrderStatusUpdater = () => { - const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - const swapOrderId = useAtomValue(asyncSwapOrderIdAtom) - - const { data } = useQuery({ - queryKey: ['async-swap-order', swapOrderId], - queryFn: async () => { - if (!swapOrderId) return null - const response = await fetch( - `${RESERVE_API}async-swap/order?orderId=${swapOrderId}` - ) - if (!response.ok) throw new Error(`Error: ${response.status}`) - return response.json() as Promise - }, - enabled: !!swapOrderId, - refetchInterval: 2000, // Poll every 2 seconds - retry: false, - }) - - useEffect(() => { - if (data) { - setAsyncSwapResponse(data) - } - }, [data, setAsyncSwapResponse]) - - return null -} - -export default OrderStatusUpdater diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index 76d87fda3..6515e56de 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,5 +1,5 @@ import { Token } from '@/types' -import { OrderQuoteResponse } from '@cowprotocol/cow-sdk' +import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' import { Address, Hex } from 'viem' export enum QuoteProvider { @@ -25,59 +25,13 @@ export type QuoteAggregated = data: unknown // TODO: Type Universal Quote Response } -export type AsyncSwapQuote = { - token: string - symbol: string - quote: { - quote: { - sellToken: Address - buyToken: Address - receiver: Address - sellAmount: string - buyAmount: string - validTo: number - appData: Hex - feeAmount: string - kind: string - partiallyFillable: boolean - sellTokenBalance: string - buyTokenBalance: string - signingScheme: string - } - from: string - expiration: string - id: number - verified: boolean - } -} - -export type AsyncSwapResponse = { - universalQuotes: AsyncSwapQuote[] // TODO: review it - cowswapQuotes: AsyncSwapQuote[] -} - -export type AsyncSwapOrder = { - orderId: string - quote: AsyncSwapQuote['quote']['quote'] - status: { - type: - | 'open' - | 'scheduled' - | 'active' - | 'solved' - | 'executing' - | 'traded' - | 'cancelled' - } -} - export type AsyncSwapOrderResponse = { swapOrderId: string chainId: number signer: Address dtf: Address amountOut: string - universalOrders: AsyncSwapOrder[] // TODO: review it - cowswapOrders: AsyncSwapOrder[] + universalOrders: any[] // TODO: review it + cowswapOrders: (EnrichedOrder & { orderId: string })[] createdAt: string } From 47eee9eb650883d50b7fc58c9b51c739e3948359 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 22 May 2025 14:59:13 -0300 Subject: [PATCH 32/85] fix: success component --- src/views/index-dtf/issuance/async-swaps/success.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 13e75a8cd..aba2d7a7c 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -265,7 +265,7 @@ const Transactions = () => {
- {cowswapOrders.map(({ orderId, quote }) => ( + {cowswapOrders.map(({ orderId, ...quote }) => (
Date: Thu, 22 May 2025 20:57:08 -0300 Subject: [PATCH 33/85] chore: working async mint w/ safe --- .../index-dtf/issuance/async-swaps/atom.ts | 6 +- .../issuance/async-swaps/cowswap-order.tsx | 61 +++--- .../issuance/async-swaps/hooks/useQuote.ts | 23 +- .../async-swaps/hooks/useQuoteSignatures.ts | 16 +- .../issuance/async-swaps/mint-button.tsx | 203 +++++++++++------- .../index-dtf/issuance/async-swaps/types.ts | 1 + 6 files changed, 181 insertions(+), 129 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index a71fc9831..701f86ec7 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -67,9 +67,11 @@ export const mintTxHashAtom = atom( export const mintValueAtom = atom((get) => { const inputAmount = get(asyncSwapInputAtom) const dtfPrice = get(indexDTFPriceAtom) - return ( + const result = ((Number(inputAmount) || 0) / (dtfPrice ?? 1)) * (1 - ASYNC_SWAP_BUFFER) - ) + + // 0.000001 is the minimum to avoid exponential notation when converting to string + return result > 0 && result < 0.000001 ? 0.000001 : result }) export const mintValueUSDAtom = atom((get) => { diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index 0dac36c59..9c9edc2a5 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -10,6 +10,7 @@ import { Link } from 'react-router-dom' import { formatUnits } from 'viem' import { currentAsyncSwapTabAtom } from './atom' import { useOrderStatus } from './hooks/useOrderStatus' +import { Skeleton } from '@/components/ui/skeleton' const STATUS_MAP: Record = { [CowSwapOrderStatus.PRESIGNATURE_PENDING]: 'Processing', @@ -63,46 +64,56 @@ const CowSwapOrder = ({ orderId }: { orderId: string }) => { const tab = useAtomValue(currentAsyncSwapTabAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) - if (!data) return null // TODO: Add a loading state - return (
token.address === data.buyToken) + indexDTFBasket?.find((token) => token.address === data?.buyToken) ?.symbol || '' } size="xl" />
-
- {tab === 'mint' ? '-' : '+'}{' '} - {formatCurrency(Number(formatUnits(BigInt(data.sellAmount), 6)))}{' '} - USDC -
-
- {tab === 'mint' ? '+' : '-'}{' '} - {formatTokenAmount( - Number( - formatUnits( - BigInt(data.buyAmount), - indexDTFBasket?.find( - (token) => token.address === data.buyToken - )?.decimals || 18 + {data?.sellAmount ? ( +
+ {tab === 'mint' ? '-' : '+'}{' '} + {formatCurrency(Number(formatUnits(BigInt(data.sellAmount), 6)))}{' '} + USDC +
+ ) : ( + + )} + {data?.buyAmount ? ( +
+ {tab === 'mint' ? '+' : '-'}{' '} + {formatTokenAmount( + Number( + formatUnits( + BigInt(data.buyAmount), + indexDTFBasket?.find( + (token) => token.address === data.buyToken + )?.decimals || 18 + ) ) - ) - )}{' '} - {indexDTFBasket?.find((token) => token.address === data.buyToken) - ?.symbol || ''} -
+ )}{' '} + {indexDTFBasket?.find((token) => token.address === data.buyToken) + ?.symbol || ''} +
+ ) : ( + + )}
- + {data?.status ? ( + + ) : ( + + )}
) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index fb739b1eb..3f17b4f13 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -1,9 +1,7 @@ import { useERC20Balances } from '@/hooks/useERC20Balance' import useTokensInfo from '@/hooks/useTokensInfo' import { chainIdAtom, walletAtom } from '@/state/atoms' -import { indexDTFAtom } from '@/state/dtf/atoms' import { Token } from '@/types' -import { safeParseEther } from '@/utils' import { OrderBookApi, OrderQuoteSideKindBuy, @@ -12,14 +10,9 @@ import { SigningScheme, } from '@cowprotocol/cow-sdk' import { useQuery } from '@tanstack/react-query' -import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { Address, zeroAddress } from 'viem' -import { - asyncSwapInputAtom, - currentAsyncSwapTabAtom, - quotesAtom, - selectedTokenOrDefaultAtom, -} from '../atom' +import { useAtom, useAtomValue } from 'jotai' +import { Address, parseEther, zeroAddress } from 'viem' +import { mintValueAtom, quotesAtom, selectedTokenOrDefaultAtom } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' import { useFolioDetails } from './useFolioDetails' @@ -155,9 +148,9 @@ async function getQuote({ export const useQuotesForMint = () => { const chainId = useAtomValue(chainIdAtom) - const inputAmount = useAtomValue(asyncSwapInputAtom) const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) - const folioAmount = safeParseEther(inputAmount) + const mintValue = useAtomValue(mintValueAtom) + const folioAmount = parseEther(mintValue.toString()) const address = useAtomValue(walletAtom) const [quotes, setQuotes] = useAtom(quotesAtom) const { orderBookApi } = useGlobalProtocolKit() @@ -248,10 +241,6 @@ export const useQuotesForMint = () => { return quotes }, - enabled: - !!folioDetails?.mintValues && - !!tokensInfo && - !!inputAmount && - !isNaN(Number(inputAmount)), + enabled: !!folioDetails?.mintValues && !!tokensInfo && !!folioAmount, }) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index d98dc4071..4e35a71ed 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -8,11 +8,20 @@ import { } from '@cowprotocol/cow-sdk' import { useMutation } from '@tanstack/react-query' import { useAtomValue, useSetAtom } from 'jotai' -import { Address, encodeFunctionData, erc20Abi, Hex, maxUint256 } from 'viem' +import { + Address, + encodeFunctionData, + erc20Abi, + Hex, + maxUint256, + parseEther, +} from 'viem' import { useSendCalls } from 'wagmi' import { + asyncSwapInputAtom, asyncSwapResponseAtom, currentAsyncSwapTabAtom, + mintValueAtom, orderIdsAtom, quotesAtom, selectedTokenOrDefaultAtom, @@ -30,6 +39,8 @@ export function useQuoteSignatures() { const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const mintValue = useAtomValue(mintValueAtom) + const inputAmount = useAtomValue(asyncSwapInputAtom) const quoteToken = useAtomValue(selectedTokenOrDefaultAtom).address const quotes = Object.values(useAtomValue(quotesAtom)) const setOrderIDs = useSetAtom(orderIdsAtom) @@ -202,7 +213,8 @@ export function useQuoteSignatures() { chainId, signer: address, dtf: indexDTF.id, - amountOut: '0', + inputAmount, + amountOut: parseEther(mintValue.toString()).toString(), createdAt: new Date().toISOString(), universalOrders: [], cowswapOrders: [], diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx index 325342d6c..7ec379a29 100644 --- a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -1,104 +1,136 @@ import dtfIndexAbi from '@/abis/dtf-index-abi' +import dtfIndexAbiV2 from '@/abis/dtf-index-abi-v2' import TokenLogo from '@/components/token-logo' import { Button } from '@/components/ui/button' -import { walletAtom } from '@/state/atoms' -import { wagmiConfig } from '@/state/chain' -import { indexDTFAtom } from '@/state/dtf/atoms' +import { useERC20Balances } from '@/hooks/useERC20Balance' +import { chainIdAtom, walletAtom } from '@/state/atoms' +import { indexDTFAtom, indexDTFVersionAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { Loader } from 'lucide-react' -import { useCallback } from 'react' -import { erc20Abi } from 'viem' -import { usePublicClient, useWalletClient } from 'wagmi' -import { asyncSwapResponseAtom, isMintingAtom, mintTxHashAtom } from './atom' +import { useEffect, useMemo } from 'react' +import { encodeFunctionData, erc20Abi, maxUint256, parseEther } from 'viem' +import { useCallsStatus, useSendCalls } from 'wagmi' +import { isMintingAtom, mintTxHashAtom, mintValueAtom } from './atom' +import { useFolioDetails } from './hooks/useFolioDetails' const MintButton = () => { + const account = useAtomValue(walletAtom) const indexDTF = useAtomValue(indexDTFAtom) - const orders = useAtomValue(asyncSwapResponseAtom) - const [isMinting, setIsMinting] = useAtom(isMintingAtom) + const mintAmount = useAtomValue(mintValueAtom) + const folioAmount = parseEther(mintAmount.toString()) + const chainId = useAtomValue(chainIdAtom) + const indexDTFVersion = useAtomValue(indexDTFVersionAtom) const setMintTxHash = useSetAtom(mintTxHashAtom) - const { data: walletClient } = useWalletClient({ config: wagmiConfig }) - const publicClient = usePublicClient({ config: wagmiConfig }) - const account = useAtomValue(walletAtom) - const handleMint = useCallback(async () => { - if ( - !indexDTF || - !walletClient || - !publicClient || - !orders?.cowswapOrders?.length || - !account + const [isMinting, setIsMinting] = useAtom(isMintingAtom) + const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) + const { data, sendCalls, isPending, isError } = useSendCalls() + + const { data: callsStatus } = useCallsStatus({ + id: data?.id || '', + }) + console.log('data', data) + console.log('callsStatus', callsStatus) + const { data: balanceData, isFetching: isFetchingBalanceData } = + useERC20Balances( + folioDetails?.assets.map((address) => ({ + address, + chainId, + })) || [] ) + + const maxMintableAmount = useMemo(() => { + if (!folioDetails?.mintValues || !balanceData || !balanceData.length) { + return 0n + } + + // For each token, calculate how many folio tokens we can mint based on available balance + const mintableAmounts = folioDetails.mintValues.map((mintValue, index) => { + if (mintValue === 0n) { + return 0n + } + const balance = balanceData[index] as bigint + return (balance * folioAmount) / mintValue + }) + + // Return the minimum amount (as we need all tokens to mint) + return mintableAmounts.reduce((min, amount) => { + if (amount === 0n) { + return min + } + + return amount < min ? amount : min + }, mintableAmounts[0] || 0n) + }, [folioDetails?.mintValues, balanceData, folioAmount]) + + const handleMaxMint = () => { + if (!account || !folioDetails || !indexDTF) { return + } setIsMinting(true) - try { - // Approve each token with a 10% buffer - for (const order of orders.cowswapOrders) { - const buyAmount = BigInt(order.quote.buyAmount) - const amountWithBuffer = (buyAmount * 150n) / 100n // 50% buffer - - // Check current allowance - const currentAllowance = await publicClient.readContract({ - address: order.quote.buyToken, - abi: erc20Abi, - functionName: 'allowance', - args: [account, indexDTF.id], - }) - - // Only approve if current allowance is insufficient - if (currentAllowance < amountWithBuffer) { - // Simulate approval - const { request } = await publicClient.simulateContract({ - address: order.quote.buyToken, + + sendCalls({ + calls: [ + ...folioDetails.assets.map((e) => ({ + to: e, + value: 0n, + data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', - args: [indexDTF.id, amountWithBuffer], - account, - }) - - // Send approval - const hash = await walletClient.writeContract(request) - const receipt = await publicClient.waitForTransactionReceipt({ hash }) - - // Verify the approval was successful - if (receipt.status !== 'success') { - throw new Error('Approval transaction failed') - } - - // Double check the new allowance - const newAllowance = await publicClient.readContract({ - address: order.quote.buyToken, - abi: erc20Abi, - functionName: 'allowance', - args: [account, indexDTF.id], - }) - - if (newAllowance < amountWithBuffer) { - throw new Error('Approval amount is still insufficient') - } - } - } + args: [indexDTF.id, maxUint256], + }), + })), + { + to: indexDTF.id, + data: + indexDTFVersion === '2.0.0' + ? encodeFunctionData({ + abi: dtfIndexAbiV2, + functionName: 'mint', + args: [ + maxMintableAmount, + account, + (maxMintableAmount * 99n) / 100n, + ], + }) + : encodeFunctionData({ + abi: dtfIndexAbi, + functionName: 'mint', + args: [maxMintableAmount, account], + }), + value: 0n, + }, + ], + forceAtomic: true, + }) + } + + useEffect(() => { + const receipts = callsStatus?.receipts + const success = + !!receipts && + receipts.length > 0 && + receipts.every((r) => r.status === 'success') + + if (success) { + let mintTxHash = receipts.slice(-1)[0]?.transactionHash || 'tx' + setMintTxHash(mintTxHash) + setIsMinting(false) + } + + const failure = callsStatus?.status === 'failure' + + if (failure) { + setIsMinting(false) + } + }, [callsStatus?.receipts]) - // Perform minting - const shares = BigInt(orders.amountOut) - - const { request } = await publicClient.simulateContract({ - address: indexDTF.id, - abi: dtfIndexAbi, - functionName: 'mint', - args: [shares, account], - account, - }) - - const hash = await walletClient.writeContract(request) - const receipt = await publicClient.waitForTransactionReceipt({ hash }) - setMintTxHash(receipt.transactionHash) - } catch (error) { - console.error('Error during mint process:', error) - } finally { + useEffect(() => { + if (isError) { setIsMinting(false) } - }, [indexDTF, walletClient, publicClient, orders, setMintTxHash, account]) + }, [isError]) if (!indexDTF) return null @@ -124,7 +156,12 @@ const MintButton = () => { } return ( -
diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx new file mode 100644 index 000000000..f6ca892eb --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx @@ -0,0 +1,47 @@ +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' +import { useAtomValue } from 'jotai' +import { redeemAssetsAtom } from '../atom' +import { useQuoteSignatures } from '../hooks/useQuoteSignatures' + +type SubmitRedeemOrdersProps = { + loadingQuote?: boolean +} + +const SubmitRedeemOrders = ({ loadingQuote }: SubmitRedeemOrdersProps) => { + const redeemAssets = useAtomValue(redeemAssetsAtom) + const { mutate, isPending } = useQuoteSignatures() + + const disabled = + isPending || + loadingQuote || + !redeemAssets || + Object.keys(redeemAssets).length === 0 + + return ( +
+ +
+ ) +} + +export default SubmitRedeemOrders diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx index 289d01f43..cdf88889d 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx @@ -8,43 +8,43 @@ import { useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect } from 'react' import { Address, parseEventLogs } from 'viem' import { + useSendCalls, + useWaitForCallsStatus, useWaitForTransactionReceipt, useWalletClient, useWriteContract, } from 'wagmi' -import { assetDistributionAtom } from '../../manual/atoms' -import { asyncSwapInputAtom, redeemAssetsAtom } from '../atom' +import { asyncSwapInputAtom, mintTxHashAtom, redeemAssetsAtom } from '../atom' +import { useFolioDetails } from '../hooks/useFolioDetails' const SubmitRedeem = () => { const chainId = useAtomValue(chainIdAtom) const account = useAtomValue(walletAtom) const indexDTF = useAtomValue(indexDTFAtom) - const assetDistribution = useAtomValue(assetDistributionAtom) const amount = useAtomValue(asyncSwapInputAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) + const setRedeemTxHash = useSetAtom(mintTxHashAtom) + const sharesToRedeem = safeParseEther(amount) const { data: walletClient } = useWalletClient() - const { - data, - isPending, - error: signError, - writeContract, - } = useWriteContract() + const { data: folioDetails } = useFolioDetails({ shares: sharesToRedeem }) - const { - data: receipt, - isLoading: isReceiptLoading, - error: txError, - } = useWaitForTransactionReceipt({ - hash: data, - chainId, - }) + const { data, sendCalls, isPending } = useSendCalls() + + const { data: callsStatus, isLoading: isReceiptLoading } = + useWaitForCallsStatus({ + id: data?.id || '', + }) useEffect(() => { - if (receipt?.status === 'success') { + if (callsStatus?.status === 'success') { + const receipt = callsStatus.receipts?.[0] + + setRedeemTxHash(receipt?.transactionHash || 'tx-hash-not-found') + const events = parseEventLogs({ abi: dtfIndexAbi, - logs: receipt.logs, + logs: receipt?.logs as any, eventName: 'Transfer', }) @@ -59,49 +59,39 @@ const SubmitRedeem = () => { })) }) } - }, [receipt]) + }, [callsStatus]) - const handleSubmit = useCallback(async () => { - if (!chainId || !walletClient || !account || !indexDTF || !amount) return + const handleSubmit = useCallback(() => { + if ( + !chainId || + !walletClient || + !account || + !indexDTF || + !amount || + !folioDetails + ) + return try { - const assets: Address[] = [] - const minAmounts: bigint[] = [] - const sharesToRedeem = safeParseEther(amount) - - const requiredAmounts = Object.keys(assetDistribution).reduce( - (acc, asset) => { - acc[asset] = - (assetDistribution[asset] * sharesToRedeem) / safeParseEther('1') - return acc - }, - {} as Record - ) - - for (const asset of Object.keys(requiredAmounts)) { - assets.push(asset as Address) - // 5% slippage - // TODO: This is worst case scenario, but it maybe too much? - minAmounts.push((requiredAmounts[asset] * 95n) / 100n) - } - - const hash = writeContract({ - address: indexDTF.id, - abi: dtfIndexAbi, - functionName: 'redeem', - args: [ - sharesToRedeem, - account, - assets as `0x${string}`[], - minAmounts as bigint[], + sendCalls({ + calls: [ + { + to: indexDTF.id, + abi: dtfIndexAbi, + functionName: 'redeem', + args: [ + sharesToRedeem, + account, + folioDetails.assets ?? [], + folioDetails.redeemValues.map((e) => (e * 95n) / 100n), + ], + }, ], }) - - console.log('Redeem transaction sent:', hash) } catch (error) { console.error('Error processing orders:', error) } - }, [chainId, walletClient, account, indexDTF, amount]) + }, [chainId, walletClient, account, indexDTF, amount, folioDetails]) const disabled = isPending || isReceiptLoading || !amount diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 701f86ec7..1c2ee955c 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -64,6 +64,8 @@ export const mintTxHashAtom = atom( undefined ) +export const successAtom = atom(false) + export const mintValueAtom = atom((get) => { const inputAmount = get(asyncSwapInputAtom) const dtfPrice = get(indexDTFPriceAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 0955426bd..b79aa4b74 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -2,13 +2,14 @@ import StackTokenLogo from '@/components/token-logo/StackTokenLogo' import { Button } from '@/components/ui/button' import { indexDTFBasketAtom } from '@/state/dtf/atoms' import { getTimerFormat } from '@/utils' -import { useAtom, useAtomValue } from 'jotai' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, ArrowRight, Check, Loader } from 'lucide-react' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { asyncSwapResponseAtom, collateralPanelOpenAtom, currentAsyncSwapTabAtom, + successAtom, } from './atom' import MintButton from './mint-button' import { OrderStatus } from '@cowprotocol/cow-sdk' @@ -37,9 +38,10 @@ const OpenCollateralPanel = () => { } const CollateralAcquisition = () => { - const tab = useAtomValue(currentAsyncSwapTabAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const [elapsedTime, setElapsedTime] = useState(0) + const setSuccess = useSetAtom(successAtom) useEffect(() => { if (!asyncSwapResponse?.createdAt) return @@ -56,11 +58,22 @@ const CollateralAcquisition = () => { if (!asyncSwapResponse) return null - const hasAllCollaterals = asyncSwapResponse.cowswapOrders.every( - (order) => order.status === OrderStatus.FULFILLED + const hasAllCollaterals = useMemo( + () => + asyncSwapResponse.cowswapOrders.length > 0 && + asyncSwapResponse.cowswapOrders.every( + (order) => order.status === OrderStatus.FULFILLED + ), + [asyncSwapResponse.cowswapOrders] ) - if (hasAllCollaterals) { + useEffect(() => { + if (hasAllCollaterals && zapDirection === 'redeem') { + setSuccess(true) + } + }, [hasAllCollaterals, setSuccess, zapDirection]) + + if (hasAllCollaterals && zapDirection === 'mint') { return (
@@ -85,7 +98,7 @@ const CollateralAcquisition = () => {
- {tab === 'mint' + {zapDirection === 'mint' ? 'Acquiring Collateral' : 'Selling collateral for USDC'}
diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index 9c9edc2a5..1b04c9054 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -61,7 +61,7 @@ const OrderStatus = ({ const CowSwapOrder = ({ orderId }: { orderId: string }) => { const { data } = useOrderStatus({ orderId }) - const tab = useAtomValue(currentAsyncSwapTabAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) return ( @@ -81,8 +81,17 @@ const CowSwapOrder = ({ orderId }: { orderId: string }) => {
{data?.sellAmount ? (
- {tab === 'mint' ? '-' : '+'}{' '} - {formatCurrency(Number(formatUnits(BigInt(data.sellAmount), 6)))}{' '} + {zapDirection === 'mint' ? '-' : '+'}{' '} + {formatCurrency( + Number( + formatUnits( + BigInt( + zapDirection === 'mint' ? data.sellAmount : data.buyAmount + ), + 6 + ) + ) + )}{' '} USDC
) : ( @@ -90,19 +99,28 @@ const CowSwapOrder = ({ orderId }: { orderId: string }) => { )} {data?.buyAmount ? (
- {tab === 'mint' ? '+' : '-'}{' '} + {zapDirection === 'mint' ? '+' : '-'}{' '} {formatTokenAmount( Number( formatUnits( - BigInt(data.buyAmount), + BigInt( + zapDirection === 'mint' ? data.buyAmount : data.sellAmount + ), indexDTFBasket?.find( - (token) => token.address === data.buyToken + (token) => + token.address === + (zapDirection === 'mint' + ? data.buyToken + : data.sellToken) )?.decimals || 18 ) ) )}{' '} - {indexDTFBasket?.find((token) => token.address === data.buyToken) - ?.symbol || ''} + {indexDTFBasket?.find( + (token) => + token.address === + (zapDirection === 'mint' ? data.buyToken : data.sellToken) + )?.symbol || ''}
) : ( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 3f17b4f13..472942878 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -12,7 +12,12 @@ import { import { useQuery } from '@tanstack/react-query' import { useAtom, useAtomValue } from 'jotai' import { Address, parseEther, zeroAddress } from 'viem' -import { mintValueAtom, quotesAtom, selectedTokenOrDefaultAtom } from '../atom' +import { + mintValueAtom, + quotesAtom, + redeemAssetsAtom, + selectedTokenOrDefaultAtom, +} from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' import { useFolioDetails } from './useFolioDetails' @@ -244,3 +249,94 @@ export const useQuotesForMint = () => { enabled: !!folioDetails?.mintValues && !!tokensInfo && !!folioAmount, }) } + +export const useQuotesForRedeem = () => { + const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const redeemAssets = useAtomValue(redeemAssetsAtom) + const address = useAtomValue(walletAtom) + const [quotes, setQuotes] = useAtom(quotesAtom) + const { orderBookApi } = useGlobalProtocolKit() + + const assets = Object.keys(redeemAssets) + + const { data: tokensInfo } = useTokensInfo( + assets.map((address) => address as Address) + ) + + return useQuery({ + queryKey: ['quotes/redeem', assets, redeemAssets], + queryFn: async ({ signal }) => { + if ( + !redeemAssets || + !assets || + !assets.length || + !tokensInfo || + !orderBookApi + ) { + return {} + } + + const quotePromises = + assets.map(async (asset) => { + const token = tokensInfo[asset.toLowerCase()] + const amount = redeemAssets[asset as Address] + + try { + return await getQuote({ + sellToken: token, + buyToken: selectedToken, + amount, + address: address as Address, + orderBookApi, + zapDirection: 'redeem', + }) + } catch (error) { + console.error(`Error getting quote for ${asset}:`, error) + return null + } + }) || [] + + const results = await Promise.all(quotePromises) + + assets.forEach((asset, i) => { + const token = tokensInfo[asset.toLowerCase()] + const quote = results[i] + try { + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [token.address as string]: { + success: !!quote, + type: QuoteProvider.CowSwap, + data: quote, + }, + })) + } + + return { + token: token, + success: true, + source: QuoteProvider.CowSwap, + quote, + } + } catch { + if (!signal.aborted) { + setQuotes((prev) => ({ + ...prev, + [token.address as string]: { + success: false, + }, + })) + } + + return { + success: false, + } + } + }) + + return quotes + }, + enabled: !!assets && !!tokensInfo && !!redeemAssets && assets.length > 0, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index c376daf21..127d4368e 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -22,9 +22,10 @@ import { currentAsyncSwapTabAtom, defaultSelectedTokenAtom, indexDTFBalanceAtom, - mintTxHashAtom, + redeemAssetsAtom, selectedTokenAtom, showAsyncSwapSettingsAtom, + successAtom, } from './atom' import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' @@ -70,7 +71,10 @@ const Header = () => { const asyncSwapOngoingTx = useAtomValue(asyncSwapOngoingTxAtom) const input = useAtomValue(asyncSwapInputAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 - const disableActions = !!useAtomValue(asyncSwapResponseAtom) + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const redeemAssets = useAtomValue(redeemAssetsAtom) + const disableActions = + !!asyncSwapResponse || Object.keys(redeemAssets).length > 0 return (
@@ -138,7 +142,7 @@ const AsyncSwaps = () => { const setSelectedToken = useSetAtom(selectedTokenAtom) const indexDTF = useAtomValue(indexDTFAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) - const mintTxHash = useAtomValue(mintTxHashAtom) + const success = useAtomValue(successAtom) const { data: balance } = useERC20Balance(indexDTF?.id) @@ -171,7 +175,7 @@ const AsyncSwaps = () => { ) } - if (mintTxHash) { + if (success) { return (
diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx index 7ec379a29..f2d5d7c3a 100644 --- a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -9,8 +9,13 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { Loader } from 'lucide-react' import { useEffect, useMemo } from 'react' import { encodeFunctionData, erc20Abi, maxUint256, parseEther } from 'viem' -import { useCallsStatus, useSendCalls } from 'wagmi' -import { isMintingAtom, mintTxHashAtom, mintValueAtom } from './atom' +import { useSendCalls, useWaitForCallsStatus } from 'wagmi' +import { + isMintingAtom, + mintTxHashAtom, + mintValueAtom, + successAtom, +} from './atom' import { useFolioDetails } from './hooks/useFolioDetails' const MintButton = () => { @@ -21,16 +26,16 @@ const MintButton = () => { const chainId = useAtomValue(chainIdAtom) const indexDTFVersion = useAtomValue(indexDTFVersionAtom) const setMintTxHash = useSetAtom(mintTxHashAtom) + const setSuccess = useSetAtom(successAtom) const [isMinting, setIsMinting] = useAtom(isMintingAtom) const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) const { data, sendCalls, isPending, isError } = useSendCalls() - const { data: callsStatus } = useCallsStatus({ + const { data: callsStatus } = useWaitForCallsStatus({ id: data?.id || '', }) - console.log('data', data) - console.log('callsStatus', callsStatus) + const { data: balanceData, isFetching: isFetchingBalanceData } = useERC20Balances( folioDetails?.assets.map((address) => ({ @@ -107,24 +112,21 @@ const MintButton = () => { } useEffect(() => { - const receipts = callsStatus?.receipts - const success = - !!receipts && - receipts.length > 0 && - receipts.every((r) => r.status === 'success') + const isSuccess = callsStatus?.status === 'success' + const isFailure = callsStatus?.status === 'failure' - if (success) { + if (isSuccess) { + const receipts = callsStatus?.receipts ?? [] let mintTxHash = receipts.slice(-1)[0]?.transactionHash || 'tx' setMintTxHash(mintTxHash) + setSuccess(true) setIsMinting(false) } - const failure = callsStatus?.status === 'failure' - - if (failure) { + if (isFailure) { setIsMinting(false) } - }, [callsStatus?.receipts]) + }, [callsStatus?.receipts, callsStatus?.status]) useEffect(() => { if (isError) { diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index aba2d7a7c..32b24393d 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -22,29 +22,37 @@ import { } from 'lucide-react' import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { formatEther, formatUnits } from 'viem' +import { formatEther } from 'viem' import { asyncSwapInputAtom, asyncSwapOrderIdAtom, asyncSwapResponseAtom, bufferValueAtom, + currentAsyncSwapTabAtom, mintTxHashAtom, mintValueUSDAtom, + redeemAssetsAtom, + successAtom, } from './atom' +import CowSwapOrder from './cowswap-order' const viewTransactionsAtom = atom(false) const CloseButton = () => { const setMintTxHash = useSetAtom(mintTxHashAtom) + const setSuccess = useSetAtom(successAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) const setAsyncSwapInput = useSetAtom(asyncSwapInputAtom) + const setRedeemAssets = useSetAtom(redeemAssetsAtom) const handleClose = () => { setMintTxHash(undefined) + setSuccess(false) setAsyncSwapResponse(undefined) setAsyncSwapOrderId(undefined) setAsyncSwapInput('') + setRedeemAssets({}) } return ( @@ -112,12 +120,13 @@ const SuccessHeader = () => { ) } -const MintedAmount = () => { +const DTFAmount = () => { const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) const orders = useAtomValue(asyncSwapResponseAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) const valueMinted = (indexDTFPrice || 0) * sharesMinted @@ -127,13 +136,15 @@ const MintedAmount = () => { return (
-
You Minted:
+
+ {zapDirection === 'mint' ? 'You Minted:' : 'You Redeemed:'} +
{formatTokenAmount(sharesMinted)}
-
VTF
+
{indexDTF?.token.symbol || ''}
{ className="rounded-full" />
-
- ${formatCurrency(valueMinted)}{' '} - ({priceImpact}%) -
+ {zapDirection === 'mint' && ( +
+ ${formatCurrency(valueMinted)}{' '} + ({priceImpact}%) +
+ )}
) } -const UsedAmount = () => { +const USDCAmount = () => { const inputAmount = useAtomValue(asyncSwapInputAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) return (
-
You Used:
+
+ {zapDirection === 'mint' ? 'You Used:' : 'You Received:'} +
@@ -165,20 +181,24 @@ const UsedAmount = () => {
USDC
-
- - {formatCurrency(Number(inputAmount))} USDC - - -
+ {zapDirection === 'mint' && ( +
+ + {formatCurrency(Number(inputAmount))} USDC + + +
+ )}
${formatCurrency(inputAmountUSD)}{' '} - - ${formatCurrency(Number(inputAmount))} - + {zapDirection === 'mint' && ( + + ${formatCurrency(Number(inputAmount))} + + )}
- + {zapDirection === 'mint' && }
) } @@ -205,13 +225,53 @@ const BufferInfo = () => { ) } -const Transactions = () => { - const setViewTransactions = useSetAtom(viewTransactionsAtom) +const MainTransaction = () => { const indexDTF = useAtomValue(indexDTFAtom) - const indexDTFBasket = useAtomValue(indexDTFBasketAtom) const mintTxHash = useAtomValue(mintTxHashAtom) - const orders = useAtomValue(asyncSwapResponseAtom) + const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + return ( +
+
+ +
+ + {zapDirection === 'mint' + ? `${indexDTF?.token.symbol} Minted` + : `${indexDTF?.token.symbol} Redeemed`} + +
+ {shortenAddress(indexDTF?.id || '')} +
+
+
+
+
+ +
+ + + +
+
+ ) +} + +const Transactions = () => { + const setViewTransactions = useSetAtom(viewTransactionsAtom) + const orders = useAtomValue(asyncSwapResponseAtom) const { cowswapOrders = [] } = orders || {} return ( @@ -231,93 +291,10 @@ const Transactions = () => {
-
-
- -
- - {indexDTF?.token.symbol} Minted - -
- {shortenAddress(indexDTF?.id || '')} -
-
-
-
-
- -
- - - -
-
+
- {cowswapOrders.map(({ orderId, ...quote }) => ( -
-
- token.address === quote.buyToken - )?.symbol || '' - } - size="xl" - /> -
-
- - - {formatCurrency( - Number(formatUnits(BigInt(quote.sellAmount), 6)) - )}{' '} - USDC -
-
- + - {formatTokenAmount( - Number( - formatUnits( - BigInt(quote.buyAmount), - indexDTFBasket?.find( - (token) => token.address === quote.buyToken - )?.decimals || 18 - ) - ) - )}{' '} - {indexDTFBasket?.find( - (token) => token.address === quote.buyToken - )?.symbol || ''} -
-
-
-
- - Order Filled - - - -
-
+ {cowswapOrders.map(({ orderId }) => ( + ))}
@@ -365,8 +342,8 @@ const Success = () => {
- - + +
From 597cf57bfb148077087fc0254fb9182e096ecc30 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 26 May 2025 11:01:25 -0300 Subject: [PATCH 35/85] chore: clean atoms --- .../issuance/async-swaps/async-mint/index.tsx | 35 ++------ .../async-mint/submit-mint-orders.tsx | 4 +- .../async-swaps/async-redeem/index.tsx | 48 +++-------- .../async-redeem/submit-redeem.tsx | 22 ++--- .../index-dtf/issuance/async-swaps/atom.ts | 80 ++++++++----------- .../async-swaps/collateral-acquisition.tsx | 16 ++-- .../issuance/async-swaps/collaterals.tsx | 6 +- .../issuance/async-swaps/cowswap-order.tsx | 18 ++--- .../issuance/async-swaps/hooks/useQuote.ts | 53 ++++++++---- .../async-swaps/hooks/useQuoteSignatures.ts | 20 ++--- .../index-dtf/issuance/async-swaps/index.tsx | 42 ++++------ .../issuance/async-swaps/mint-button.tsx | 9 +-- .../issuance/async-swaps/success.tsx | 45 +++++------ 13 files changed, 164 insertions(+), 234 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index af22dcc01..e6209f4c7 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -8,15 +8,10 @@ import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' -import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { useEffect } from 'react' +import { useAtom, useAtomValue } from 'jotai' import { parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { - asyncSwapFetchingAtom, - asyncSwapInputAtom, - asyncSwapOngoingTxAtom, - asyncSwapRefetchAtom, asyncSwapResponseAtom, bufferValueAtom, collateralAcquiredAtom, @@ -24,9 +19,9 @@ import { mintValueAtom, mintValueUSDAtom, mintValueWeiAtom, + selectedTokenAtom, selectedTokenBalanceAtom, - selectedTokenOrDefaultAtom, - slippageAtom, + userInputAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' import { useQuotesForMint } from '../hooks/useQuote' @@ -35,14 +30,10 @@ import SubmitMint from './submit-mint-orders' const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) - const [inputAmount, setInputAmount] = useAtom(asyncSwapInputAtom) - const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const [inputAmount, setInputAmount] = useAtom(userInputAtom) + const selectedToken = useAtomValue(selectedTokenAtom) const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const isMinting = useAtomValue(isMintingAtom) - const slippage = useAtomValue(slippageAtom) - const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) - const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) - const setAsyncSwapFetching = useSetAtom(asyncSwapFetchingAtom) const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') @@ -58,8 +49,7 @@ const AsyncMint = () => { parseUnits(inputAmount, selectedToken.decimals) > (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, refetch, failureReason } = - useQuotesForMint() + const { data, isLoading, isFetching, failureReason } = useQuotesForMint() const { loadingAfterRefetch } = useLoadingAfterRefetch(data) @@ -74,19 +64,6 @@ const AsyncMint = () => { // ) const awaitingQuote = isLoading || isFetching - useEffect(() => { - setAsyncSwapRefetch({ fn: refetch }) - }, [refetch, setAsyncSwapRefetch]) - - useEffect(() => { - setAsyncSwapFetching(awaitingQuote) - }, [awaitingQuote, setAsyncSwapFetching]) - - useEffect(() => { - setOngoingTx(false) - setInputAmount('') - }, []) - if (!indexDTF) return null return ( diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 1d2e2fe6a..28fbac191 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -1,7 +1,7 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' import { useQuoteSignatures } from '../hooks/useQuoteSignatures' -import { asyncSwapInputAtom } from '../atom' +import { userInputAtom } from '../atom' import { useAtomValue } from 'jotai' type SubmitMintProps = { @@ -9,7 +9,7 @@ type SubmitMintProps = { } const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { - const inputAmount = useAtomValue(asyncSwapInputAtom) + const inputAmount = useAtomValue(userInputAtom) const { mutate, isPending } = useQuoteSignatures() const disabled = diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 114aafedd..bdb716c9c 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -1,25 +1,21 @@ -import Swap, { +import TokenLogo from '@/components/token-logo' +import StackTokenLogo from '@/components/token-logo/StackTokenLogo' +import { ArrowSeparator, TokenInputBox, TokenOutputBox, } from '@/components/ui/swap' import { cn } from '@/lib/utils' -import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom, indexDTFBasketAtom, indexDTFPriceAtom, } from '@/state/dtf/atoms' import { formatCurrency } from '@/utils' -import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { useEffect } from 'react' +import { useAtom, useAtomValue } from 'jotai' import { formatEther, parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { - asyncSwapFetchingAtom, - asyncSwapInputAtom, - asyncSwapOngoingTxAtom, - asyncSwapRefetchAtom, asyncSwapResponseAtom, bufferValueAtom, collateralAcquiredAtom, @@ -29,20 +25,18 @@ import { mintValueUSDAtom, mintValueWeiAtom, redeemAssetsAtom, + selectedTokenAtom, selectedTokenBalanceAtom, - selectedTokenOrDefaultAtom, - slippageAtom, + userInputAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' -import SubmitRedeem from './submit-redeem' -import TokenLogo from '@/components/token-logo' -import StackTokenLogo from '@/components/token-logo/StackTokenLogo' import { useQuotesForRedeem } from '../hooks/useQuote' +import SubmitRedeem from './submit-redeem' import SubmitRedeemOrders from './submit-redeem-orders' const CustomInputBox = () => { const indexDTF = useAtomValue(indexDTFAtom) - const inputAmount = useAtomValue(asyncSwapInputAtom) + const inputAmount = useAtomValue(userInputAtom) const basket = useAtomValue(indexDTFBasketAtom) if (!indexDTF) return null @@ -75,16 +69,11 @@ const CustomInputBox = () => { } const AsyncRedeem = () => { - const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) - const [inputAmount, setInputAmount] = useAtom(asyncSwapInputAtom) - const selectedToken = useAtomValue(selectedTokenOrDefaultAtom) + const [inputAmount, setInputAmount] = useAtom(userInputAtom) + const selectedToken = useAtomValue(selectedTokenAtom) const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const isMinting = useAtomValue(isMintingAtom) - const slippage = useAtomValue(slippageAtom) - const [ongoingTx, setOngoingTx] = useAtom(asyncSwapOngoingTxAtom) - const setAsyncSwapRefetch = useSetAtom(asyncSwapRefetchAtom) - const setAsyncSwapFetching = useSetAtom(asyncSwapFetchingAtom) const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputPrice = (indexDTFPrice || 0) * Number(inputAmount) const indexDTFBalance = useAtomValue(indexDTFBalanceAtom) @@ -98,14 +87,12 @@ const AsyncRedeem = () => { const amountOutValue = useAtomValue(mintValueUSDAtom) const bufferValue = useAtomValue(bufferValueAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) - const basket = useAtomValue(indexDTFBasketAtom) const insufficientBalance = parseUnits(inputAmount, selectedToken.decimals) > (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, refetch, failureReason } = - useQuotesForRedeem() + const { data, isLoading, isFetching, failureReason } = useQuotesForRedeem() const { loadingAfterRefetch } = useLoadingAfterRefetch(data) @@ -118,19 +105,6 @@ const AsyncRedeem = () => { // ) const awaitingQuote = isLoading || isFetching - useEffect(() => { - setAsyncSwapRefetch({ fn: refetch }) - }, [refetch, setAsyncSwapRefetch]) - - useEffect(() => { - setAsyncSwapFetching(awaitingQuote) - }, [awaitingQuote, setAsyncSwapFetching]) - - useEffect(() => { - setOngoingTx(false) - setInputAmount('') - }, []) - if (!indexDTF) return null const assetsRedeemed = Object.keys(redeemAssets).length > 0 diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx index cdf88889d..457b86a49 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem.tsx @@ -7,25 +7,19 @@ import { safeParseEther } from '@/utils' import { useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect } from 'react' import { Address, parseEventLogs } from 'viem' -import { - useSendCalls, - useWaitForCallsStatus, - useWaitForTransactionReceipt, - useWalletClient, - useWriteContract, -} from 'wagmi' -import { asyncSwapInputAtom, mintTxHashAtom, redeemAssetsAtom } from '../atom' +import { useSendCalls, useWaitForCallsStatus, useWalletClient } from 'wagmi' +import { txHashAtom, redeemAssetsAtom, userInputAtom } from '../atom' import { useFolioDetails } from '../hooks/useFolioDetails' const SubmitRedeem = () => { const chainId = useAtomValue(chainIdAtom) const account = useAtomValue(walletAtom) const indexDTF = useAtomValue(indexDTFAtom) - const amount = useAtomValue(asyncSwapInputAtom) + const inputAmount = useAtomValue(userInputAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) - const setRedeemTxHash = useSetAtom(mintTxHashAtom) + const setRedeemTxHash = useSetAtom(txHashAtom) - const sharesToRedeem = safeParseEther(amount) + const sharesToRedeem = safeParseEther(inputAmount) const { data: walletClient } = useWalletClient() const { data: folioDetails } = useFolioDetails({ shares: sharesToRedeem }) @@ -67,7 +61,7 @@ const SubmitRedeem = () => { !walletClient || !account || !indexDTF || - !amount || + !inputAmount || !folioDetails ) return @@ -91,9 +85,9 @@ const SubmitRedeem = () => { } catch (error) { console.error('Error processing orders:', error) } - }, [chainId, walletClient, account, indexDTF, amount, folioDetails]) + }, [chainId, walletClient, account, indexDTF, inputAmount, folioDetails]) - const disabled = isPending || isReceiptLoading || !amount + const disabled = isPending || isReceiptLoading || !inputAmount return (
diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 1c2ee955c..ebf2e3bbc 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -10,35 +10,31 @@ import { AsyncSwapOrderResponse, QuoteAggregated } from './types' const ASYNC_SWAP_BUFFER = 0.005 +// Main Atoms +export const operationAtom = atom<'mint' | 'redeem'>('mint') +export const userInputAtom = atomWithReset('') +export const indexDTFBalanceAtom = atom(0n) export const asyncSwapResponseAtom = atom( undefined ) -export const asyncSwapOrderIdAtom = atom( - // '5d3b5c96-ea7e-4bb2-bb54-40f082fb318d' - // 'fb4f234d-5b66-4436-a5d7-9748db2965de' - undefined -) +export const txHashAtom = atom(undefined) // tx hash for minting or redeeming +export const redeemAssetsAtom = atom>({}) +export const quotesAtom = atom>({}) +export const orderIdsAtom = atom([]) +export const ordersAtom = atom>({}) -export const collateralAcquiredAtom = atom((get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) - return Boolean( - asyncSwapResponse?.cowswapOrders.every( - (order) => order.status === OrderStatus.FULFILLED - ) - ) -}) -export const collateralPanelOpenAtom = atom(true) -export const currentAsyncSwapTabAtom = atom<'mint' | 'redeem'>('mint') -export const showAsyncSwapSettingsAtom = atom(false) -export const asyncSwapInputAtom = atomWithReset('') -export const indexDTFBalanceAtom = atom(0n) +export const refetchQuotesAtom = atom<{ fn: () => void }>({ fn: () => {} }) +export const fetchingQuotesAtom = atom(false) -export const selectedTokenAtom = atom(undefined) -export const defaultSelectedTokenAtom = atom((get) => { - const chainId = get(chainIdAtom) - return reducedZappableTokens[chainId][2] // USDC -}) -export const selectedTokenOrDefaultAtom = atom((get) => { +export const isMintingAtom = atom(false) +export const successAtom = atom(false) + +// Render Atoms +export const openCollateralPanelAtom = atom(true) +export const showSettingsAtom = atom(false) + +// Computed Atoms +export const selectedTokenAtom = atom((get) => { const chainId = get(chainIdAtom) return reducedZappableTokens[chainId][2] // USDC }) @@ -46,28 +42,22 @@ export const selectedTokenOrDefaultAtom = atom((get) => { export const selectedTokenBalanceAtom = atom( (get) => { const balances = get(balancesAtom) - const token = get(selectedTokenOrDefaultAtom) + const token = get(selectedTokenAtom) return balances[token.address] } ) -export const slippageAtom = atomWithReset('100') -export const forceMintAtom = atomWithReset(false) -export const asyncSwapRefetchAtom = atom<{ fn: () => void }>({ fn: () => {} }) -export const asyncSwapFetchingAtom = atom(false) -export const asyncSwapOngoingTxAtom = atom(false) -export const asyncSwapPriceImpactWarningCheckboxAtom = atom(false) -export const asyncSwapHighPriceImpactAtom = atom(false) -export const isMintingAtom = atom(false) -export const mintTxHashAtom = atom( - // '0x7dc75b765f28b2875c9b2ae52c2fe06472baf17ba0486f195b5b69212018582e' - undefined -) - -export const successAtom = atom(false) +export const collateralAcquiredAtom = atom((get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + return Boolean( + asyncSwapResponse?.cowswapOrders.every( + (order) => order.status === OrderStatus.FULFILLED + ) + ) +}) export const mintValueAtom = atom((get) => { - const inputAmount = get(asyncSwapInputAtom) + const inputAmount = get(userInputAtom) const dtfPrice = get(indexDTFPriceAtom) const result = ((Number(inputAmount) || 0) / (dtfPrice ?? 1)) * (1 - ASYNC_SWAP_BUFFER) @@ -77,12 +67,12 @@ export const mintValueAtom = atom((get) => { }) export const mintValueUSDAtom = atom((get) => { - const inputAmount = get(asyncSwapInputAtom) + const inputAmount = get(userInputAtom) return (Number(inputAmount) || 0) * (1 - ASYNC_SWAP_BUFFER) }) export const bufferValueAtom = atom((get) => { - const inputAmount = get(asyncSwapInputAtom) + const inputAmount = get(userInputAtom) return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER }) @@ -90,9 +80,3 @@ export const mintValueWeiAtom = atom((get) => { const amountOut = get(mintValueAtom) return parseEther(amountOut.toString()) }) - -export const redeemAssetsAtom = atom>({}) - -export const quotesAtom = atom>({}) -export const orderIdsAtom = atom([]) -export const ordersAtom = atom>({}) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index b79aa4b74..5abc195df 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -7,8 +7,8 @@ import { ArrowLeft, ArrowRight, Check, Loader } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { asyncSwapResponseAtom, - collateralPanelOpenAtom, - currentAsyncSwapTabAtom, + openCollateralPanelAtom, + operationAtom, successAtom, } from './atom' import MintButton from './mint-button' @@ -16,7 +16,7 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' const OpenCollateralPanel = () => { const basket = useAtomValue(indexDTFBasketAtom) - const [open, setOpen] = useAtom(collateralPanelOpenAtom) + const [open, setOpen] = useAtom(openCollateralPanelAtom) return (
@@ -136,10 +127,8 @@ const Header = () => { const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') const isSafeMultisig = useAtomValue(isSafeMultisigAtom) - const [currentTab, setCurrentTab] = useAtom(currentAsyncSwapTabAtom) - const [showSettings, setShowSettings] = useAtom(showAsyncSwapSettingsAtom) - const defaultToken = useAtomValue(defaultSelectedTokenAtom) - const setSelectedToken = useSetAtom(selectedTokenAtom) + const [currentTab, setCurrentTab] = useAtom(operationAtom) + const [showSettings, setShowSettings] = useAtom(showSettingsAtom) const indexDTF = useAtomValue(indexDTFAtom) const setIndexDTFBalance = useSetAtom(indexDTFBalanceAtom) const success = useAtomValue(successAtom) @@ -152,7 +141,6 @@ const AsyncSwaps = () => { const reset = () => { setShowSettings(false) - setSelectedToken(defaultToken) } const changeTab = (tab: string) => { diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx index f2d5d7c3a..ef8fe37ab 100644 --- a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -10,12 +10,7 @@ import { Loader } from 'lucide-react' import { useEffect, useMemo } from 'react' import { encodeFunctionData, erc20Abi, maxUint256, parseEther } from 'viem' import { useSendCalls, useWaitForCallsStatus } from 'wagmi' -import { - isMintingAtom, - mintTxHashAtom, - mintValueAtom, - successAtom, -} from './atom' +import { isMintingAtom, txHashAtom, mintValueAtom, successAtom } from './atom' import { useFolioDetails } from './hooks/useFolioDetails' const MintButton = () => { @@ -25,7 +20,7 @@ const MintButton = () => { const folioAmount = parseEther(mintAmount.toString()) const chainId = useAtomValue(chainIdAtom) const indexDTFVersion = useAtomValue(indexDTFVersionAtom) - const setMintTxHash = useSetAtom(mintTxHashAtom) + const setMintTxHash = useSetAtom(txHashAtom) const setSuccess = useSetAtom(successAtom) const [isMinting, setIsMinting] = useAtom(isMintingAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 32b24393d..4025cdd0c 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -24,12 +24,11 @@ import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { formatEther } from 'viem' import { - asyncSwapInputAtom, - asyncSwapOrderIdAtom, + userInputAtom, asyncSwapResponseAtom, bufferValueAtom, - currentAsyncSwapTabAtom, - mintTxHashAtom, + operationAtom, + txHashAtom, mintValueUSDAtom, redeemAssetsAtom, successAtom, @@ -39,19 +38,17 @@ import CowSwapOrder from './cowswap-order' const viewTransactionsAtom = atom(false) const CloseButton = () => { - const setMintTxHash = useSetAtom(mintTxHashAtom) + const setTxHashAtom = useSetAtom(txHashAtom) const setSuccess = useSetAtom(successAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - const setAsyncSwapOrderId = useSetAtom(asyncSwapOrderIdAtom) - const setAsyncSwapInput = useSetAtom(asyncSwapInputAtom) + const setUserInputAtom = useSetAtom(userInputAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) const handleClose = () => { - setMintTxHash(undefined) + setTxHashAtom(undefined) setSuccess(false) setAsyncSwapResponse(undefined) - setAsyncSwapOrderId(undefined) - setAsyncSwapInput('') + setUserInputAtom('') setRedeemAssets({}) } @@ -126,7 +123,7 @@ const DTFAmount = () => { const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) const orders = useAtomValue(asyncSwapResponseAtom) - const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const operation = useAtomValue(operationAtom) const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) const valueMinted = (indexDTFPrice || 0) * sharesMinted @@ -137,7 +134,7 @@ const DTFAmount = () => { return (
- {zapDirection === 'mint' ? 'You Minted:' : 'You Redeemed:'} + {operation === 'mint' ? 'You Minted:' : 'You Redeemed:'}
@@ -154,7 +151,7 @@ const DTFAmount = () => { className="rounded-full" />
- {zapDirection === 'mint' && ( + {operation === 'mint' && (
${formatCurrency(valueMinted)}{' '} ({priceImpact}%) @@ -165,14 +162,14 @@ const DTFAmount = () => { } const USDCAmount = () => { - const inputAmount = useAtomValue(asyncSwapInputAtom) + const inputAmount = useAtomValue(userInputAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) - const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const operation = useAtomValue(operationAtom) return (
- {zapDirection === 'mint' ? 'You Used:' : 'You Received:'} + {operation === 'mint' ? 'You Used:' : 'You Received:'}
@@ -181,7 +178,7 @@ const USDCAmount = () => {
USDC
- {zapDirection === 'mint' && ( + {operation === 'mint' && (
{formatCurrency(Number(inputAmount))} USDC @@ -192,13 +189,13 @@ const USDCAmount = () => {
${formatCurrency(inputAmountUSD)}{' '} - {zapDirection === 'mint' && ( + {operation === 'mint' && ( ${formatCurrency(Number(inputAmount))} )}
- {zapDirection === 'mint' && } + {operation === 'mint' && }
) } @@ -227,8 +224,8 @@ const BufferInfo = () => { const MainTransaction = () => { const indexDTF = useAtomValue(indexDTFAtom) - const mintTxHash = useAtomValue(mintTxHashAtom) - const zapDirection = useAtomValue(currentAsyncSwapTabAtom) + const txHash = useAtomValue(txHashAtom) + const operation = useAtomValue(operationAtom) return (
@@ -240,7 +237,7 @@ const MainTransaction = () => { />
- {zapDirection === 'mint' + {operation === 'mint' ? `${indexDTF?.token.symbol} Minted` : `${indexDTF?.token.symbol} Redeemed`} @@ -251,11 +248,11 @@ const MainTransaction = () => {
- +
Date: Mon, 26 May 2025 11:32:33 -0300 Subject: [PATCH 36/85] feat: add insufficient balance --- src/utils/index.ts | 7 +++++ .../issuance/async-swaps/async-mint/index.tsx | 30 +++++-------------- .../async-mint/submit-mint-orders.tsx | 14 +++++++-- .../async-swaps/async-redeem/index.tsx | 28 ++++------------- .../async-redeem/submit-redeem.tsx | 15 ++++++++-- .../index-dtf/issuance/async-swaps/atom.ts | 14 ++++++++- .../issuance/async-swaps/hooks/useQuote.ts | 8 ++++- 7 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/utils/index.ts b/src/utils/index.ts index a6eb3981f..b1f92bb64 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -193,6 +193,13 @@ export function formatCurrency( }).format(value) } +export function formatCurrencyCompact(value: number, decimals = 2) { + return formatCurrency(value, decimals, { + notation: 'compact', + compactDisplay: 'short', + }) +} + export function formatTokenAmount(value: number) { return value < 1 ? formatCurrency(value, 0, { diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index e6209f4c7..d04737e6f 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -7,18 +7,16 @@ import { useChainlinkPrice } from '@/hooks/useChainlinkPrice' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' -import { formatCurrency } from '@/utils' +import { formatCurrencyCompact } from '@/utils' import { useAtom, useAtomValue } from 'jotai' import { parseUnits } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { asyncSwapResponseAtom, - bufferValueAtom, collateralAcquiredAtom, isMintingAtom, mintValueAtom, mintValueUSDAtom, - mintValueWeiAtom, selectedTokenAtom, selectedTokenBalanceAtom, userInputAtom, @@ -35,33 +33,18 @@ const AsyncMint = () => { const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const isMinting = useAtomValue(isMintingAtom) const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) - const inputPrice = (selectedTokenPrice || 0) * Number(inputAmount) + const inputValueUSD = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const collateralAcquired = useAtomValue(collateralAcquiredAtom) const orderSubmitted = !!asyncSwapResponse const amountOut = useAtomValue(mintValueAtom) - const amountOutWei = useAtomValue(mintValueWeiAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) - const bufferValue = useAtomValue(bufferValueAtom) - - const insufficientBalance = - parseUnits(inputAmount, selectedToken.decimals) > - (selectedTokenBalance?.value || 0n) const { data, isLoading, isFetching, failureReason } = useQuotesForMint() const { loadingAfterRefetch } = useLoadingAfterRefetch(data) - const priceFrom = 0 - - // const valueTo = data?.result?.amountOut - // const showTxButton = Boolean( - // data?.status === 'success' && - // data?.result && - // !insufficientBalance && - // !isLoading - // ) const awaitingQuote = isLoading || isFetching if (!indexDTF) return null @@ -70,10 +53,12 @@ const AsyncMint = () => {
{ address: indexDTF.id, symbol: indexDTF.token.symbol, price: amountOutValue ? ( - ${formatCurrency(amountOutValue)} + ${formatCurrencyCompact(amountOutValue)} ) : undefined, value: amountOut.toString(), className: cn( @@ -106,7 +91,6 @@ const AsyncMint = () => { }} loading={isLoading || loadingAfterRefetch} /> - {/* {!!data && } */}
{ const inputAmount = useAtomValue(userInputAtom) + const insufficientBalance = useAtomValue(insufficientBalanceAtom) const { mutate, isPending } = useQuoteSignatures() const disabled = - isPending || loadingQuote || !inputAmount || isNaN(Number(inputAmount)) + isPending || + loadingQuote || + !inputAmount || + isNaN(Number(inputAmount)) || + insufficientBalance return (
@@ -26,7 +32,9 @@ const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { onClick={() => mutate()} disabled={disabled} > - {isPending ? ( + {insufficientBalance ? ( + 'Insufficient Balance' + ) : isPending ? ( 'Signing...' ) : loadingQuote ? ( 'Awaiting Quote' diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index bdb716c9c..03db8eb8b 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -11,22 +11,19 @@ import { indexDTFBasketAtom, indexDTFPriceAtom, } from '@/state/dtf/atoms' -import { formatCurrency } from '@/utils' +import { formatCurrencyCompact } from '@/utils' import { useAtom, useAtomValue } from 'jotai' -import { formatEther, parseUnits } from 'viem' +import { formatEther } from 'viem' import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { asyncSwapResponseAtom, - bufferValueAtom, collateralAcquiredAtom, indexDTFBalanceAtom, isMintingAtom, mintValueAtom, mintValueUSDAtom, - mintValueWeiAtom, redeemAssetsAtom, selectedTokenAtom, - selectedTokenBalanceAtom, userInputAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' @@ -72,7 +69,6 @@ const AsyncRedeem = () => { const indexDTF = useAtomValue(indexDTFAtom) const [inputAmount, setInputAmount] = useAtom(userInputAtom) const selectedToken = useAtomValue(selectedTokenAtom) - const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const isMinting = useAtomValue(isMintingAtom) const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputPrice = (indexDTFPrice || 0) * Number(inputAmount) @@ -83,26 +79,13 @@ const AsyncRedeem = () => { const collateralAcquired = useAtomValue(collateralAcquiredAtom) const orderSubmitted = !!asyncSwapResponse const amountOut = useAtomValue(mintValueAtom) - const amountOutWei = useAtomValue(mintValueWeiAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) - const bufferValue = useAtomValue(bufferValueAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) - const insufficientBalance = - parseUnits(inputAmount, selectedToken.decimals) > - (selectedTokenBalance?.value || 0n) - const { data, isLoading, isFetching, failureReason } = useQuotesForRedeem() const { loadingAfterRefetch } = useLoadingAfterRefetch(data) - // const valueTo = data?.result?.amountOut - // const showTxButton = Boolean( - // data?.status === 'success' && - // data?.result && - // !insufficientBalance && - // !isLoading - // ) const awaitingQuote = isLoading || isFetching if (!indexDTF) return null @@ -118,10 +101,10 @@ const AsyncRedeem = () => { { address: selectedToken.address, symbol: selectedToken.symbol, price: amountOutValue ? ( - ${formatCurrency(amountOutValue)} + ${formatCurrencyCompact(amountOutValue)} ) : undefined, value: amountOut.toString(), className: cn( @@ -157,7 +140,6 @@ const AsyncRedeem = () => { loading={isLoading || loadingAfterRefetch} />
- {/* {!!data && } */}
{ @@ -16,6 +21,7 @@ const SubmitRedeem = () => { const account = useAtomValue(walletAtom) const indexDTF = useAtomValue(indexDTFAtom) const inputAmount = useAtomValue(userInputAtom) + const insufficientBalance = useAtomValue(insufficientBalanceAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) const setRedeemTxHash = useSetAtom(txHashAtom) @@ -87,7 +93,8 @@ const SubmitRedeem = () => { } }, [chainId, walletClient, account, indexDTF, inputAmount, folioDetails]) - const disabled = isPending || isReceiptLoading || !inputAmount + const disabled = + isPending || isReceiptLoading || !inputAmount || insufficientBalance return (
@@ -100,7 +107,9 @@ const SubmitRedeem = () => { onClick={handleSubmit} disabled={disabled} > - {isPending || isReceiptLoading ? ( + {insufficientBalance ? ( + 'Insufficient Balance' + ) : isPending || isReceiptLoading ? ( 'Submitting...' ) : ( diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index ebf2e3bbc..0ada9e682 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -5,7 +5,7 @@ import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zap import { EnrichedOrder, OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' -import { Address, parseEther } from 'viem' +import { Address, parseEther, parseUnits } from 'viem' import { AsyncSwapOrderResponse, QuoteAggregated } from './types' const ASYNC_SWAP_BUFFER = 0.005 @@ -47,6 +47,18 @@ export const selectedTokenBalanceAtom = atom( } ) +export const insufficientBalanceAtom = atom((get) => { + const inputAmount = get(userInputAtom) + const operation = get(operationAtom) + const selectedToken = get(selectedTokenAtom) + const selectedTokenBalance = get(selectedTokenBalanceAtom) + const indexDTFParsedBalance = get(indexDTFBalanceAtom) + return operation === 'mint' + ? parseUnits(inputAmount, selectedToken.decimals) > + (selectedTokenBalance?.value || 0n) + : parseEther(inputAmount) > indexDTFParsedBalance +}) + export const collateralAcquiredAtom = atom((get) => { const asyncSwapResponse = get(asyncSwapResponseAtom) return Boolean( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index c26da2ce5..619726468 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -15,6 +15,7 @@ import { useEffect } from 'react' import { Address, parseEther, zeroAddress } from 'viem' import { fetchingQuotesAtom, + insufficientBalanceAtom, mintValueAtom, quotesAtom, redeemAssetsAtom, @@ -160,6 +161,7 @@ export const useQuotesForMint = () => { const mintValue = useAtomValue(mintValueAtom) const folioAmount = parseEther(mintValue.toString()) const address = useAtomValue(walletAtom) + const insufficientBalance = useAtomValue(insufficientBalanceAtom) const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) @@ -252,7 +254,11 @@ export const useQuotesForMint = () => { return quotes }, - enabled: !!folioDetails?.mintValues && !!tokensInfo && !!folioAmount, + enabled: + !insufficientBalance && + !!folioDetails?.mintValues && + !!tokensInfo && + !!folioAmount, }) useEffect(() => { From 85b6dd61b324ecb7488d32bcb4d3e5556ea07c1a Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 26 May 2025 12:06:05 -0300 Subject: [PATCH 37/85] fix: redeem success msg --- .../issuance/async-swaps/async-mint/index.tsx | 8 ++--- .../async-swaps/async-redeem/index.tsx | 17 +++++---- .../index-dtf/issuance/async-swaps/atom.ts | 8 ++--- .../issuance/async-swaps/success.tsx | 36 ++++++++++++++++--- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index d04737e6f..e367ef264 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -9,8 +9,6 @@ import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { formatCurrencyCompact } from '@/utils' import { useAtom, useAtomValue } from 'jotai' -import { parseUnits } from 'viem' -import useLoadingAfterRefetch from '../../../overview/components/hooks/useLoadingAfterRefetch' import { asyncSwapResponseAtom, collateralAcquiredAtom, @@ -41,9 +39,7 @@ const AsyncMint = () => { const amountOut = useAtomValue(mintValueAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) - const { data, isLoading, isFetching, failureReason } = useQuotesForMint() - - const { loadingAfterRefetch } = useLoadingAfterRefetch(data) + const { isLoading, isFetching } = useQuotesForMint() const awaitingQuote = isLoading || isFetching @@ -89,7 +85,7 @@ const AsyncMint = () => { collateralAcquired && !isMinting && 'border-card bg-card' ), }} - loading={isLoading || loadingAfterRefetch} + loading={isLoading} />
{ const indexDTF = useAtomValue(indexDTFAtom) @@ -82,15 +82,16 @@ const AsyncRedeem = () => { const amountOutValue = useAtomValue(mintValueUSDAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) - const { data, isLoading, isFetching, failureReason } = useQuotesForRedeem() - - const { loadingAfterRefetch } = useLoadingAfterRefetch(data) + const { isLoading, isFetching } = useQuotesForRedeem() const awaitingQuote = isLoading || isFetching if (!indexDTF) return null - const assetsRedeemed = Object.keys(redeemAssets).length > 0 + const assetsRedeemed = useMemo( + () => Object.keys(redeemAssets).length > 0, + [redeemAssets] + ) return (
@@ -137,7 +138,7 @@ const AsyncRedeem = () => { collateralAcquired && !isMinting && 'border-card bg-card' ), }} - loading={isLoading || loadingAfterRefetch} + loading={isLoading} />
{ )} > {!assetsRedeemed && } - {assetsRedeemed && !orderSubmitted && } + {assetsRedeemed && !orderSubmitted && ( + + )} {orderSubmitted && }
diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 0ada9e682..35050de99 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -14,14 +14,14 @@ const ASYNC_SWAP_BUFFER = 0.005 export const operationAtom = atom<'mint' | 'redeem'>('mint') export const userInputAtom = atomWithReset('') export const indexDTFBalanceAtom = atom(0n) -export const asyncSwapResponseAtom = atom( - undefined -) export const txHashAtom = atom(undefined) // tx hash for minting or redeeming export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) export const orderIdsAtom = atom([]) -export const ordersAtom = atom>({}) +export const asyncSwapResponseAtom = atom( + undefined +) +// export const ordersAtom = atom>({}) export const refetchQuotesAtom = atom<{ fn: () => void }>({ fn: () => {} }) export const fetchingQuotesAtom = atom(false) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 4025cdd0c..92e8a1d82 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -22,7 +22,7 @@ import { } from 'lucide-react' import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { formatEther } from 'viem' +import { formatEther, formatUnits, parseUnits } from 'viem' import { userInputAtom, asyncSwapResponseAtom, @@ -32,6 +32,7 @@ import { mintValueUSDAtom, redeemAssetsAtom, successAtom, + selectedTokenAtom, } from './atom' import CowSwapOrder from './cowswap-order' @@ -124,6 +125,7 @@ const DTFAmount = () => { const inputAmountUSD = useAtomValue(mintValueUSDAtom) const orders = useAtomValue(asyncSwapResponseAtom) const operation = useAtomValue(operationAtom) + const sharesRedeemed = useAtomValue(userInputAtom) const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) const valueMinted = (indexDTFPrice || 0) * sharesMinted @@ -139,7 +141,9 @@ const DTFAmount = () => {
- {formatTokenAmount(sharesMinted)} + {operation === 'mint' + ? formatTokenAmount(sharesMinted) + : formatTokenAmount(Number(sharesRedeemed))}
{indexDTF?.token.symbol || ''}
@@ -161,6 +165,20 @@ const DTFAmount = () => { ) } +const USDCReceivedOnRedeem = () => { + const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const selectedToken = useAtomValue(selectedTokenAtom) + const { cowswapOrders = [] } = asyncSwapResponse || {} + + const amountOut = cowswapOrders.reduce( + (acc, order) => + acc + + Number(formatUnits(BigInt(order.buyAmount), selectedToken.decimals)), + 0 + ) + return {formatCurrency(amountOut)} +} + const USDCAmount = () => { const inputAmount = useAtomValue(userInputAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) @@ -174,7 +192,11 @@ const USDCAmount = () => {
- {formatCurrency(inputAmountUSD)} + {operation === 'mint' ? ( + formatCurrency(inputAmountUSD) + ) : ( + + )}
USDC
@@ -188,7 +210,13 @@ const USDCAmount = () => { )}
- ${formatCurrency(inputAmountUSD)}{' '} + {operation === 'mint' ? ( + ${formatCurrency(inputAmountUSD)} + ) : ( + + $ + + )} {operation === 'mint' && ( ${formatCurrency(Number(inputAmount))} From 5e1277e948281948632e86a352320ec1232d9cba Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 26 May 2025 12:12:46 -0300 Subject: [PATCH 38/85] chore: reset atoms --- src/views/index-dtf/issuance/async-swaps/success.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 92e8a1d82..a7730d830 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -33,6 +33,8 @@ import { redeemAssetsAtom, successAtom, selectedTokenAtom, + orderIdsAtom, + quotesAtom, } from './atom' import CowSwapOrder from './cowswap-order' @@ -44,6 +46,8 @@ const CloseButton = () => { const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const setUserInputAtom = useSetAtom(userInputAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) + const setOrderIdsAtom = useSetAtom(orderIdsAtom) + const setQuotesAtom = useSetAtom(quotesAtom) const handleClose = () => { setTxHashAtom(undefined) @@ -51,6 +55,8 @@ const CloseButton = () => { setAsyncSwapResponse(undefined) setUserInputAtom('') setRedeemAssets({}) + setQuotesAtom({}) + setOrderIdsAtom([]) } return ( From 32df7d5c952316084f9de2045a1bedd186c06dca Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 28 May 2025 11:46:46 -0300 Subject: [PATCH 39/85] feat: add failed order retry --- src/utils/constants.ts | 2 +- .../async-mint/submit-mint-orders.tsx | 2 +- .../index-dtf/issuance/async-swaps/atom.ts | 26 +++- .../async-swaps/collateral-acquisition.tsx | 52 ++++++- .../issuance/async-swaps/hooks/useQuote.ts | 136 ++++++++---------- .../async-swaps/hooks/useQuoteSignatures.ts | 57 +++++--- .../index-dtf/issuance/async-swaps/types.ts | 2 +- 7 files changed, 180 insertions(+), 97 deletions(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 3290b5e31..f8bd394d6 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -22,7 +22,7 @@ export const RESERVE_FORUM = 'https://forum.reserve.org/' export const REGISTER_BUGS = 'https://reserve.canny.io/defi-surfaces-bug-reporting' export const RESERVE_STORAGE = 'https://storage.reserve.org/' -export const RESERVE_API = 'https://api-staging.reserve.org/' +export const RESERVE_API = 'https://api.reserve.org/' export const DUNE_DASHBOARD = 'https://dune.com/reserve-protocol/reserve-protocol-overview' export const REPOSITORY_URL = 'https://github.com/reserve-protocol/register' diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index bbcc81063..3364d72ee 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -12,7 +12,7 @@ type SubmitMintProps = { const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { const inputAmount = useAtomValue(userInputAtom) const insufficientBalance = useAtomValue(insufficientBalanceAtom) - const { mutate, isPending } = useQuoteSignatures() + const { data, mutate, isPending } = useQuoteSignatures() const disabled = isPending || diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 35050de99..545323047 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -2,7 +2,7 @@ import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' -import { EnrichedOrder, OrderStatus } from '@cowprotocol/cow-sdk' +import { OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther, parseUnits } from 'viem' @@ -92,3 +92,27 @@ export const mintValueWeiAtom = atom((get) => { const amountOut = get(mintValueAtom) return parseEther(amountOut.toString()) }) + +export const failedOrdersAtom = atom( + (get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + return ( + asyncSwapResponse?.cowswapOrders.filter((order) => + [OrderStatus.CANCELLED, OrderStatus.EXPIRED].includes(order.status) + ) || [] + ) + } +) + +export const pendingOrdersAtom = atom( + (get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + return ( + asyncSwapResponse?.cowswapOrders.filter((order) => + [OrderStatus.OPEN, OrderStatus.PRESIGNATURE_PENDING].includes( + order.status + ) + ) || [] + ) + } +) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 5abc195df..de0659b47 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -3,16 +3,20 @@ import { Button } from '@/components/ui/button' import { indexDTFBasketAtom } from '@/state/dtf/atoms' import { getTimerFormat } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { ArrowLeft, ArrowRight, Check, Loader } from 'lucide-react' +import { ArrowLeft, ArrowRight, Check, Loader, RefreshCw } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { asyncSwapResponseAtom, + failedOrdersAtom, openCollateralPanelAtom, operationAtom, + pendingOrdersAtom, successAtom, } from './atom' import MintButton from './mint-button' import { OrderStatus } from '@cowprotocol/cow-sdk' +import { useRefreshQuotes } from './hooks/useQuote' +import { useQuoteSignatures } from './hooks/useQuoteSignatures' const OpenCollateralPanel = () => { const basket = useAtomValue(indexDTFBasketAtom) @@ -37,11 +41,50 @@ const OpenCollateralPanel = () => { ) } +const RequoteFailedOrders = () => { + const { isFetching } = useRefreshQuotes() + const failedOrdersQty = useAtomValue(failedOrdersAtom).length + const { mutate: signQuotes, isPending: isSigning } = useQuoteSignatures(true) + + return ( +
+
+
+
+ +
+
+
Prices have moved
+
+ Accept the new quotes for {failedOrdersQty} tokens. +
+
+
+ {/* */} +
+ +
+ ) +} + const CollateralAcquisition = () => { const operation = useAtomValue(operationAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const [elapsedTime, setElapsedTime] = useState(0) const setSuccess = useSetAtom(successAtom) + const failedOrders = useAtomValue(failedOrdersAtom) + const pendingOrders = useAtomValue(pendingOrdersAtom) useEffect(() => { if (!asyncSwapResponse?.createdAt) return @@ -58,6 +101,11 @@ const CollateralAcquisition = () => { if (!asyncSwapResponse) return null + const refreshQuotes = useMemo( + () => failedOrders.length > 0 && pendingOrders.length === 0, + [failedOrders, pendingOrders] + ) + const hasAllCollaterals = useMemo( () => asyncSwapResponse.cowswapOrders.length > 0 && @@ -90,6 +138,8 @@ const CollateralAcquisition = () => { ) } + if (refreshQuotes) return + return (
diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 619726468..038cf58f9 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -14,9 +14,11 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { Address, parseEther, zeroAddress } from 'viem' import { + failedOrdersAtom, fetchingQuotesAtom, insufficientBalanceAtom, mintValueAtom, + operationAtom, quotesAtom, redeemAssetsAtom, refetchQuotesAtom, @@ -40,8 +42,8 @@ async function getQuote({ orderBookApi, operation, }: { - sellToken: Token - buyToken: Token + sellToken: Address + buyToken: Address amount: bigint address: Address orderBookApi: OrderBookApi @@ -50,8 +52,8 @@ async function getQuote({ if ( !address || address == zeroAddress || - buyToken.address == zeroAddress || - sellToken.address == zeroAddress || + buyToken == zeroAddress || + sellToken == zeroAddress || !orderBookApi ) { throw new Error('getQuote: Invalid params') @@ -62,11 +64,11 @@ async function getQuote({ } const quote = await orderBookApi.getQuote({ - sellToken: sellToken.address, - buyToken: buyToken.address, + sellToken, + buyToken, from: address, receiver: address, - validFor: 60 * 15, // 15 minutes + validFor: 60 * 5, // 10 minutes priceQuality: PriceQuality.VERIFIED, ...(operation === 'redeem' ? { @@ -90,71 +92,6 @@ async function getQuote({ return quote } -// export function useQuote({ sellToken, buyToken, amount }: UseQuoteParams) { -// const indexDTF = useAtomValue(indexDTFAtom) -// const folioAddress = indexDTF?.id -// const operation = useAtomValue(operationAtom) -// const chainId = useAtomValue(chainIdAtom) -// const address = useAtomValue(walletAtom) -// const setQuotes = useSetAtom(quotesAtom) -// const { orderBookApi } = useGlobalProtocolKit() - -// return useQuery({ -// queryKey: ['quote/single', sellToken, buyToken, amount, address], -// enabled: -// !!chainId && !!address && !!sellToken && !!buyToken && !!orderBookApi, -// queryFn: async ({ signal }) => { -// if (!orderBookApi) { -// throw new Error('orderBookApi is not available') -// } - -// try { -// const quote = await getQuote({ -// sellToken, -// buyToken, -// amount, -// address: address as Address, -// orderBookApi, -// operation, -// }) - -// if (!signal.aborted) { -// setQuotes((prev) => ({ -// ...prev, -// [folioAddress as string]: { -// success: true, -// type: QuoteProvider.CowSwap, -// data: quote, -// }, -// })) -// } - -// return { -// token: operation ? buyToken : sellToken, -// success: true, -// source: QuoteProvider.CowSwap, -// quote, -// } -// } catch { -// if (!signal.aborted) { -// setQuotes((prev) => ({ -// ...prev, -// [folioAddress as string]: { -// success: false, -// }, -// })) -// } - -// return { -// success: false, -// } -// } -// }, -// retry: false, -// staleTime: Infinity, -// }) -// } - export const useQuotesForMint = () => { const chainId = useAtomValue(chainIdAtom) const selectedToken = useAtomValue(selectedTokenAtom) @@ -200,8 +137,8 @@ export const useQuotesForMint = () => { try { return await getQuote({ - sellToken: selectedToken, - buyToken: token, + sellToken: selectedToken.address, + buyToken: token.address, amount, address: address as Address, orderBookApi, @@ -305,8 +242,8 @@ export const useQuotesForRedeem = () => { try { return await getQuote({ - sellToken: token, - buyToken: selectedToken, + sellToken: token.address, + buyToken: selectedToken.address, amount, address: address as Address, orderBookApi, @@ -369,3 +306,50 @@ export const useQuotesForRedeem = () => { return query } + +export const useRefreshQuotes = () => { + const address = useAtomValue(walletAtom) + const { orderBookApi } = useGlobalProtocolKit() + const [quotes, setQuotes] = useAtom(quotesAtom) + const operation = useAtomValue(operationAtom) + const failedOrders = useAtomValue(failedOrdersAtom) + + const query = useQuery({ + queryKey: ['refresh-quotes', failedOrders], + queryFn: async () => { + if (!failedOrders || !orderBookApi || !address) { + return + } + + const quotePromises = failedOrders.map(async (order) => { + return await getQuote({ + sellToken: order.sellToken as Address, + buyToken: order.buyToken as Address, + amount: BigInt( + operation === 'redeem' ? order.sellAmount : order.buyAmount + ), + address: address as Address, + orderBookApi, + operation, + }) + }) + + const results = await Promise.all(quotePromises) + + failedOrders.forEach((order, i) => { + setQuotes((prev) => ({ + ...prev, + [operation === 'redeem' ? order.sellToken : order.buyToken]: { + success: !!results[i], + type: QuoteProvider.CowSwap, + data: results[i], + }, + })) + }) + + return quotes + }, + }) + + return query +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 379a9c19c..d55a36143 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -7,7 +7,7 @@ import { SigningScheme, } from '@cowprotocol/cow-sdk' import { useMutation } from '@tanstack/react-query' -import { useAtomValue, useSetAtom } from 'jotai' +import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { Address, encodeFunctionData, @@ -25,6 +25,7 @@ import { orderIdsAtom, quotesAtom, selectedTokenAtom, + failedOrdersAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' @@ -34,7 +35,7 @@ import { indexDTFAtom } from '@/state/dtf/atoms' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const -export function useQuoteSignatures() { +export function useQuoteSignatures(refresh = false) { const indexDTF = useAtomValue(indexDTFAtom) const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) @@ -42,11 +43,12 @@ export function useQuoteSignatures() { const mintValue = useAtomValue(mintValueAtom) const inputAmount = useAtomValue(userInputAtom) const quoteToken = useAtomValue(selectedTokenAtom).address - const quotes = Object.values(useAtomValue(quotesAtom)) + const [quotes, setQuotes] = useAtom(quotesAtom) const setOrderIDs = useSetAtom(orderIdsAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const { orderBookApi } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() + const failedOrders = useAtomValue(failedOrdersAtom) return useMutation({ mutationFn: async () => { @@ -57,7 +59,9 @@ export function useQuoteSignatures() { } } - const successfulQuotes = quotes.filter((quote) => quote.success) + const successfulQuotes = Object.values(quotes).filter( + (quote) => quote.success + ) console.log({ successfulQuotes }) @@ -207,18 +211,39 @@ export function useQuoteSignatures() { }) ) - setOrderIDs(validOrderData.map(({ data }) => data.orderId)) - setAsyncSwapResponse({ - swapOrderId: uuidv4(), - chainId, - signer: address, - dtf: indexDTF.id, - inputAmount, - amountOut: parseEther(mintValue.toString()).toString(), - createdAt: new Date().toISOString(), - universalOrders: [], - cowswapOrders: [], - }) + if (refresh) { + // replace failed orders with new ones + setOrderIDs((prev) => [ + ...prev.filter( + (id) => !failedOrders.map((o) => o.orderId).includes(id) + ), + ...validOrderData.map(({ data }) => data.orderId), + ]) + setAsyncSwapResponse((prev) => { + if (!prev) return undefined + return { + ...prev, + cowswapOrders: prev?.cowswapOrders.filter( + (o) => !failedOrders.map((fo) => fo.orderId).includes(o.orderId) + ), + createdAt: new Date().toISOString(), + } + }) + } else { + setOrderIDs(validOrderData.map(({ data }) => data.orderId)) + setAsyncSwapResponse({ + swapOrderId: uuidv4(), + chainId, + signer: address, + dtf: indexDTF.id, + inputAmount, + amountOut: parseEther(mintValue.toString()).toString(), + createdAt: new Date().toISOString(), + universalOrders: [], + cowswapOrders: [], + }) + } + setQuotes({}) return { orders: validOrderData.map(({ data }) => data.orderId), diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index f1b459c4c..ebc9104a8 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,6 +1,6 @@ import { Token } from '@/types' import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' -import { Address, Hex } from 'viem' +import { Address } from 'viem' export enum QuoteProvider { CowSwap = 'CowSwap', From 3eba5ddd0da38b913b641e3652b93cb35cec2020 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 28 May 2025 11:58:36 -0300 Subject: [PATCH 40/85] chore: quote config update --- .../index-dtf/issuance/async-swaps/hooks/useQuote.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 038cf58f9..1fd144a19 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -1,7 +1,6 @@ import { useERC20Balances } from '@/hooks/useERC20Balance' import useTokensInfo from '@/hooks/useTokensInfo' import { chainIdAtom, walletAtom } from '@/state/atoms' -import { Token } from '@/types' import { OrderBookApi, OrderQuoteSideKindBuy, @@ -28,12 +27,6 @@ import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' import { useFolioDetails } from './useFolioDetails' -interface UseQuoteParams { - sellToken: Token - buyToken: Token - amount: bigint -} - async function getQuote({ sellToken, buyToken, @@ -68,7 +61,7 @@ async function getQuote({ buyToken, from: address, receiver: address, - validFor: 60 * 5, // 10 minutes + validFor: 60 * 10, // 10 minutes priceQuality: PriceQuality.VERIFIED, ...(operation === 'redeem' ? { From 9f40936347f647d07aebe86530f6737eae1cc5cf Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 10:28:09 -0300 Subject: [PATCH 41/85] chore: cowswap link always visible --- .../issuance/async-swaps/cowswap-order.tsx | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index 764bbf6bc..3a73aef49 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -39,22 +39,20 @@ const OrderStatus = ({ {STATUS_MAP[status] === 'Order Filled' && ( )} + {STATUS_MAP[status] === 'Processing' && ( + + )} {STATUS_MAP[status]} {STATUS_MAP[status] === 'Not Filled' && ( )} - {STATUS_MAP[status] === 'Order Filled' && ( - - - - )} - {STATUS_MAP[status] === 'Processing' && ( - - )} + + +
) } From 2dbf247d4e55e5465e522916a1c1f7495b540e91 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 10:48:29 -0300 Subject: [PATCH 42/85] fix: redeem output and cowswap component --- .../async-swaps/async-redeem/index.tsx | 4 +- .../issuance/async-swaps/cowswap-order.tsx | 52 +++++++++---------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index abd19210f..44b79a6be 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -78,8 +78,8 @@ const AsyncRedeem = () => { const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const collateralAcquired = useAtomValue(collateralAcquiredAtom) const orderSubmitted = !!asyncSwapResponse - const amountOut = useAtomValue(mintValueAtom) - const amountOutValue = useAtomValue(mintValueUSDAtom) + const amountOut = inputPrice + const amountOutValue = inputPrice const redeemAssets = useAtomValue(redeemAssetsAtom) const { isLoading, isFetching } = useQuotesForRedeem() diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index 3a73aef49..246a492db 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -11,6 +11,7 @@ import { formatUnits } from 'viem' import { operationAtom } from './atom' import { useOrderStatus } from './hooks/useOrderStatus' import { Skeleton } from '@/components/ui/skeleton' +import { useMemo } from 'react' const STATUS_MAP: Record = { [CowSwapOrderStatus.PRESIGNATURE_PENDING]: 'Processing', @@ -62,6 +63,20 @@ const CowSwapOrder = ({ orderId }: { orderId: string }) => { const operation = useAtomValue(operationAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + const { token, firstAmount, secondAmount } = useMemo(() => { + return operation === 'redeem' + ? { + token: data?.sellToken, + firstAmount: data?.sellAmount, + secondAmount: data?.buyAmount, + } + : { + token: data?.buyToken, + firstAmount: data?.buyAmount, + secondAmount: data?.sellAmount, + } + }, [data, operation]) + return (
{ >
token.address === data?.buyToken) - ?.symbol || '' + indexDTFBasket?.find((t) => t.address === token)?.symbol || '' } size="xl" />
- {data?.sellAmount ? ( + {secondAmount ? (
{operation === 'mint' ? '-' : '+'}{' '} - {formatCurrency( - Number( - formatUnits( - BigInt( - operation === 'mint' ? data.sellAmount : data.buyAmount - ), - 6 - ) - ) - )}{' '} + {formatCurrency(Number(formatUnits(BigInt(secondAmount), 6)))}{' '} USDC
) : ( )} - {data?.buyAmount ? ( + {firstAmount ? (
{operation === 'mint' ? '+' : '-'}{' '} {formatTokenAmount( Number( formatUnits( - BigInt( - operation === 'mint' ? data.buyAmount : data.sellAmount - ), - indexDTFBasket?.find( - (token) => - token.address === - (operation === 'mint' ? data.buyToken : data.sellToken) - )?.decimals || 18 + BigInt(firstAmount), + indexDTFBasket?.find((t) => t.address === token) + ?.decimals || 18 ) ) )}{' '} - {indexDTFBasket?.find( - (token) => - token.address === - (operation === 'mint' ? data.buyToken : data.sellToken) - )?.symbol || ''} + {indexDTFBasket?.find((t) => t.address === token)?.symbol || ''}
) : ( From bfc722cbf5f4cc0aad20899a2a354cae8238403b Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 11:17:49 -0300 Subject: [PATCH 43/85] chore: handle USDC edge case --- .../async-swaps/async-redeem/index.tsx | 4 +-- .../issuance/async-swaps/hooks/useQuote.ts | 7 +++++- .../issuance/async-swaps/success.tsx | 25 +++++++++++++------ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 44b79a6be..318057f3b 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -13,14 +13,13 @@ import { } from '@/state/dtf/atoms' import { formatCurrencyCompact } from '@/utils' import { useAtom, useAtomValue } from 'jotai' +import { useMemo } from 'react' import { formatEther } from 'viem' import { asyncSwapResponseAtom, collateralAcquiredAtom, indexDTFBalanceAtom, isMintingAtom, - mintValueAtom, - mintValueUSDAtom, redeemAssetsAtom, selectedTokenAtom, userInputAtom, @@ -29,7 +28,6 @@ import CollateralAcquisition from '../collateral-acquisition' import { useQuotesForRedeem } from '../hooks/useQuote' import SubmitRedeem from './submit-redeem' import SubmitRedeemOrders from './submit-redeem-orders' -import { useMemo } from 'react' const CustomInputBox = () => { const indexDTF = useAtomValue(indexDTFAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 1fd144a19..139cca1aa 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -123,7 +123,7 @@ export const useQuotesForMint = () => { const walletValue = (balances?.[i] as bigint) ?? 0n const amount = mintValue - walletValue - if (amount <= 0n) { + if (amount <= 0n || token.address === selectedToken.address) { console.log(asset, 'already has enough balance') return null } @@ -233,6 +233,11 @@ export const useQuotesForRedeem = () => { const token = tokensInfo[asset.toLowerCase()] const amount = redeemAssets[asset as Address] + if (token.address === selectedToken.address) { + console.log(asset, 'no need to redeem') + return null + } + try { return await getQuote({ sellToken: token.address, diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index a7730d830..4e0b988d5 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -174,14 +174,25 @@ const DTFAmount = () => { const USDCReceivedOnRedeem = () => { const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) const selectedToken = useAtomValue(selectedTokenAtom) + const assetsRedeemed = useAtomValue(redeemAssetsAtom) const { cowswapOrders = [] } = asyncSwapResponse || {} - const amountOut = cowswapOrders.reduce( - (acc, order) => - acc + - Number(formatUnits(BigInt(order.buyAmount), selectedToken.decimals)), - 0 - ) + const notSwappedAssets = + Number( + formatUnits( + assetsRedeemed[selectedToken.address] || 0n, + selectedToken.decimals + ) + ) || 0 + + const amountOut = + notSwappedAssets + + cowswapOrders.reduce( + (acc, order) => + acc + + Number(formatUnits(BigInt(order.buyAmount), selectedToken.decimals)), + 0 + ) return {formatCurrency(amountOut)} } @@ -224,7 +235,7 @@ const USDCAmount = () => { )} {operation === 'mint' && ( - + ${formatCurrency(Number(inputAmount))} )} From 52b6150183164cafd8a785cc346ab577eba8c7ca Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 12:02:44 -0300 Subject: [PATCH 44/85] feat: add async swap settings --- .../index-dtf/issuance/async-swaps/atom.ts | 2 + .../index-dtf/issuance/async-swaps/index.tsx | 32 ++++++----- .../issuance/async-swaps/settings.tsx | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/settings.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 545323047..bacd81fc9 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -21,6 +21,8 @@ export const orderIdsAtom = atom([]) export const asyncSwapResponseAtom = atom( undefined ) +export const slippageAtom = atom('100') +export const useWalletBalanceAtom = atom(true) // export const ordersAtom = atom>({}) export const refetchQuotesAtom = atom<{ fn: () => void }>({ fn: () => {} }) diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 3a0a3187b..703c2481a 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -9,7 +9,6 @@ import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' -import ZapSettings from '../../overview/components/zap-mint/zap-settings' import Updater from '../manual/updater' import AsyncMint from './async-mint' import AsyncRedeem from './async-redeem' @@ -28,17 +27,18 @@ import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Success from './success' +import Config from './settings' function Content() { const showSettings = useAtomValue(showSettingsAtom) const showCollaterals = useAtomValue(showCollateralsAtom) return ( -
-
+
+
@@ -75,13 +75,15 @@ const Header = () => { return (
{showSettings ? ( - +
+ +
) : ( <>
@@ -188,8 +190,8 @@ const AsyncSwaps = () => {
{showSettings && ( -
- +
+
)} diff --git a/src/views/index-dtf/issuance/async-swaps/settings.tsx b/src/views/index-dtf/issuance/async-swaps/settings.tsx new file mode 100644 index 000000000..b57a0ca93 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/settings.tsx @@ -0,0 +1,55 @@ +import { Checkbox } from '@/components/ui/checkbox' +import Help from '@/components/ui/help' +import { SlippageSelector } from '@/components/ui/swap' +import { useAtom } from 'jotai' +import { Wallet } from 'lucide-react' +import { slippageAtom, useWalletBalanceAtom } from './atom' + +const SettingsRowTitle = ({ title, help }: { title: string; help: string }) => ( +
+
{title}
+ +
+) + +const Settings = () => { + const [slippage, setSlippage] = useAtom(slippageAtom) + const [useWalletBalance, setUseWalletBalance] = useAtom(useWalletBalanceAtom) + + return ( +
+
+ +
+
+ +
Use wallet balance
+
+ + setUseWalletBalance(checked === 'indeterminate' ? true : checked) + } + /> +
+
+
+ + +
+
+ ) +} + +export default Settings From 547529e7f84b7e8925ef62f78eb39da05f921249 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 12:06:28 -0300 Subject: [PATCH 45/85] chore: add use wallet balance config --- src/views/index-dtf/issuance/async-swaps/atom.ts | 2 +- .../index-dtf/issuance/async-swaps/hooks/useQuote.ts | 6 +++++- .../index-dtf/issuance/async-swaps/settings.tsx | 12 ++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index bacd81fc9..6ad6c4762 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -22,7 +22,7 @@ export const asyncSwapResponseAtom = atom( undefined ) export const slippageAtom = atom('100') -export const useWalletBalanceAtom = atom(true) +export const applyWalletBalanceAtom = atom(true) // export const ordersAtom = atom>({}) export const refetchQuotesAtom = atom<{ fn: () => void }>({ fn: () => {} }) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 139cca1aa..4eea33a4d 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -22,6 +22,7 @@ import { redeemAssetsAtom, refetchQuotesAtom, selectedTokenAtom, + applyWalletBalanceAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' @@ -92,6 +93,7 @@ export const useQuotesForMint = () => { const folioAmount = parseEther(mintValue.toString()) const address = useAtomValue(walletAtom) const insufficientBalance = useAtomValue(insufficientBalanceAtom) + const applyWalletBalance = useAtomValue(applyWalletBalanceAtom) const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) @@ -120,7 +122,9 @@ export const useQuotesForMint = () => { folioDetails?.assets.map(async (asset, i) => { const token = tokensInfo[asset.toLowerCase()] const mintValue = folioDetails?.mintValues[i] - const walletValue = (balances?.[i] as bigint) ?? 0n + const walletValue = applyWalletBalance + ? ((balances?.[i] as bigint) ?? 0n) + : 0n const amount = mintValue - walletValue if (amount <= 0n || token.address === selectedToken.address) { diff --git a/src/views/index-dtf/issuance/async-swaps/settings.tsx b/src/views/index-dtf/issuance/async-swaps/settings.tsx index b57a0ca93..5cd5726f9 100644 --- a/src/views/index-dtf/issuance/async-swaps/settings.tsx +++ b/src/views/index-dtf/issuance/async-swaps/settings.tsx @@ -3,7 +3,7 @@ import Help from '@/components/ui/help' import { SlippageSelector } from '@/components/ui/swap' import { useAtom } from 'jotai' import { Wallet } from 'lucide-react' -import { slippageAtom, useWalletBalanceAtom } from './atom' +import { slippageAtom, applyWalletBalanceAtom } from './atom' const SettingsRowTitle = ({ title, help }: { title: string; help: string }) => (
@@ -14,7 +14,9 @@ const SettingsRowTitle = ({ title, help }: { title: string; help: string }) => ( const Settings = () => { const [slippage, setSlippage] = useAtom(slippageAtom) - const [useWalletBalance, setUseWalletBalance] = useAtom(useWalletBalanceAtom) + const [applyWalletBalance, setApplyWalletBalance] = useAtom( + applyWalletBalanceAtom + ) return (
@@ -29,9 +31,11 @@ const Settings = () => {
Use wallet balance
- setUseWalletBalance(checked === 'indeterminate' ? true : checked) + setApplyWalletBalance( + checked === 'indeterminate' ? true : checked + ) } />
From 54c1cc3780f37f218d94d3d02d814ecdfeb35770 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 29 May 2025 12:19:41 -0300 Subject: [PATCH 46/85] chore: add async mint details --- .../issuance/async-swaps/async-mint/index.tsx | 4 ++ .../index-dtf/issuance/async-swaps/atom.ts | 11 ++++ .../async-swaps/collateral-acquisition.tsx | 25 ++++----- .../issuance/async-swaps/details.tsx | 51 +++++++++++++++++++ .../issuance/async-swaps/success.tsx | 8 ++- 5 files changed, 82 insertions(+), 17 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/details.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index e367ef264..8c0ef3e58 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -12,6 +12,7 @@ import { useAtom, useAtomValue } from 'jotai' import { asyncSwapResponseAtom, collateralAcquiredAtom, + hasAllCollateralsAtom, isMintingAtom, mintValueAtom, mintValueUSDAtom, @@ -22,6 +23,7 @@ import { import CollateralAcquisition from '../collateral-acquisition' import { useQuotesForMint } from '../hooks/useQuote' import SubmitMint from './submit-mint-orders' +import Details from '../details' const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) @@ -38,6 +40,7 @@ const AsyncMint = () => { const orderSubmitted = !!asyncSwapResponse const amountOut = useAtomValue(mintValueAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) + const hasAllCollaterals = useAtomValue(hasAllCollateralsAtom) const { isLoading, isFetching } = useQuotesForMint() @@ -95,6 +98,7 @@ const AsyncMint = () => { > {!orderSubmitted && } {orderSubmitted && } + {!hasAllCollaterals &&
}
) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 6ad6c4762..e889604f9 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -118,3 +118,14 @@ export const pendingOrdersAtom = atom( ) } ) + +export const hasAllCollateralsAtom = atom((get) => { + const asyncSwapResponse = get(asyncSwapResponseAtom) + if (!asyncSwapResponse) return false + return ( + asyncSwapResponse?.cowswapOrders.length > 0 && + asyncSwapResponse?.cowswapOrders.every( + (order) => order.status === OrderStatus.FULFILLED + ) + ) +}) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index de0659b47..e64c8880d 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -8,6 +8,7 @@ import { useEffect, useMemo, useState } from 'react' import { asyncSwapResponseAtom, failedOrdersAtom, + hasAllCollateralsAtom, openCollateralPanelAtom, operationAtom, pendingOrdersAtom, @@ -85,6 +86,12 @@ const CollateralAcquisition = () => { const setSuccess = useSetAtom(successAtom) const failedOrders = useAtomValue(failedOrdersAtom) const pendingOrders = useAtomValue(pendingOrdersAtom) + const hasAllCollaterals = useAtomValue(hasAllCollateralsAtom) + + const refreshQuotes = useMemo( + () => failedOrders.length > 0 && pendingOrders.length === 0, + [failedOrders, pendingOrders] + ) useEffect(() => { if (!asyncSwapResponse?.createdAt) return @@ -99,28 +106,14 @@ const CollateralAcquisition = () => { return () => clearInterval(interval) }, [asyncSwapResponse?.createdAt]) - if (!asyncSwapResponse) return null - - const refreshQuotes = useMemo( - () => failedOrders.length > 0 && pendingOrders.length === 0, - [failedOrders, pendingOrders] - ) - - const hasAllCollaterals = useMemo( - () => - asyncSwapResponse.cowswapOrders.length > 0 && - asyncSwapResponse.cowswapOrders.every( - (order) => order.status === OrderStatus.FULFILLED - ), - [asyncSwapResponse.cowswapOrders] - ) - useEffect(() => { if (hasAllCollaterals && operation === 'redeem') { setSuccess(true) } }, [hasAllCollaterals, setSuccess, operation]) + if (!asyncSwapResponse) return null + if (hasAllCollaterals && operation === 'mint') { return (
diff --git a/src/views/index-dtf/issuance/async-swaps/details.tsx b/src/views/index-dtf/issuance/async-swaps/details.tsx new file mode 100644 index 000000000..8fd049c9d --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/details.tsx @@ -0,0 +1,51 @@ +import { SwapDetails } from '@/components/ui/swap' +import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' +import { formatCurrency, formatPercentage } from '@/utils' +import { useAtomValue } from 'jotai' +import { mintValueUSDAtom } from './atom' + +const Details = () => { + const indexDTF = useAtomValue(indexDTFAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) + const mintValueUSD = useAtomValue(mintValueUSDAtom) + + const ratioText = `1 ${indexDTF?.token?.symbol} = ${formatCurrency(indexDTFPrice || 0)} USDC` + const mintFeeValue = mintValueUSD * (indexDTF?.mintingFee || 0) + + if (!indexDTF) return null + + return ( + + Fee{' '} + {formatPercentage(indexDTF.mintingFee * 100)} + + ), + }} + details={[ + { + left: Mint Fee, + right: ( + + ${formatCurrency(mintFeeValue)}{' '} + + ({formatPercentage(indexDTF.mintingFee * 100)}) + + + ), + help: 'A one-time fee deduction from the tokens you are using to create a share of the DTF. This fee is set by the Governors of the DTF.', + }, + // { + // left: Price Impact, + // right: , + // help: 'The impact your trade has on the market price.', + // }, + ]} + /> + ) +} + +export default Details diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 4e0b988d5..f63046ba7 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -37,6 +37,7 @@ import { quotesAtom, } from './atom' import CowSwapOrder from './cowswap-order' +import Details from './details' const viewTransactionsAtom = atom(false) @@ -240,7 +241,12 @@ const USDCAmount = () => { )}
- {operation === 'mint' && } + {operation === 'mint' && ( +
+ +
+
+ )}
) } From 799a14a48cb1d388fd2950692064a3ea1a13ab3e Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 16 Jun 2025 10:49:32 -0300 Subject: [PATCH 47/85] chore: universal useQuote --- package-lock.json | 148 +++++++++++++++--- package.json | 1 + .../issuance/async-swaps/hooks/useQuote.ts | 92 ++++++++--- .../async-swaps/hooks/useQuoteSignatures.ts | 28 +++- .../providers/GlobalProtocolKitProvider.tsx | 30 +++- .../async-swaps/providers/universal.ts | 66 ++++++++ vite.config.ts | 9 +- 7 files changed, 326 insertions(+), 48 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/providers/universal.ts diff --git a/package-lock.json b/package-lock.json index eb716622a..8d473e5c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,6 +81,7 @@ "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", "theme-ui": "0.17.1", + "universal-sdk": "^0.1.34", "vaul": "^1.1.1", "viem": "^2.30.0", "wagmi": "^2.15.4", @@ -3012,7 +3013,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -3091,7 +3091,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -3146,7 +3145,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -3176,7 +3174,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -3262,7 +3259,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -3301,7 +3297,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3329,7 +3324,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3360,7 +3354,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -3400,7 +3393,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -3445,7 +3437,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3517,7 +3508,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3538,7 +3528,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3594,7 +3583,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -9134,6 +9122,58 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@uniswap/permit2-sdk": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@uniswap/permit2-sdk/-/permit2-sdk-1.3.1.tgz", + "integrity": "sha512-Eq2by4zVEVSZL3PJ1Yuf5+AZ/yE1GOuksWzPXPoxr5WRm3hqh34jKEqtyTImHqwuPrdILG8i02xJmgGLTH1QfA==", + "license": "MIT", + "dependencies": { + "ethers": "^5.7.0", + "tiny-invariant": "^1.1.0" + } + }, + "node_modules/@uniswap/sdk-core": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-4.2.1.tgz", + "integrity": "sha512-hr7vwYrXScg+V8/rRc2UL/Ixc/p0P7yqe4D/OxzUdMRYr8RZd+8z5Iu9+WembjZT/DCdbTjde6lsph4Og0n1BQ==", + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.0.2", + "big.js": "^5.2.2", + "decimal.js-light": "^2.5.0", + "jsbi": "^3.1.4", + "tiny-invariant": "^1.1.0", + "toformat": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/sdk-core/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@uniswap/uniswapx-sdk": { + "version": "2.0.1-alpha.10", + "resolved": "https://registry.npmjs.org/@uniswap/uniswapx-sdk/-/uniswapx-sdk-2.0.1-alpha.10.tgz", + "integrity": "sha512-nDWJ9qLFBLId2lxJ8TMy15HIBlzQe2yFE6LEJSzEF1T5EGDFv1G/ioKQSm2LJg4cO11UfVouHKsn6rwYS6P9wA==", + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@uniswap/permit2-sdk": "^1.2.0", + "@uniswap/sdk-core": "^4.0.3", + "ethers": "^5.7.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@vanilla-extract/css": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.5.tgz", @@ -10501,8 +10541,7 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "peer": true + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "node_modules/ajv": { "version": "8.17.1", @@ -10935,8 +10974,7 @@ "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "peer": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big.js": { "version": "6.2.2", @@ -13052,7 +13090,55 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/ethers5": { + "name": "ethers", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", @@ -15497,6 +15583,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbi": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==", + "license": "Apache-2.0" + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -20074,8 +20166,7 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "peer": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/semver": { "version": "6.3.1", @@ -21010,6 +21101,12 @@ "node": ">=8.0" } }, + "node_modules/toformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==", + "license": "MIT" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -21360,6 +21457,17 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universal-sdk": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/universal-sdk/-/universal-sdk-0.1.34.tgz", + "integrity": "sha512-1YNXbuEsBe6XWiHdWuUKvrOLm4G11LVWRQ8b/PSHNQE78sria+a0ONyZdtReGGk5uhJLdbCh39po2fl5Eg7BbQ==", + "license": "ISC", + "dependencies": { + "@uniswap/uniswapx-sdk": "^2.0.1-alpha.10", + "axios": "^1.7.9", + "ethers5": "npm:ethers@5" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index ba2acf6fe..1df78144b 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", "theme-ui": "0.17.1", + "universal-sdk": "^0.1.34", "vaul": "^1.1.1", "viem": "^2.30.0", "wagmi": "^2.15.4", diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 4eea33a4d..944161d45 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -1,6 +1,7 @@ import { useERC20Balances } from '@/hooks/useERC20Balance' import useTokensInfo from '@/hooks/useTokensInfo' import { chainIdAtom, walletAtom } from '@/state/atoms' +import { Token } from '@/types' import { OrderBookApi, OrderQuoteSideKindBuy, @@ -13,18 +14,24 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { Address, parseEther, zeroAddress } from 'viem' import { + applyWalletBalanceAtom, failedOrdersAtom, fetchingQuotesAtom, - insufficientBalanceAtom, mintValueAtom, operationAtom, quotesAtom, redeemAssetsAtom, refetchQuotesAtom, selectedTokenAtom, - applyWalletBalanceAtom, } from '../atom' -import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' +import { + UniversalRelayerWithRateLimiter, + useGlobalProtocolKit, +} from '../providers/GlobalProtocolKitProvider' +import { + CustomUniversalQuote, + getUniversalTokenName, +} from '../providers/universal' import { QuoteProvider } from '../types' import { useFolioDetails } from './useFolioDetails' @@ -33,15 +40,17 @@ async function getQuote({ buyToken, amount, address, - orderBookApi, operation, + orderBookApi, + universalSdk, }: { sellToken: Address buyToken: Address amount: bigint address: Address - orderBookApi: OrderBookApi operation: 'redeem' | 'mint' + orderBookApi: OrderBookApi + universalSdk: UniversalRelayerWithRateLimiter }) { if ( !address || @@ -57,6 +66,40 @@ async function getQuote({ throw new Error('getQuote: Amount is 0') } + // Try Universal first if available + if (universalSdk) { + const universalAsset = getUniversalTokenName(buyToken) + if (universalAsset) { + try { + const universalQuote = await universalSdk.getQuote({ + type: 'BUY', + blockchain: 'BASE', + token: universalAsset, + pair_token: 'USDC', + user_address: address, + slippage_bips: 100, + token_amount: amount.toString(), + }) + + const customQuote: CustomUniversalQuote = { + _originalQuote: universalQuote, + buyToken, + sellToken, + type: 'BUY', + userAddress: address, + sellAmount: BigInt(universalQuote.pair_token_amount ?? '0'), + buyAmount: amount, + validTo: Number(universalQuote.deadline ?? 0), + } + return customQuote + } catch (error) { + console.error(`Error getting universal quote:`, error) + // If Universal fails, continue with CowSwap + } + } + } + + // If no Universal or it failed, use CowSwap const quote = await orderBookApi.getQuote({ sellToken, buyToken, @@ -92,13 +135,12 @@ export const useQuotesForMint = () => { const mintValue = useAtomValue(mintValueAtom) const folioAmount = parseEther(mintValue.toString()) const address = useAtomValue(walletAtom) - const insufficientBalance = useAtomValue(insufficientBalanceAtom) const applyWalletBalance = useAtomValue(applyWalletBalanceAtom) const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) - const { orderBookApi } = useGlobalProtocolKit() + const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) const { data: balances } = useERC20Balances( (folioDetails?.assets || []).map((address) => ({ @@ -114,7 +156,7 @@ export const useQuotesForMint = () => { const query = useQuery({ queryKey: ['quotes/mint', folioDetails?.assets, folioDetails?.mintValues], queryFn: async ({ signal }) => { - if (!folioDetails || !tokensInfo || !orderBookApi) { + if (!folioDetails || !tokensInfo || !orderBookApi || !universalSdk) { return {} } @@ -138,8 +180,9 @@ export const useQuotesForMint = () => { buyToken: token.address, amount, address: address as Address, - orderBookApi, operation: 'mint', + orderBookApi, + universalSdk, }) } catch (error) { console.error(`Error getting quote for ${asset}:`, error) @@ -152,13 +195,18 @@ export const useQuotesForMint = () => { folioDetails.assets.forEach((asset, i) => { const token = tokensInfo[asset.toLowerCase()] const quote = results[i] + const type = + quote && '_originalQuote' in quote + ? QuoteProvider.Universal + : QuoteProvider.CowSwap + try { if (!signal.aborted) { setQuotes((prev) => ({ ...prev, [token.address as string]: { success: !!quote, - type: QuoteProvider.CowSwap, + type, data: quote, }, })) @@ -167,7 +215,7 @@ export const useQuotesForMint = () => { return { token: token, success: true, - source: QuoteProvider.CowSwap, + type, quote, } } catch { @@ -188,11 +236,7 @@ export const useQuotesForMint = () => { return quotes }, - enabled: - !insufficientBalance && - !!folioDetails?.mintValues && - !!tokensInfo && - !!folioAmount, + enabled: !!folioDetails?.mintValues && !!tokensInfo && !!folioAmount, }) useEffect(() => { @@ -210,8 +254,7 @@ export const useQuotesForRedeem = () => { const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) - - const { orderBookApi } = useGlobalProtocolKit() + const { orderBookApi, universalSdk } = useGlobalProtocolKit() const assets = Object.keys(redeemAssets) @@ -227,7 +270,8 @@ export const useQuotesForRedeem = () => { !assets || !assets.length || !tokensInfo || - !orderBookApi + !orderBookApi || + !universalSdk ) { return {} } @@ -248,8 +292,9 @@ export const useQuotesForRedeem = () => { buyToken: selectedToken.address, amount, address: address as Address, - orderBookApi, operation: 'redeem', + orderBookApi, + universalSdk, }) } catch (error) { console.error(`Error getting quote for ${asset}:`, error) @@ -311,7 +356,7 @@ export const useQuotesForRedeem = () => { export const useRefreshQuotes = () => { const address = useAtomValue(walletAtom) - const { orderBookApi } = useGlobalProtocolKit() + const { orderBookApi, universalSdk } = useGlobalProtocolKit() const [quotes, setQuotes] = useAtom(quotesAtom) const operation = useAtomValue(operationAtom) const failedOrders = useAtomValue(failedOrdersAtom) @@ -319,7 +364,7 @@ export const useRefreshQuotes = () => { const query = useQuery({ queryKey: ['refresh-quotes', failedOrders], queryFn: async () => { - if (!failedOrders || !orderBookApi || !address) { + if (!failedOrders || !orderBookApi || !address || !universalSdk) { return } @@ -331,8 +376,9 @@ export const useRefreshQuotes = () => { operation === 'redeem' ? order.sellAmount : order.buyAmount ), address: address as Address, - orderBookApi, operation, + orderBookApi, + universalSdk, }) }) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index d55a36143..c8ba381c9 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -16,7 +16,7 @@ import { maxUint256, parseEther, } from 'viem' -import { useSendCalls } from 'wagmi' +import { useSendCalls, useSignTypedData } from 'wagmi' import { userInputAtom, asyncSwapResponseAtom, @@ -31,11 +31,14 @@ import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { QuoteProvider } from '../types' import { uuidv4 } from '@/utils' import { indexDTFAtom } from '@/state/dtf/atoms' +import { generateTypedData } from 'universal-sdk' +import { CustomUniversalQuote } from '../providers/universal' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const export function useQuoteSignatures(refresh = false) { + const { data: signature, signTypedData } = useSignTypedData() const indexDTF = useAtomValue(indexDTFAtom) const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) @@ -46,13 +49,13 @@ export function useQuoteSignatures(refresh = false) { const [quotes, setQuotes] = useAtom(quotesAtom) const setOrderIDs = useSetAtom(orderIdsAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - const { orderBookApi } = useGlobalProtocolKit() + const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) return useMutation({ mutationFn: async () => { - if (!address || !orderBookApi || !chainId || !indexDTF) { + if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { console.error('No global kit') return { orders: [], @@ -132,6 +135,25 @@ export function useQuoteSignatures(refresh = false) { } } + if (quote.success && quote.type === QuoteProvider.Universal) { + const uq = quote.data as CustomUniversalQuote + const { typedData } = await generateTypedData(uq._originalQuote) + + await signTypedData(typedData) + + // const universalOrder = await universalSdk.submitOrder({ + // ...uq._originalQuote, + // signature: signature!, + // }) + + // return { + // type: quote.type, + // data: universalOrder, + // } + console.log({ signature }) + return null + } + return null }) ) diff --git a/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx b/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx index 34791bd52..230a36cf0 100644 --- a/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx +++ b/src/views/index-dtf/issuance/async-swaps/providers/GlobalProtocolKitProvider.tsx @@ -8,13 +8,21 @@ import { useEffect, useState, } from 'react' +import { createUniversalSdkWrapper } from './universal' +import { ChainId } from '@/utils/chains' + +export type UniversalRelayerWithRateLimiter = ReturnType< + typeof createUniversalSdkWrapper +> type GlobalProtocolKitContextType = { orderBookApi: OrderBookApi | null + universalSdk: UniversalRelayerWithRateLimiter | null } const GlobalProtocolKitContext = createContext({ orderBookApi: null, + universalSdk: null, }) export const useGlobalProtocolKit = () => useContext(GlobalProtocolKitContext) @@ -29,12 +37,31 @@ export function GlobalProtocolKitProvider({ const chainId = useAtomValue(chainIdAtom) const [orderBookApi, setOrderBookApi] = useState(null) + const [universalSdk, setUniversalSdk] = useState | null>(null) useEffect(() => { if (chainId) { + setUniversalSdk(createUniversalSdkWrapper()) + setOrderBookApi( + new OrderBookApi({ + chainId, + limiterOpts: { + tokensPerInterval: 4, + interval: 'second', + }, + backoffOpts: { + numOfAttempts: 3, + maxDelay: Infinity, + jitter: 'full', + }, + }) + ) + } else { setOrderBookApi( new OrderBookApi({ - chainId: chainId, + chainId: ChainId.Base, limiterOpts: { tokensPerInterval: 4, interval: 'second', @@ -53,6 +80,7 @@ export function GlobalProtocolKitProvider({ {children} diff --git a/src/views/index-dtf/issuance/async-swaps/providers/universal.ts b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts new file mode 100644 index 000000000..016016681 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts @@ -0,0 +1,66 @@ +import { Token } from '@/types' +import { RateLimiter } from 'limiter' +import { Quote, TokenName, UniversalRelayerSDK } from 'universal-sdk' +import { TokenAddresses } from 'universal-sdk/dist/config' +import { Address } from 'viem' + +export type CustomUniversalQuote = { + userAddress: Address + buyToken: Address + sellToken: Address + type: 'BUY' | 'SELL' + sellAmount: bigint + buyAmount: bigint + validTo: number + _originalQuote: Quote +} + +const universalTokenMap: Record = Object.entries( + TokenAddresses +).reduce( + (acc, [tokenName, address]) => ({ + ...acc, + [address.toLowerCase()]: tokenName as TokenName, + }), + {} as Record +) + +export const getUniversalTokenName = (token: Address) => { + return universalTokenMap[token.toLowerCase() as Address] as TokenName +} + +export const getUniversalTokenAddress = (token: TokenName) => { + // @ts-expect-error - USDC is not in the universalTokenMap but we need it for the universal SDK + if (token === 'USDC') { + return '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' + } + + return Object.keys(universalTokenMap).find( + (key) => universalTokenMap[key as Address] === token + ) as Address +} + +export const createUniversalSdkWrapper = () => { + const limiter = new RateLimiter({ + tokensPerInterval: 1, + interval: 750, + }) + const sdk = new UniversalRelayerSDK() + + return { + getQuote: async (quote: Parameters[0]) => { + await limiter.removeTokens(1) + + return sdk.getQuote(quote) + }, + getOrders: async (orders: Parameters[0]) => { + await limiter.removeTokens(1) + return sdk.getOrders(orders) + }, + submitOrder: async (order: Parameters[0]) => { + await limiter.removeTokens(1) + + return sdk.submitOrder(order) + }, + } +} diff --git a/vite.config.ts b/vite.config.ts index 6a1cb38b9..2653d51bd 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -67,9 +67,16 @@ export default defineConfig({ types: path.resolve('src/types/'), utils: path.resolve('src/utils/'), '@': path.resolve(__dirname, './src'), + '@uniswap/uniswapx-sdk': path.resolve( + __dirname, + 'node_modules/@uniswap/uniswapx-sdk/dist/src/index.js' + ), }, }, - optimizeDeps: { exclude: ['ts-node'] }, + optimizeDeps: { + exclude: ['ts-node'], + include: ['@uniswap/uniswapx-sdk'], + }, server: { port: 3000, }, From 3b962a2c3ac11a95f361294d4f7165de2a2f1fa1 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 18 Jun 2025 09:34:49 -0300 Subject: [PATCH 48/85] chore: universal useQuoteSignature --- .../issuance/async-swaps/hooks/useQuote.ts | 6 +- .../async-swaps/hooks/useQuoteSignatures.ts | 124 ++++++++++++------ .../issuance/async-swaps/hooks/utils.ts | 31 +++++ 3 files changed, 116 insertions(+), 45 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/utils.ts diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 944161d45..fc32b61b5 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -1,7 +1,6 @@ import { useERC20Balances } from '@/hooks/useERC20Balance' import useTokensInfo from '@/hooks/useTokensInfo' import { chainIdAtom, walletAtom } from '@/state/atoms' -import { Token } from '@/types' import { OrderBookApi, OrderQuoteSideKindBuy, @@ -78,7 +77,10 @@ async function getQuote({ pair_token: 'USDC', user_address: address, slippage_bips: 100, - token_amount: amount.toString(), + token_amount: + universalAsset === 'SOL' + ? ((amount * 200n) / 100n).toString() + : amount.toString(), }) const customQuote: CustomUniversalQuote = { diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index c8ba381c9..c478a6759 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -1,5 +1,7 @@ import CowswapSettlement from '@/abis/CowSwapSettlement' import { chainIdAtom, walletAtom } from '@/state/atoms' +import { indexDTFAtom } from '@/state/dtf/atoms' +import { uuidv4 } from '@/utils' import { OrderBalance } from '@cowprotocol/contracts' import { OrderCreation, @@ -8,6 +10,7 @@ import { } from '@cowprotocol/cow-sdk' import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { generateTypedData, OrderRequest } from 'universal-sdk' import { Address, encodeFunctionData, @@ -18,27 +21,25 @@ import { } from 'viem' import { useSendCalls, useSignTypedData } from 'wagmi' import { - userInputAtom, asyncSwapResponseAtom, - operationAtom, + failedOrdersAtom, mintValueAtom, + operationAtom, orderIdsAtom, quotesAtom, selectedTokenAtom, - failedOrdersAtom, + userInputAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' -import { QuoteProvider } from '../types' -import { uuidv4 } from '@/utils' -import { indexDTFAtom } from '@/state/dtf/atoms' -import { generateTypedData } from 'universal-sdk' import { CustomUniversalQuote } from '../providers/universal' +import { QuoteProvider } from '../types' +import { convertTypeDataToBigInt } from './utils' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const +const UNIVERSAL_PERMIT2 = '0x000000000022D473030F116dDEE9F6B43aC78BA3' as const export function useQuoteSignatures(refresh = false) { - const { data: signature, signTypedData } = useSignTypedData() const indexDTF = useAtomValue(indexDTFAtom) const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) @@ -53,6 +54,8 @@ export function useQuoteSignatures(refresh = false) { const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) + const { signTypedDataAsync } = useSignTypedData() + return useMutation({ mutationFn: async () => { if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { @@ -137,21 +140,14 @@ export function useQuoteSignatures(refresh = false) { if (quote.success && quote.type === QuoteProvider.Universal) { const uq = quote.data as CustomUniversalQuote - const { typedData } = await generateTypedData(uq._originalQuote) - - await signTypedData(typedData) - // const universalOrder = await universalSdk.submitOrder({ - // ...uq._originalQuote, - // signature: signature!, - // }) - - // return { - // type: quote.type, - // data: universalOrder, - // } - console.log({ signature }) - return null + return { + type: QuoteProvider.Universal, + data: { + ...uq, + quote: uq._originalQuote, + }, + } } return null @@ -170,7 +166,7 @@ export function useQuoteSignatures(refresh = false) { data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', - args: [COWSWAP_VAULT, BigInt(data.amount)], + args: [COWSWAP_VAULT, BigInt(data.amount as string)], }), value: 0n, } @@ -183,6 +179,21 @@ export function useQuoteSignatures(refresh = false) { ].filter((e) => e !== null) } + // if (type === QuoteProvider.Universal) { + // // Solo approve → Permit2 + // return [ + // { + // to: data.sellToken as Address, + // data: encodeFunctionData({ + // abi: erc20Abi, + // functionName: 'approve', + // args: [UNIVERSAL_PERMIT2, maxUint256], + // }), + // value: 0n, + // }, + // ] + // } + return null }) .filter((data) => data !== null) @@ -198,6 +209,15 @@ export function useQuoteSignatures(refresh = false) { }), value: 0n, }) + txData.unshift({ + to: quoteToken, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [UNIVERSAL_PERMIT2, maxUint256], + }), + value: 0n, + }) } // TODO: tx confirmation checks @@ -207,29 +227,47 @@ export function useQuoteSignatures(refresh = false) { forceAtomic: true, }) - // TODO: Turns out this is buggy - // const receipt = await walletClient.waitForCallsStatus({ - // id: txBundle.id, - // }); - - console.log({ txBundle }) + // console.log({ txBundle }) // TODO: Wait here until Safe tx is onchain // I wonder if this is better suited for a different hook tbh // TODO: Create an order Index which is independently managed - await Promise.all( - orderData + const orderIds = await Promise.all( + validOrderData .filter((e) => e != null) - .map(async ({ data }) => { - const e = await orderBookApi.sendOrder({ - ...data.quote, - from: address, - signature: address, - signingScheme: SigningScheme.PRESIGN, - }) - console.log(data, e) - return e + .map(async ({ type, data }) => { + if (type === QuoteProvider.CowSwap) { + const order = data.quote as OrderCreation + const e = await orderBookApi.sendOrder({ + ...order, + from: address, + signature: address, + signingScheme: SigningScheme.PRESIGN, + }) + console.log(data, e) + return e + } else { + if (type === QuoteProvider.Universal) { + const quote = data.quote as OrderRequest + const { typedData } = await generateTypedData(quote) + + // Prompt Safe for signature + console.log({ typedData }) + const _typedData = convertTypeDataToBigInt(typedData) + + console.log({ _typedData }) + const signature = await signTypedDataAsync(_typedData) + console.log({ signature }) + // Submit order with signature + const universalOrder = await universalSdk.submitOrder({ + ...quote, + signature, + }) + console.log(data, universalOrder) + return universalOrder.order_id + } + } }) ) @@ -239,7 +277,7 @@ export function useQuoteSignatures(refresh = false) { ...prev.filter( (id) => !failedOrders.map((o) => o.orderId).includes(id) ), - ...validOrderData.map(({ data }) => data.orderId), + ...orderIds.filter((id) => id !== undefined), ]) setAsyncSwapResponse((prev) => { if (!prev) return undefined @@ -252,7 +290,7 @@ export function useQuoteSignatures(refresh = false) { } }) } else { - setOrderIDs(validOrderData.map(({ data }) => data.orderId)) + setOrderIDs(orderIds.filter((id) => id !== undefined)) setAsyncSwapResponse({ swapOrderId: uuidv4(), chainId, @@ -268,7 +306,7 @@ export function useQuoteSignatures(refresh = false) { setQuotes({}) return { - orders: validOrderData.map(({ data }) => data.orderId), + orders: orderIds.filter((id) => id !== undefined), } }, onError(error) { diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts new file mode 100644 index 000000000..20fc4788f --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -0,0 +1,31 @@ +export function convertTypeDataToBigInt(obj: any, isInDomain = false): any { + if (Array.isArray(obj)) { + return obj.map((item) => convertTypeDataToBigInt(item, isInDomain)) + } + + if (obj && typeof obj === 'object') { + // If we're inside the domain object, don't convert numbers + if (isInDomain) { + return obj + } + + // Convert BigNumber + if (obj._isBigNumber && typeof obj._hex === 'string') { + return BigInt(obj._hex) + } + + const result: Record = {} + for (const key in obj) { + // If the key is 'domain', pass true to indicate we're inside the domain + result[key] = convertTypeDataToBigInt(obj[key], key === 'domain') + } + return result + } + + // Convert numbers to BigInt if we're not in domain + if (!isInDomain && typeof obj === 'number') { + return BigInt(obj) + } + + return obj +} From b15efdf6fbfd17cc3fdfc37a60e6d31bd0eb1411 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 18 Jun 2025 09:50:15 -0300 Subject: [PATCH 49/85] chore: refactor --- .../async-swaps/hooks/useQuoteSignatures.ts | 72 +++++++++++++------ 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index c478a6759..bd5d70d38 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -18,8 +18,9 @@ import { Hex, maxUint256, parseEther, + parseUnits, } from 'viem' -import { useSendCalls, useSignTypedData } from 'wagmi' +import { usePublicClient, useSendCalls, useSignTypedData } from 'wagmi' import { asyncSwapResponseAtom, failedOrdersAtom, @@ -46,19 +47,26 @@ export function useQuoteSignatures(refresh = false) { const operation = useAtomValue(operationAtom) const mintValue = useAtomValue(mintValueAtom) const inputAmount = useAtomValue(userInputAtom) - const quoteToken = useAtomValue(selectedTokenAtom).address + const quoteToken = useAtomValue(selectedTokenAtom) const [quotes, setQuotes] = useAtom(quotesAtom) const setOrderIDs = useSetAtom(orderIdsAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) - const { signTypedDataAsync } = useSignTypedData() + const publicClient = usePublicClient() return useMutation({ mutationFn: async () => { - if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { + if ( + !address || + !orderBookApi || + !chainId || + !indexDTF || + !universalSdk || + !publicClient + ) { console.error('No global kit') return { orders: [], @@ -179,8 +187,8 @@ export function useQuoteSignatures(refresh = false) { ].filter((e) => e !== null) } + // TODO: redeem // if (type === QuoteProvider.Universal) { - // // Solo approve → Permit2 // return [ // { // to: data.sellToken as Address, @@ -199,25 +207,49 @@ export function useQuoteSignatures(refresh = false) { .filter((data) => data !== null) .flat() + let needsApproveVault = false + let needsApprovePermit2 = false if (operation === 'mint') { - txData.unshift({ - to: quoteToken, - data: encodeFunctionData({ + const requiredAmount = parseUnits(inputAmount, quoteToken.decimals) + // Consultar allowance para ambos spenders + const [allowanceVault, allowancePermit2] = await Promise.all([ + publicClient.readContract({ + address: quoteToken.address, abi: erc20Abi, - functionName: 'approve', - args: [COWSWAP_VAULT, maxUint256], + functionName: 'allowance', + args: [address, COWSWAP_VAULT], }), - value: 0n, - }) - txData.unshift({ - to: quoteToken, - data: encodeFunctionData({ + publicClient.readContract({ + address: quoteToken.address, abi: erc20Abi, - functionName: 'approve', - args: [UNIVERSAL_PERMIT2, maxUint256], + functionName: 'allowance', + args: [address, UNIVERSAL_PERMIT2], }), - value: 0n, - }) + ]) + needsApproveVault = allowanceVault < requiredAmount + needsApprovePermit2 = allowancePermit2 < requiredAmount + if (needsApproveVault) { + txData.unshift({ + to: quoteToken.address, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [COWSWAP_VAULT, maxUint256], + }), + value: 0n, + }) + } + if (needsApprovePermit2) { + txData.unshift({ + to: quoteToken.address, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [UNIVERSAL_PERMIT2, maxUint256], + }), + value: 0n, + }) + } } // TODO: tx confirmation checks @@ -227,7 +259,7 @@ export function useQuoteSignatures(refresh = false) { forceAtomic: true, }) - // console.log({ txBundle }) + console.log({ txBundle }) // TODO: Wait here until Safe tx is onchain // I wonder if this is better suited for a different hook tbh From 7a68bc2b6b04e4aa01adc8867309766dcb9d2c2c Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 18 Jun 2025 10:14:39 -0300 Subject: [PATCH 50/85] chore: refactor --- .../async-swaps/hooks/useQuoteSignatures.ts | 59 ++++--------------- .../issuance/async-swaps/hooks/utils.ts | 46 +++++++++++++++ 2 files changed, 56 insertions(+), 49 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index bd5d70d38..cfe625e4e 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -34,7 +34,7 @@ import { import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' import { CustomUniversalQuote } from '../providers/universal' import { QuoteProvider } from '../types' -import { convertTypeDataToBigInt } from './utils' +import { convertTypeDataToBigInt, getApprovalCallIfNeeded } from './utils' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const @@ -55,18 +55,10 @@ export function useQuoteSignatures(refresh = false) { const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) const { signTypedDataAsync } = useSignTypedData() - const publicClient = usePublicClient() return useMutation({ mutationFn: async () => { - if ( - !address || - !orderBookApi || - !chainId || - !indexDTF || - !universalSdk || - !publicClient - ) { + if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { console.error('No global kit') return { orders: [], @@ -207,48 +199,17 @@ export function useQuoteSignatures(refresh = false) { .filter((data) => data !== null) .flat() - let needsApproveVault = false - let needsApprovePermit2 = false if (operation === 'mint') { const requiredAmount = parseUnits(inputAmount, quoteToken.decimals) - // Consultar allowance para ambos spenders - const [allowanceVault, allowancePermit2] = await Promise.all([ - publicClient.readContract({ - address: quoteToken.address, - abi: erc20Abi, - functionName: 'allowance', - args: [address, COWSWAP_VAULT], - }), - publicClient.readContract({ - address: quoteToken.address, - abi: erc20Abi, - functionName: 'allowance', - args: [address, UNIVERSAL_PERMIT2], - }), - ]) - needsApproveVault = allowanceVault < requiredAmount - needsApprovePermit2 = allowancePermit2 < requiredAmount - if (needsApproveVault) { - txData.unshift({ - to: quoteToken.address, - data: encodeFunctionData({ - abi: erc20Abi, - functionName: 'approve', - args: [COWSWAP_VAULT, maxUint256], - }), - value: 0n, - }) - } - if (needsApprovePermit2) { - txData.unshift({ - to: quoteToken.address, - data: encodeFunctionData({ - abi: erc20Abi, - functionName: 'approve', - args: [UNIVERSAL_PERMIT2, maxUint256], - }), - value: 0n, + for (const spender of [COWSWAP_VAULT, UNIVERSAL_PERMIT2]) { + const approvalCall = await getApprovalCallIfNeeded({ + chainId, + address: address as Address, + token: quoteToken.address as Address, + requiredAmount, + spender, }) + if (approvalCall) txData.unshift(approvalCall) } } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts index 20fc4788f..d47f4433b 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -1,3 +1,15 @@ +import { wagmiConfig } from '@/state/chain' +import { AvailableChain } from '@/utils/chains' +import { + erc20Abi, + encodeFunctionData, + maxUint256, + parseUnits, + Address, + Hex, +} from 'viem' +import { getPublicClient } from 'wagmi/actions' + export function convertTypeDataToBigInt(obj: any, isInDomain = false): any { if (Array.isArray(obj)) { return obj.map((item) => convertTypeDataToBigInt(item, isInDomain)) @@ -29,3 +41,37 @@ export function convertTypeDataToBigInt(obj: any, isInDomain = false): any { return obj } + +export async function getApprovalCallIfNeeded({ + chainId, + address, + token, + requiredAmount, + spender, +}: { + chainId: AvailableChain + address: Address + token: Address + requiredAmount: bigint + spender: Address +}): Promise<{ to: Address; data: Hex; value: bigint } | null> { + const publicClient = getPublicClient(wagmiConfig, { chainId }) + const allowance = await publicClient.readContract({ + address: token, + abi: erc20Abi, + functionName: 'allowance', + args: [address, spender], + }) + if (allowance < requiredAmount) { + return { + to: token, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: 'approve', + args: [spender, maxUint256], + }), + value: 0n, + } + } + return null +} From 6121cf19dfdf26a3f70ce0f0c76332753b399f49 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 23 Jun 2025 10:12:21 -0300 Subject: [PATCH 51/85] chore: add rate limit and universal statuses --- package-lock.json | 69 +++++++- package.json | 1 + .../index-dtf/issuance/async-swaps/atom.ts | 4 +- .../issuance/async-swaps/collaterals.tsx | 58 ++++--- .../async-swaps/hooks/useQuoteSignatures.ts | 151 +++++++++--------- .../async-swaps/hooks/useUniversalOrder.ts | 64 ++++++++ .../issuance/async-swaps/hooks/utils.ts | 13 +- .../async-swaps/providers/universal.ts | 1 - .../issuance/async-swaps/success.tsx | 6 +- .../index-dtf/issuance/async-swaps/types.ts | 3 +- .../issuance/async-swaps/universal-order.tsx | 138 ++++++++++++++++ 11 files changed, 395 insertions(+), 113 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts create mode 100644 src/views/index-dtf/issuance/async-swaps/universal-order.tsx diff --git a/package-lock.json b/package-lock.json index 8d473e5c1..a54f50181 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,6 +59,7 @@ "lucide-react": "^0.461.0", "mixpanel-browser": "2.56.0", "next-themes": "^0.4.4", + "p-limit": "^6.2.0", "react": "18.3.1", "react-dom": "18.3.1", "react-dropzone": "^14.3.5", @@ -17709,15 +17710,27 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17736,6 +17749,22 @@ "node": ">=6" } }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -19236,6 +19265,21 @@ "node": ">=8" } }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -22845,6 +22889,21 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yargs/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", diff --git a/package.json b/package.json index 1df78144b..18a01a427 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "lucide-react": "^0.461.0", "mixpanel-browser": "2.56.0", "next-themes": "^0.4.4", + "p-limit": "^6.2.0", "react": "18.3.1", "react-dom": "18.3.1", "react-dropzone": "^14.3.5", diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index e889604f9..e454c3aae 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -6,7 +6,7 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther, parseUnits } from 'viem' -import { AsyncSwapOrderResponse, QuoteAggregated } from './types' +import { AsyncSwapOrderResponse, QuoteAggregated, QuoteProvider } from './types' const ASYNC_SWAP_BUFFER = 0.005 @@ -17,7 +17,7 @@ export const indexDTFBalanceAtom = atom(0n) export const txHashAtom = atom(undefined) // tx hash for minting or redeeming export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) -export const orderIdsAtom = atom([]) +export const orderIdsAtom = atom<{ id: string; provider: QuoteProvider }[]>([]) export const asyncSwapResponseAtom = atom( undefined ) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 06e6e0cec..a0db1c218 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -1,4 +1,5 @@ import { cn } from '@/lib/utils' +import { OrderStatus } from '@cowprotocol/cow-sdk' import { atom, useAtom, useAtomValue } from 'jotai' import { useEffect, useMemo } from 'react' import { @@ -7,14 +8,19 @@ import { orderIdsAtom, } from './atom' import CowSwapOrder from './cowswap-order' -import { OrderStatus } from '@cowprotocol/cow-sdk' +import { UniversalOrderStatus } from './hooks/useUniversalOrder' +import { QuoteProvider } from './types' +import UniversalOrder from './universal-order' -const STATUS_PRIORITY: Record = { - cancelled: 0, - expired: 0, - presignaturePending: 1, - open: 1, - fulfilled: 2, +const STATUS_PRIORITY: Record = { + [OrderStatus.CANCELLED]: 0, + [OrderStatus.EXPIRED]: 0, + [OrderStatus.PRESIGNATURE_PENDING]: 1, + [OrderStatus.OPEN]: 1, + [OrderStatus.FULFILLED]: 2, + [UniversalOrderStatus.FAILED]: 0, + [UniversalOrderStatus.PENDING]: 1, + [UniversalOrderStatus.SUCCESS]: 2, } const isVisibleAtom = atom(false) @@ -44,21 +50,29 @@ const Collaterals = () => { } }, [asyncSwapResponse, open, setIsVisible, setShouldRender]) - const { cowswapOrders = [] } = asyncSwapResponse || {} + const { cowswapOrders = [], universalOrders = [] } = asyncSwapResponse || {} const sortedOrderIds = useMemo( () => - orderIDs.sort((a, b) => { - const orderA = cowswapOrders.find((o) => o.orderId === a) - const orderB = cowswapOrders.find((o) => o.orderId === b) + orderIDs + .filter((o) => o.provider === QuoteProvider.CowSwap) + .sort((a, b) => { + const orderA = + cowswapOrders.find((o) => o.orderId === a.id) || + universalOrders.find((o) => o.id === a.id) + const orderB = + cowswapOrders.find((o) => o.orderId === b.id) || + universalOrders.find((o) => o.id === b.id) - if (!orderA?.status || !orderB?.status) return 0 + if (!orderA?.status || !orderB?.status) return 0 - return ( - (STATUS_PRIORITY[orderA.status] ?? 0) - - (STATUS_PRIORITY[orderB.status] ?? 0) - ) - }), + const orderAPriority = + STATUS_PRIORITY[orderA.status as OrderStatus | UniversalOrderStatus] + const orderBPriority = + STATUS_PRIORITY[orderB.status as OrderStatus | UniversalOrderStatus] + + return orderAPriority - orderBPriority + }), [cowswapOrders] ) @@ -71,9 +85,13 @@ const Collaterals = () => { isVisible ? 'w-[400px]' : 'w-0' )} > - {sortedOrderIds.map((orderId) => ( - - ))} + {sortedOrderIds.map((order) => + order.provider === QuoteProvider.CowSwap ? ( + + ) : order.provider === QuoteProvider.Universal ? ( + + ) : null + )}
) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index cfe625e4e..b4a68e090 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -10,17 +10,17 @@ import { } from '@cowprotocol/cow-sdk' import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import pLimit from 'p-limit' import { generateTypedData, OrderRequest } from 'universal-sdk' import { Address, encodeFunctionData, - erc20Abi, Hex, maxUint256, parseEther, parseUnits, } from 'viem' -import { usePublicClient, useSendCalls, useSignTypedData } from 'wagmi' +import { useSendCalls, useSignTypedData } from 'wagmi' import { asyncSwapResponseAtom, failedOrdersAtom, @@ -56,6 +56,8 @@ export function useQuoteSignatures(refresh = false) { const failedOrders = useAtomValue(failedOrdersAtom) const { signTypedDataAsync } = useSignTypedData() + const limiter = pLimit(1) + return useMutation({ mutationFn: async () => { if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { @@ -72,6 +74,7 @@ export function useQuoteSignatures(refresh = false) { console.log({ successfulQuotes }) if (successfulQuotes.length === 0) { + // TODO: handle this return { orders: [], } @@ -80,7 +83,7 @@ export function useQuoteSignatures(refresh = false) { // Generate order IDs and hashed messages for all quotes const orderData = await Promise.all( successfulQuotes.map(async (quote) => { - if (quote.success && quote.type === QuoteProvider.CowSwap) { + if (quote.type === QuoteProvider.CowSwap) { if (quote.data.quote.sellAmount === '0') { return null } @@ -138,7 +141,7 @@ export function useQuoteSignatures(refresh = false) { } } - if (quote.success && quote.type === QuoteProvider.Universal) { + if (quote.type === QuoteProvider.Universal) { const uq = quote.data as CustomUniversalQuote return { @@ -149,27 +152,23 @@ export function useQuoteSignatures(refresh = false) { }, } } - - return null }) ) - const validOrderData = orderData.filter((data) => data !== null) + const validOrderData = orderData.filter((data) => !!data) - const txData = validOrderData - .map(({ type, data }) => { + const txData = await Promise.all( + validOrderData.map(async ({ type, data }) => { if (type === QuoteProvider.CowSwap) { return [ operation === 'redeem' - ? { - to: data.sellToken as Address, - data: encodeFunctionData({ - abi: erc20Abi, - functionName: 'approve', - args: [COWSWAP_VAULT, BigInt(data.amount as string)], - }), - value: 0n, - } + ? await getApprovalCallIfNeeded({ + chainId, + address: address, + token: data.sellToken as Address, + requiredAmount: BigInt(data.amount as string), + spender: COWSWAP_VAULT, + }) : null, { to: COWSWAP_SETTLEMENT, @@ -179,25 +178,21 @@ export function useQuoteSignatures(refresh = false) { ].filter((e) => e !== null) } - // TODO: redeem - // if (type === QuoteProvider.Universal) { - // return [ - // { - // to: data.sellToken as Address, - // data: encodeFunctionData({ - // abi: erc20Abi, - // functionName: 'approve', - // args: [UNIVERSAL_PERMIT2, maxUint256], - // }), - // value: 0n, - // }, - // ] - // } + if (operation === 'redeem' && type === QuoteProvider.Universal) { + return [ + await await getApprovalCallIfNeeded({ + chainId, + address: address, + token: data.sellToken as Address, + requiredAmount: BigInt(data.amount as string), + spender: UNIVERSAL_PERMIT2, + }), + ].filter((e) => e !== null) + } return null }) - .filter((data) => data !== null) - .flat() + ).then((results) => results.filter((data) => data !== null).flat()) if (operation === 'mint') { const requiredAmount = parseUnits(inputAmount, quoteToken.decimals) @@ -207,6 +202,7 @@ export function useQuoteSignatures(refresh = false) { address: address as Address, token: quoteToken.address as Address, requiredAmount, + approvalAmount: maxUint256, spender, }) if (approvalCall) txData.unshift(approvalCall) @@ -226,51 +222,58 @@ export function useQuoteSignatures(refresh = false) { // I wonder if this is better suited for a different hook tbh // TODO: Create an order Index which is independently managed - const orderIds = await Promise.all( - validOrderData - .filter((e) => e != null) - .map(async ({ type, data }) => { - if (type === QuoteProvider.CowSwap) { - const order = data.quote as OrderCreation - const e = await orderBookApi.sendOrder({ - ...order, - from: address, - signature: address, - signingScheme: SigningScheme.PRESIGN, + const orderIds = ( + await Promise.all( + validOrderData + .filter((e) => e != null) + .map(({ type, data }) => + limiter(async () => { + if (type === QuoteProvider.CowSwap) { + const order = data.quote as OrderCreation + const e = await orderBookApi.sendOrder({ + ...order, + from: address, + signature: address, + signingScheme: SigningScheme.PRESIGN, + }) + return { + id: e, + provider: QuoteProvider.CowSwap, + } + } else { + if (type === QuoteProvider.Universal) { + const quote = data.quote as OrderRequest + const { typedData } = await generateTypedData(quote) + const _typedData = convertTypeDataToBigInt(typedData) + const signature = await signTypedDataAsync(_typedData) + try { + const universalOrder = await universalSdk.submitOrder({ + ...quote, + signature, + }) + return { + id: universalOrder.order_id, + provider: QuoteProvider.Universal, + } + } catch (error) { + console.error(error) + // TODO: handle this + return undefined + } + } + } }) - console.log(data, e) - return e - } else { - if (type === QuoteProvider.Universal) { - const quote = data.quote as OrderRequest - const { typedData } = await generateTypedData(quote) - - // Prompt Safe for signature - console.log({ typedData }) - const _typedData = convertTypeDataToBigInt(typedData) - - console.log({ _typedData }) - const signature = await signTypedDataAsync(_typedData) - console.log({ signature }) - // Submit order with signature - const universalOrder = await universalSdk.submitOrder({ - ...quote, - signature, - }) - console.log(data, universalOrder) - return universalOrder.order_id - } - } - }) - ) + ) + ) + ).filter((order) => order !== undefined) if (refresh) { // replace failed orders with new ones setOrderIDs((prev) => [ ...prev.filter( - (id) => !failedOrders.map((o) => o.orderId).includes(id) + (order) => !failedOrders.map((o) => o.orderId).includes(order.id) ), - ...orderIds.filter((id) => id !== undefined), + ...orderIds, ]) setAsyncSwapResponse((prev) => { if (!prev) return undefined @@ -283,7 +286,7 @@ export function useQuoteSignatures(refresh = false) { } }) } else { - setOrderIDs(orderIds.filter((id) => id !== undefined)) + setOrderIDs(orderIds) setAsyncSwapResponse({ swapOrderId: uuidv4(), chainId, @@ -299,7 +302,7 @@ export function useQuoteSignatures(refresh = false) { setQuotes({}) return { - orders: orderIds.filter((id) => id !== undefined), + orders: orderIds, } }, onError(error) { diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts new file mode 100644 index 000000000..2ee8ec611 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts @@ -0,0 +1,64 @@ +import { useQuery } from '@tanstack/react-query' +import { useSetAtom } from 'jotai' +import { asyncSwapResponseAtom } from '../atom' +import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' + +export enum UniversalOrderStatus { + PENDING = 'pending', + SUCCESS = 'success', + FAILED = 'failed', +} + +interface UseUniversalOrderParams { + orderId: string +} + +export function useUniversalOrder({ orderId }: UseUniversalOrderParams) { + const { universalSdk } = useGlobalProtocolKit() + const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + + return useQuery({ + queryKey: ['order/status', orderId], + enabled: !!orderId && !!universalSdk, + queryFn: async () => { + if (!universalSdk) { + throw new Error('UniversalSdk not initialized') + } + + const orders = await universalSdk.getOrders({ order_id: orderId }) + const order = orders.data[0] + if (!order) { + return undefined + } + + setAsyncSwapResponse((prev) => { + if (!prev) { + return undefined + } + + return { + ...prev, + universalOrders: [ + ...(prev?.universalOrders.filter((o) => o.id !== orderId) || []), + { ...order }, + ], + } + }) + + return order + }, + refetchInterval(query) { + if (query.state.data) { + if ( + [UniversalOrderStatus.SUCCESS, UniversalOrderStatus.FAILED].includes( + query.state.data?.status as UniversalOrderStatus + ) + ) { + return false + } + } + + return 3_000 + }, + }) +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts index d47f4433b..fbc734a44 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -1,13 +1,6 @@ import { wagmiConfig } from '@/state/chain' import { AvailableChain } from '@/utils/chains' -import { - erc20Abi, - encodeFunctionData, - maxUint256, - parseUnits, - Address, - Hex, -} from 'viem' +import { Address, encodeFunctionData, erc20Abi, Hex } from 'viem' import { getPublicClient } from 'wagmi/actions' export function convertTypeDataToBigInt(obj: any, isInDomain = false): any { @@ -47,12 +40,14 @@ export async function getApprovalCallIfNeeded({ address, token, requiredAmount, + approvalAmount = requiredAmount, spender, }: { chainId: AvailableChain address: Address token: Address requiredAmount: bigint + approvalAmount?: bigint spender: Address }): Promise<{ to: Address; data: Hex; value: bigint } | null> { const publicClient = getPublicClient(wagmiConfig, { chainId }) @@ -68,7 +63,7 @@ export async function getApprovalCallIfNeeded({ data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', - args: [spender, maxUint256], + args: [spender, approvalAmount], }), value: 0n, } diff --git a/src/views/index-dtf/issuance/async-swaps/providers/universal.ts b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts index 016016681..a95c224ae 100644 --- a/src/views/index-dtf/issuance/async-swaps/providers/universal.ts +++ b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts @@ -1,4 +1,3 @@ -import { Token } from '@/types' import { RateLimiter } from 'limiter' import { Quote, TokenName, UniversalRelayerSDK } from 'universal-sdk' import { TokenAddresses } from 'universal-sdk/dist/config' diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index f63046ba7..3613a3d54 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -38,6 +38,7 @@ import { } from './atom' import CowSwapOrder from './cowswap-order' import Details from './details' +import UniversalOrder from './universal-order' const viewTransactionsAtom = atom(false) @@ -320,7 +321,7 @@ const MainTransaction = () => { const Transactions = () => { const setViewTransactions = useSetAtom(viewTransactionsAtom) const orders = useAtomValue(asyncSwapResponseAtom) - const { cowswapOrders = [] } = orders || {} + const { cowswapOrders = [], universalOrders = [] } = orders || {} return (
@@ -344,6 +345,9 @@ const Transactions = () => { {cowswapOrders.map(({ orderId }) => ( ))} + {universalOrders.map(({ id }) => ( + + ))}
diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index ebc9104a8..fc36a2a83 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,5 +1,6 @@ import { Token } from '@/types' import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' +import { Order as UniversalOrder } from 'universal-sdk' import { Address } from 'viem' export enum QuoteProvider { @@ -32,7 +33,7 @@ export type AsyncSwapOrderResponse = { dtf: Address inputAmount: string amountOut: string - universalOrders: any[] // TODO: review it + universalOrders: UniversalOrder[] cowswapOrders: (EnrichedOrder & { orderId: string })[] createdAt: string } diff --git a/src/views/index-dtf/issuance/async-swaps/universal-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx new file mode 100644 index 000000000..5bc39b0eb --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx @@ -0,0 +1,138 @@ +import TokenLogo from '@/components/token-logo' +import Help from '@/components/ui/help' +import { Skeleton } from '@/components/ui/skeleton' +import { cn } from '@/lib/utils' +import { chainIdAtom } from '@/state/atoms' +import { indexDTFBasketAtom } from '@/state/dtf/atoms' +import { formatCurrency, formatTokenAmount } from '@/utils' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { useAtomValue } from 'jotai' +import { ArrowUpRight, Check, Loader } from 'lucide-react' +import { useMemo } from 'react' +import { Link } from 'react-router-dom' +import { formatUnits } from 'viem' +import { operationAtom } from './atom' +import { + UniversalOrderStatus, + useUniversalOrder, +} from './hooks/useUniversalOrder' + +const STATUS_MAP: Record = { + [UniversalOrderStatus.PENDING]: 'Processing', + [UniversalOrderStatus.SUCCESS]: 'Order Filled', + [UniversalOrderStatus.FAILED]: 'Not Filled', +} + +const OrderStatus = ({ + status, + hash, +}: { + status: UniversalOrderStatus + hash: string +}) => { + const chainId = useAtomValue(chainIdAtom) + + return ( +
+ {STATUS_MAP[status] === 'Order Filled' && ( + + )} + {STATUS_MAP[status] === 'Processing' && ( + + )} + {STATUS_MAP[status]} + {STATUS_MAP[status] === 'Not Filled' && ( + + )} + + + +
+ ) +} + +const UniversalOrder = ({ orderId }: { orderId: string }) => { + const { data } = useUniversalOrder({ orderId }) + const operation = useAtomValue(operationAtom) + const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + + const { token, firstAmount, secondAmount } = useMemo(() => { + return operation === 'redeem' + ? { + token: data?.token, + firstAmount: data?.token_amount, + secondAmount: data?.pair_token_amount, + } + : { + token: data?.pair_token, + firstAmount: data?.pair_token_amount, + secondAmount: data?.token_amount, + } + }, [data, operation]) + + return ( +
+
+ t.address === token)?.symbol || '' + } + size="xl" + /> +
+ {secondAmount ? ( +
+ {operation === 'mint' ? '-' : '+'}{' '} + {formatCurrency(Number(formatUnits(BigInt(secondAmount), 6)))}{' '} + USDC +
+ ) : ( + + )} + {firstAmount ? ( +
+ {operation === 'mint' ? '+' : '-'}{' '} + {formatTokenAmount( + Number( + formatUnits( + BigInt(firstAmount), + indexDTFBasket?.find((t) => t.address === token) + ?.decimals || 18 + ) + ) + )}{' '} + {indexDTFBasket?.find((t) => t.address === token)?.symbol || ''} +
+ ) : ( + + )} +
+
+ {data?.status ? ( + + ) : ( + + )} +
+ ) +} + +export default UniversalOrder From 0f6291be3a9d842a2f2d8e28f08f26eae355a52a Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 23 Jun 2025 11:30:01 -0300 Subject: [PATCH 52/85] fix: collaterals view --- .../index-dtf/issuance/async-swaps/atom.ts | 3 + .../issuance/async-swaps/collaterals.tsx | 32 ++++---- .../issuance/async-swaps/hooks/useQuote.ts | 39 ++++++++- .../async-swaps/hooks/useQuoteSignatures.ts | 23 ++++-- .../issuance/async-swaps/hooks/utils.ts | 19 +++++ .../async-swaps/universal-failed-order.tsx | 80 +++++++++++++++++++ 6 files changed, 170 insertions(+), 26 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index e454c3aae..9c92815e1 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -7,6 +7,7 @@ import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther, parseUnits } from 'viem' import { AsyncSwapOrderResponse, QuoteAggregated, QuoteProvider } from './types' +import { Quote } from 'universal-sdk' const ASYNC_SWAP_BUFFER = 0.005 @@ -129,3 +130,5 @@ export const hasAllCollateralsAtom = atom((get) => { ) ) }) + +export const universalFailedSubmittedQuotesAtom = atom([]) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index a0db1c218..ae0da6f48 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -54,26 +54,24 @@ const Collaterals = () => { const sortedOrderIds = useMemo( () => - orderIDs - .filter((o) => o.provider === QuoteProvider.CowSwap) - .sort((a, b) => { - const orderA = - cowswapOrders.find((o) => o.orderId === a.id) || - universalOrders.find((o) => o.id === a.id) - const orderB = - cowswapOrders.find((o) => o.orderId === b.id) || - universalOrders.find((o) => o.id === b.id) + orderIDs.sort((a, b) => { + const orderA = + cowswapOrders.find((o) => o.orderId === a.id) || + universalOrders.find((o) => o.id === a.id) + const orderB = + cowswapOrders.find((o) => o.orderId === b.id) || + universalOrders.find((o) => o.id === b.id) - if (!orderA?.status || !orderB?.status) return 0 + if (!orderA?.status || !orderB?.status) return 0 - const orderAPriority = - STATUS_PRIORITY[orderA.status as OrderStatus | UniversalOrderStatus] - const orderBPriority = - STATUS_PRIORITY[orderB.status as OrderStatus | UniversalOrderStatus] + const orderAPriority = + STATUS_PRIORITY[orderA.status as OrderStatus | UniversalOrderStatus] + const orderBPriority = + STATUS_PRIORITY[orderB.status as OrderStatus | UniversalOrderStatus] - return orderAPriority - orderBPriority - }), - [cowswapOrders] + return orderAPriority - orderBPriority + }), + [cowswapOrders, universalOrders] ) if (!shouldRender) return null diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index fc32b61b5..31e081c71 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -11,7 +11,7 @@ import { import { useQuery } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' -import { Address, parseEther, zeroAddress } from 'viem' +import { Address, formatUnits, parseEther, zeroAddress } from 'viem' import { applyWalletBalanceAtom, failedOrdersAtom, @@ -33,6 +33,22 @@ import { } from '../providers/universal' import { QuoteProvider } from '../types' import { useFolioDetails } from './useFolioDetails' +import { getAssetPrice } from './utils' + +const MIN_UNIVERSAL_QUOTE_VALUE_USD = 2 + +async function getQuoteValue( + chainId: number, + buyToken: Address, + amount: bigint, + decimals: number +) { + const assetPrice = await getAssetPrice(chainId, buyToken) + if (!assetPrice) { + return undefined + } + return Number(formatUnits(amount, decimals)) * assetPrice.price || undefined +} async function getQuote({ sellToken, @@ -42,6 +58,7 @@ async function getQuote({ operation, orderBookApi, universalSdk, + quoteValue, }: { sellToken: Address buyToken: Address @@ -50,6 +67,7 @@ async function getQuote({ operation: 'redeem' | 'mint' orderBookApi: OrderBookApi universalSdk: UniversalRelayerWithRateLimiter + quoteValue?: number }) { if ( !address || @@ -68,7 +86,8 @@ async function getQuote({ // Try Universal first if available if (universalSdk) { const universalAsset = getUniversalTokenName(buyToken) - if (universalAsset) { + const hasMinValue = quoteValue && quoteValue > MIN_UNIVERSAL_QUOTE_VALUE_USD + if (universalAsset && hasMinValue) { try { const universalQuote = await universalSdk.getQuote({ type: 'BUY', @@ -177,6 +196,12 @@ export const useQuotesForMint = () => { } try { + const quoteValue = await getQuoteValue( + chainId, + token.address, + amount, + token.decimals + ) return await getQuote({ sellToken: selectedToken.address, buyToken: token.address, @@ -185,6 +210,7 @@ export const useQuotesForMint = () => { operation: 'mint', orderBookApi, universalSdk, + quoteValue, }) } catch (error) { console.error(`Error getting quote for ${asset}:`, error) @@ -250,6 +276,7 @@ export const useQuotesForMint = () => { } export const useQuotesForRedeem = () => { + const chainId = useAtomValue(chainIdAtom) const selectedToken = useAtomValue(selectedTokenAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) const address = useAtomValue(walletAtom) @@ -289,6 +316,12 @@ export const useQuotesForRedeem = () => { } try { + const quoteValue = await getQuoteValue( + chainId, + token.address, + amount, + token.decimals + ) return await getQuote({ sellToken: token.address, buyToken: selectedToken.address, @@ -297,6 +330,7 @@ export const useQuotesForRedeem = () => { operation: 'redeem', orderBookApi, universalSdk, + quoteValue, }) } catch (error) { console.error(`Error getting quote for ${asset}:`, error) @@ -371,6 +405,7 @@ export const useRefreshQuotes = () => { } const quotePromises = failedOrders.map(async (order) => { + // TODO: get quote value (?) return await getQuote({ sellToken: order.sellToken as Address, buyToken: order.buyToken as Address, diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index b4a68e090..c15480e97 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -29,6 +29,7 @@ import { orderIdsAtom, quotesAtom, selectedTokenAtom, + universalFailedSubmittedQuotesAtom, userInputAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' @@ -51,6 +52,9 @@ export function useQuoteSignatures(refresh = false) { const [quotes, setQuotes] = useAtom(quotesAtom) const setOrderIDs = useSetAtom(orderIdsAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + const setUniversalFailedSubmittedQuotes = useSetAtom( + universalFailedSubmittedQuotesAtom + ) const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) @@ -210,13 +214,15 @@ export function useQuoteSignatures(refresh = false) { } // TODO: tx confirmation checks - const txBundle = await sendCallsAsync({ - calls: txData, - account: address, - forceAtomic: true, - }) + if (txData.length > 0) { + const txBundle = await sendCallsAsync({ + calls: txData, + account: address, + forceAtomic: true, + }) - console.log({ txBundle }) + console.log({ txBundle }) + } // TODO: Wait here until Safe tx is onchain // I wonder if this is better suited for a different hook tbh @@ -257,7 +263,10 @@ export function useQuoteSignatures(refresh = false) { } } catch (error) { console.error(error) - // TODO: handle this + setUniversalFailedSubmittedQuotes((prev) => [ + ...prev, + quote, + ]) return undefined } } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts index fbc734a44..d2fce30cb 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -1,5 +1,6 @@ import { wagmiConfig } from '@/state/chain' import { AvailableChain } from '@/utils/chains' +import { RESERVE_API } from '@/utils/constants' import { Address, encodeFunctionData, erc20Abi, Hex } from 'viem' import { getPublicClient } from 'wagmi/actions' @@ -70,3 +71,21 @@ export async function getApprovalCallIfNeeded({ } return null } + +type TokenPrice = { + address: Address + price: number + timestamp: number + source: string +} + +export async function getAssetPrice( + chainId: number, + token: Address +): Promise { + const response = await fetch( + `${RESERVE_API}current/prices?tokens=${token}&chainId=${chainId}` + ) + const data = (await response.json()) as TokenPrice[] + return data[0] +} diff --git a/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx new file mode 100644 index 000000000..fe76ab8ac --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx @@ -0,0 +1,80 @@ +import TokenLogo from '@/components/token-logo' +import Help from '@/components/ui/help' +import { Skeleton } from '@/components/ui/skeleton' +import { indexDTFBasketAtom } from '@/state/dtf/atoms' +import { formatCurrency, formatTokenAmount } from '@/utils' +import { useAtomValue } from 'jotai' +import { useMemo } from 'react' +import { Quote } from 'universal-sdk' +import { formatUnits } from 'viem' +import { operationAtom } from './atom' + +const UniversalFailedOrder = ({ quote }: { quote: Quote }) => { + const operation = useAtomValue(operationAtom) + const indexDTFBasket = useAtomValue(indexDTFBasketAtom) + + const { token, firstAmount, secondAmount } = useMemo(() => { + return operation === 'redeem' + ? { + token: quote.token, + firstAmount: quote.token_amount, + secondAmount: quote.pair_token_amount, + } + : { + token: quote.pair_token, + firstAmount: quote.pair_token_amount, + secondAmount: quote.token_amount, + } + }, [quote, operation]) + + return ( +
+
+ t.address === token)?.symbol || '' + } + size="xl" + /> +
+ {secondAmount ? ( +
+ {operation === 'mint' ? '-' : '+'}{' '} + {formatCurrency(Number(formatUnits(BigInt(secondAmount), 6)))}{' '} + USDC +
+ ) : ( + + )} + {firstAmount ? ( +
+ {operation === 'mint' ? '+' : '-'}{' '} + {formatTokenAmount( + Number( + formatUnits( + BigInt(firstAmount), + indexDTFBasket?.find((t) => t.address === token) + ?.decimals || 18 + ) + ) + )}{' '} + {indexDTFBasket?.find((t) => t.address === token)?.symbol || ''} +
+ ) : ( + + )} +
+
+
+ Not Filled + +
+
+ ) +} + +export default UniversalFailedOrder From 006f212b252e21ec6bfbe35cbf9e061c38eddbf6 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Mon, 23 Jun 2025 13:04:52 -0300 Subject: [PATCH 53/85] chore: working universal mint --- .../issuance/async-swaps/async-mint/index.tsx | 2 +- .../async-mint/submit-mint-orders.tsx | 78 ++++++++------- .../index-dtf/issuance/async-swaps/atom.ts | 10 +- .../issuance/async-swaps/collaterals.tsx | 55 +++++------ .../async-swaps/hooks/useQuoteSignatures.ts | 37 ++++--- .../async-swaps/hooks/useUniversalOrder.ts | 64 ------------ .../issuance/async-swaps/success.tsx | 8 +- .../index-dtf/issuance/async-swaps/types.ts | 8 +- .../issuance/async-swaps/universal-order.tsx | 99 ++++++------------- 9 files changed, 141 insertions(+), 220 deletions(-) delete mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index 8c0ef3e58..39d479797 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -21,9 +21,9 @@ import { userInputAtom, } from '../atom' import CollateralAcquisition from '../collateral-acquisition' +import Details from '../details' import { useQuotesForMint } from '../hooks/useQuote' import SubmitMint from './submit-mint-orders' -import Details from '../details' const AsyncMint = () => { const chainId = useAtomValue(chainIdAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 3364d72ee..2507be862 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -9,43 +9,55 @@ type SubmitMintProps = { insufficientBalance?: boolean } -const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { - const inputAmount = useAtomValue(userInputAtom) +const SubmitMintButton = ({ + mutate, + isPending, + loadingQuote, +}: { + mutate: () => void + isPending: boolean + loadingQuote?: boolean +}) => { const insufficientBalance = useAtomValue(insufficientBalanceAtom) - const { data, mutate, isPending } = useQuoteSignatures() - + const inputAmount = useAtomValue(userInputAtom) const disabled = - isPending || - loadingQuote || - !inputAmount || - isNaN(Number(inputAmount)) || - insufficientBalance + isPending || loadingQuote || !inputAmount || isNaN(Number(inputAmount)) + + return ( + + ) +} + +const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { + const { mutate, isPending } = useQuoteSignatures() return ( -
- -
+ ) } diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 9c92815e1..16cb78d7b 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -6,7 +6,12 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Address, parseEther, parseUnits } from 'viem' -import { AsyncSwapOrderResponse, QuoteAggregated, QuoteProvider } from './types' +import { + AsyncSwapOrderResponse, + QuoteAggregated, + QuoteProvider, + UniversalOrder, +} from './types' import { Quote } from 'universal-sdk' const ASYNC_SWAP_BUFFER = 0.005 @@ -131,4 +136,5 @@ export const hasAllCollateralsAtom = atom((get) => { ) }) -export const universalFailedSubmittedQuotesAtom = atom([]) +export const universalSuccessOrdersAtom = atom([]) +export const universalFailedOrdersAtom = atom([]) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index ae0da6f48..15afe123b 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -6,21 +6,20 @@ import { asyncSwapResponseAtom, openCollateralPanelAtom, orderIdsAtom, + universalFailedOrdersAtom, + universalSuccessOrdersAtom, } from './atom' import CowSwapOrder from './cowswap-order' -import { UniversalOrderStatus } from './hooks/useUniversalOrder' import { QuoteProvider } from './types' +import UniversalFailedOrder from './universal-failed-order' import UniversalOrder from './universal-order' -const STATUS_PRIORITY: Record = { +const STATUS_PRIORITY: Record = { [OrderStatus.CANCELLED]: 0, [OrderStatus.EXPIRED]: 0, [OrderStatus.PRESIGNATURE_PENDING]: 1, [OrderStatus.OPEN]: 1, [OrderStatus.FULFILLED]: 2, - [UniversalOrderStatus.FAILED]: 0, - [UniversalOrderStatus.PENDING]: 1, - [UniversalOrderStatus.SUCCESS]: 2, } const isVisibleAtom = atom(false) @@ -34,6 +33,8 @@ export const showCollateralsAtom = atom((get) => { const Collaterals = () => { const orderIDs = useAtomValue(orderIdsAtom) const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) + const universalFailedOrders = useAtomValue(universalFailedOrdersAtom) const open = useAtomValue(openCollateralPanelAtom) const [isVisible, setIsVisible] = useAtom(isVisibleAtom) const [shouldRender, setShouldRender] = useAtom(shouldRenderAtom) @@ -50,28 +51,24 @@ const Collaterals = () => { } }, [asyncSwapResponse, open, setIsVisible, setShouldRender]) - const { cowswapOrders = [], universalOrders = [] } = asyncSwapResponse || {} + const { cowswapOrders = [] } = asyncSwapResponse || {} const sortedOrderIds = useMemo( () => - orderIDs.sort((a, b) => { - const orderA = - cowswapOrders.find((o) => o.orderId === a.id) || - universalOrders.find((o) => o.id === a.id) - const orderB = - cowswapOrders.find((o) => o.orderId === b.id) || - universalOrders.find((o) => o.id === b.id) + orderIDs + .filter((o) => o.provider === QuoteProvider.CowSwap) + .sort((a, b) => { + const orderA = cowswapOrders.find((o) => o.orderId === a.id) + const orderB = cowswapOrders.find((o) => o.orderId === b.id) - if (!orderA?.status || !orderB?.status) return 0 + if (!orderA?.status || !orderB?.status) return 0 - const orderAPriority = - STATUS_PRIORITY[orderA.status as OrderStatus | UniversalOrderStatus] - const orderBPriority = - STATUS_PRIORITY[orderB.status as OrderStatus | UniversalOrderStatus] + const orderAPriority = STATUS_PRIORITY[orderA.status as OrderStatus] + const orderBPriority = STATUS_PRIORITY[orderB.status as OrderStatus] - return orderAPriority - orderBPriority - }), - [cowswapOrders, universalOrders] + return orderAPriority - orderBPriority + }), + [cowswapOrders] ) if (!shouldRender) return null @@ -83,13 +80,15 @@ const Collaterals = () => { isVisible ? 'w-[400px]' : 'w-0' )} > - {sortedOrderIds.map((order) => - order.provider === QuoteProvider.CowSwap ? ( - - ) : order.provider === QuoteProvider.Universal ? ( - - ) : null - )} + {sortedOrderIds.map((order) => ( + + ))} + {universalSuccessOrders.map((order) => ( + + ))} + {universalFailedOrders.map((quote) => ( + + ))}
) } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index c15480e97..9acacd916 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -29,7 +29,8 @@ import { orderIdsAtom, quotesAtom, selectedTokenAtom, - universalFailedSubmittedQuotesAtom, + universalFailedOrdersAtom, + universalSuccessOrdersAtom, userInputAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' @@ -52,9 +53,8 @@ export function useQuoteSignatures(refresh = false) { const [quotes, setQuotes] = useAtom(quotesAtom) const setOrderIDs = useSetAtom(orderIdsAtom) const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - const setUniversalFailedSubmittedQuotes = useSetAtom( - universalFailedSubmittedQuotesAtom - ) + const setUniversalFailedOrders = useSetAtom(universalFailedOrdersAtom) + const setUniversalSuccessOrders = useSetAtom(universalSuccessOrdersAtom) const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) @@ -257,16 +257,22 @@ export function useQuoteSignatures(refresh = false) { ...quote, signature, }) - return { - id: universalOrder.order_id, - provider: QuoteProvider.Universal, - } + + setUniversalSuccessOrders((prev) => { + return [ + ...prev, + { + ...quote, + orderId: universalOrder.order_id, + transactionHash: universalOrder.transaction_hash, + }, + ] + }) + + return undefined } catch (error) { console.error(error) - setUniversalFailedSubmittedQuotes((prev) => [ - ...prev, - quote, - ]) + setUniversalFailedOrders((prev) => [...prev, quote]) return undefined } } @@ -296,7 +302,7 @@ export function useQuoteSignatures(refresh = false) { }) } else { setOrderIDs(orderIds) - setAsyncSwapResponse({ + setAsyncSwapResponse((prev) => ({ swapOrderId: uuidv4(), chainId, signer: address, @@ -304,9 +310,8 @@ export function useQuoteSignatures(refresh = false) { inputAmount, amountOut: parseEther(mintValue.toString()).toString(), createdAt: new Date().toISOString(), - universalOrders: [], - cowswapOrders: [], - }) + cowswapOrders: prev?.cowswapOrders || [], + })) } setQuotes({}) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts deleted file mode 100644 index 2ee8ec611..000000000 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useUniversalOrder.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { useQuery } from '@tanstack/react-query' -import { useSetAtom } from 'jotai' -import { asyncSwapResponseAtom } from '../atom' -import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' - -export enum UniversalOrderStatus { - PENDING = 'pending', - SUCCESS = 'success', - FAILED = 'failed', -} - -interface UseUniversalOrderParams { - orderId: string -} - -export function useUniversalOrder({ orderId }: UseUniversalOrderParams) { - const { universalSdk } = useGlobalProtocolKit() - const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) - - return useQuery({ - queryKey: ['order/status', orderId], - enabled: !!orderId && !!universalSdk, - queryFn: async () => { - if (!universalSdk) { - throw new Error('UniversalSdk not initialized') - } - - const orders = await universalSdk.getOrders({ order_id: orderId }) - const order = orders.data[0] - if (!order) { - return undefined - } - - setAsyncSwapResponse((prev) => { - if (!prev) { - return undefined - } - - return { - ...prev, - universalOrders: [ - ...(prev?.universalOrders.filter((o) => o.id !== orderId) || []), - { ...order }, - ], - } - }) - - return order - }, - refetchInterval(query) { - if (query.state.data) { - if ( - [UniversalOrderStatus.SUCCESS, UniversalOrderStatus.FAILED].includes( - query.state.data?.status as UniversalOrderStatus - ) - ) { - return false - } - } - - return 3_000 - }, - }) -} diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 3613a3d54..366b63805 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -35,6 +35,7 @@ import { selectedTokenAtom, orderIdsAtom, quotesAtom, + universalSuccessOrdersAtom, } from './atom' import CowSwapOrder from './cowswap-order' import Details from './details' @@ -321,7 +322,8 @@ const MainTransaction = () => { const Transactions = () => { const setViewTransactions = useSetAtom(viewTransactionsAtom) const orders = useAtomValue(asyncSwapResponseAtom) - const { cowswapOrders = [], universalOrders = [] } = orders || {} + const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) + const { cowswapOrders = [] } = orders || {} return (
@@ -345,8 +347,8 @@ const Transactions = () => { {cowswapOrders.map(({ orderId }) => ( ))} - {universalOrders.map(({ id }) => ( - + {universalSuccessOrders.map((order) => ( + ))}
diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index fc36a2a83..0425b2705 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,6 +1,6 @@ import { Token } from '@/types' import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' -import { Order as UniversalOrder } from 'universal-sdk' +import { Quote } from 'universal-sdk' import { Address } from 'viem' export enum QuoteProvider { @@ -26,6 +26,11 @@ export type QuoteAggregated = data: unknown // TODO: Type Universal Quote Response } +export type UniversalOrder = Quote & { + orderId: string + transactionHash: string +} + export type AsyncSwapOrderResponse = { swapOrderId: string chainId: number @@ -33,7 +38,6 @@ export type AsyncSwapOrderResponse = { dtf: Address inputAmount: string amountOut: string - universalOrders: UniversalOrder[] cowswapOrders: (EnrichedOrder & { orderId: string })[] createdAt: string } diff --git a/src/views/index-dtf/issuance/async-swaps/universal-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx index 5bc39b0eb..dd477e103 100644 --- a/src/views/index-dtf/issuance/async-swaps/universal-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx @@ -1,90 +1,40 @@ import TokenLogo from '@/components/token-logo' -import Help from '@/components/ui/help' import { Skeleton } from '@/components/ui/skeleton' -import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' import { indexDTFBasketAtom } from '@/state/dtf/atoms' import { formatCurrency, formatTokenAmount } from '@/utils' import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' import { useAtomValue } from 'jotai' -import { ArrowUpRight, Check, Loader } from 'lucide-react' +import { ArrowUpRight, Check } from 'lucide-react' import { useMemo } from 'react' import { Link } from 'react-router-dom' import { formatUnits } from 'viem' import { operationAtom } from './atom' -import { - UniversalOrderStatus, - useUniversalOrder, -} from './hooks/useUniversalOrder' +import { UniversalOrder as UniversalOrderType } from './types' +import { getUniversalTokenAddress } from './providers/universal' -const STATUS_MAP: Record = { - [UniversalOrderStatus.PENDING]: 'Processing', - [UniversalOrderStatus.SUCCESS]: 'Order Filled', - [UniversalOrderStatus.FAILED]: 'Not Filled', -} - -const OrderStatus = ({ - status, - hash, -}: { - status: UniversalOrderStatus - hash: string -}) => { - const chainId = useAtomValue(chainIdAtom) - - return ( -
- {STATUS_MAP[status] === 'Order Filled' && ( - - )} - {STATUS_MAP[status] === 'Processing' && ( - - )} - {STATUS_MAP[status]} - {STATUS_MAP[status] === 'Not Filled' && ( - - )} - - - -
- ) -} - -const UniversalOrder = ({ orderId }: { orderId: string }) => { - const { data } = useUniversalOrder({ orderId }) +const UniversalOrder = ({ order }: { order: UniversalOrderType }) => { const operation = useAtomValue(operationAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) - + const chainId = useAtomValue(chainIdAtom) const { token, firstAmount, secondAmount } = useMemo(() => { return operation === 'redeem' ? { - token: data?.token, - firstAmount: data?.token_amount, - secondAmount: data?.pair_token_amount, + token: order?.pair_token, + firstAmount: order?.token_amount, + secondAmount: order?.pair_token_amount, } : { - token: data?.pair_token, - firstAmount: data?.pair_token_amount, - secondAmount: data?.token_amount, + token: getUniversalTokenAddress(order?.token), + firstAmount: order?.token_amount, + secondAmount: order?.pair_token_amount, } - }, [data, operation]) + }, [order, operation]) return (
{ )}
- {data?.status ? ( - - ) : ( - - )} +
+ + Order Filled + + + +
) } From 1d88d488dd995f8d6b1887a218fb8a8560ab68b8 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Tue, 24 Jun 2025 12:26:56 -0300 Subject: [PATCH 54/85] chore: universal refresh --- .../async-mint/submit-mint-orders.tsx | 40 ++-- .../issuance/async-swaps/collaterals.tsx | 10 +- .../issuance/async-swaps/hooks/useQuote.ts | 208 +++++++++++++----- .../async-swaps/hooks/useQuoteSignatures.ts | 9 + .../async-swaps/universal-failed-order.tsx | 13 +- 5 files changed, 194 insertions(+), 86 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 2507be862..748431275 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -3,6 +3,7 @@ import { cn } from '@/lib/utils' import { useQuoteSignatures } from '../hooks/useQuoteSignatures' import { insufficientBalanceAtom, userInputAtom } from '../atom' import { useAtomValue } from 'jotai' +import { useMemo } from 'react' type SubmitMintProps = { loadingQuote?: boolean @@ -20,8 +21,30 @@ const SubmitMintButton = ({ }) => { const insufficientBalance = useAtomValue(insufficientBalanceAtom) const inputAmount = useAtomValue(userInputAtom) - const disabled = - isPending || loadingQuote || !inputAmount || isNaN(Number(inputAmount)) + + const disabled = useMemo( + () => + isPending || loadingQuote || !inputAmount || isNaN(Number(inputAmount)), + [isPending, loadingQuote, inputAmount] + ) + + const buttonText = useMemo(() => { + if (loadingQuote) { + return 'Awaiting Quote' + } + if (isPending) { + return 'Signing...' + } + if (insufficientBalance) { + return 'Insufficient Balance' + } + return ( + + Start Mint + - Step 1/2 + + ) + }, [insufficientBalance, isPending, loadingQuote]) return ( ) } diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 15afe123b..f55c90a11 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -80,14 +80,14 @@ const Collaterals = () => { isVisible ? 'w-[400px]' : 'w-0' )} > + {universalFailedOrders.map((quote, index) => ( + + ))} {sortedOrderIds.map((order) => ( ))} - {universalSuccessOrders.map((order) => ( - - ))} - {universalFailedOrders.map((quote) => ( - + {universalSuccessOrders.map((order, index) => ( + ))}
) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 31e081c71..29c216217 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -22,6 +22,7 @@ import { redeemAssetsAtom, refetchQuotesAtom, selectedTokenAtom, + universalFailedOrdersAtom, } from '../atom' import { UniversalRelayerWithRateLimiter, @@ -50,15 +51,13 @@ async function getQuoteValue( return Number(formatUnits(amount, decimals)) * assetPrice.price || undefined } -async function getQuote({ +async function getCowswapQuote({ sellToken, buyToken, amount, address, operation, orderBookApi, - universalSdk, - quoteValue, }: { sellToken: Address buyToken: Address @@ -66,61 +65,7 @@ async function getQuote({ address: Address operation: 'redeem' | 'mint' orderBookApi: OrderBookApi - universalSdk: UniversalRelayerWithRateLimiter - quoteValue?: number }) { - if ( - !address || - address == zeroAddress || - buyToken == zeroAddress || - sellToken == zeroAddress || - !orderBookApi - ) { - throw new Error('getQuote: Invalid params') - } - - if (amount <= 0n) { - throw new Error('getQuote: Amount is 0') - } - - // Try Universal first if available - if (universalSdk) { - const universalAsset = getUniversalTokenName(buyToken) - const hasMinValue = quoteValue && quoteValue > MIN_UNIVERSAL_QUOTE_VALUE_USD - if (universalAsset && hasMinValue) { - try { - const universalQuote = await universalSdk.getQuote({ - type: 'BUY', - blockchain: 'BASE', - token: universalAsset, - pair_token: 'USDC', - user_address: address, - slippage_bips: 100, - token_amount: - universalAsset === 'SOL' - ? ((amount * 200n) / 100n).toString() - : amount.toString(), - }) - - const customQuote: CustomUniversalQuote = { - _originalQuote: universalQuote, - buyToken, - sellToken, - type: 'BUY', - userAddress: address, - sellAmount: BigInt(universalQuote.pair_token_amount ?? '0'), - buyAmount: amount, - validTo: Number(universalQuote.deadline ?? 0), - } - return customQuote - } catch (error) { - console.error(`Error getting universal quote:`, error) - // If Universal fails, continue with CowSwap - } - } - } - - // If no Universal or it failed, use CowSwap const quote = await orderBookApi.getQuote({ sellToken, buyToken, @@ -150,6 +95,117 @@ async function getQuote({ return quote } +async function getUniversalQuote({ + sellToken, + buyToken, + amount, + address, + operation, + universalSdk, +}: { + sellToken: Address + buyToken: Address + amount: bigint + address: Address + operation: 'redeem' | 'mint' + universalSdk: UniversalRelayerWithRateLimiter +}) { + try { + const universalAsset = getUniversalTokenName(buyToken) + const universalQuote = await universalSdk.getQuote({ + type: 'BUY', + blockchain: 'BASE', + token: universalAsset, + pair_token: 'USDC', + user_address: address, + slippage_bips: 100, + token_amount: + universalAsset === 'SOL' + ? ((amount * 200n) / 100n).toString() + : amount.toString(), + }) + + const customQuote: CustomUniversalQuote = { + _originalQuote: universalQuote, + buyToken, + sellToken, + type: 'BUY', + userAddress: address, + sellAmount: BigInt(universalQuote.pair_token_amount ?? '0'), + buyAmount: amount, + validTo: Number(universalQuote.deadline ?? 0), + } + return customQuote + } catch (error) { + console.error(`Error getting universal quote:`, error) + return null + } +} + +async function getQuote({ + sellToken, + buyToken, + amount, + address, + operation, + orderBookApi, + universalSdk, + quoteValue, +}: { + sellToken: Address + buyToken: Address + amount: bigint + address: Address + operation: 'redeem' | 'mint' + orderBookApi: OrderBookApi + universalSdk: UniversalRelayerWithRateLimiter + quoteValue?: number +}) { + if ( + !address || + address == zeroAddress || + buyToken == zeroAddress || + sellToken == zeroAddress || + !orderBookApi || + !universalSdk + ) { + throw new Error('getQuote: Invalid params') + } + + if (amount <= 0n) { + throw new Error('getQuote: Amount is 0') + } + + // Try Universal first if available + const universalAsset = getUniversalTokenName(buyToken) + const hasMinValue = quoteValue && quoteValue > MIN_UNIVERSAL_QUOTE_VALUE_USD + if (universalAsset && hasMinValue) { + const universalQuote = await getUniversalQuote({ + sellToken, + buyToken, + amount, + address, + operation, + universalSdk, + }) + + // If Universal fails, continue with CowSwap + if (universalQuote) { + return universalQuote + } + } + + // If no Universal or it failed, use CowSwap + return await getCowswapQuote({ + sellToken, + buyToken, + amount, + address, + operation, + orderBookApi, + }) +} + export const useQuotesForMint = () => { const chainId = useAtomValue(chainIdAtom) const selectedToken = useAtomValue(selectedTokenAtom) @@ -396,6 +452,9 @@ export const useRefreshQuotes = () => { const [quotes, setQuotes] = useAtom(quotesAtom) const operation = useAtomValue(operationAtom) const failedOrders = useAtomValue(failedOrdersAtom) + const failedUniversalOrders = useAtomValue(universalFailedOrdersAtom) + const selectedToken = useAtomValue(selectedTokenAtom) + const setUniversalFailedOrders = useSetAtom(universalFailedOrdersAtom) const query = useQuery({ queryKey: ['refresh-quotes', failedOrders], @@ -404,9 +463,9 @@ export const useRefreshQuotes = () => { return } + // Failed Cowswap quotes const quotePromises = failedOrders.map(async (order) => { - // TODO: get quote value (?) - return await getQuote({ + return await getCowswapQuote({ sellToken: order.sellToken as Address, buyToken: order.buyToken as Address, amount: BigInt( @@ -415,11 +474,36 @@ export const useRefreshQuotes = () => { address: address as Address, operation, orderBookApi, - universalSdk, }) }) - const results = await Promise.all(quotePromises) + // Failed Universal orders are retried through CowSwap as fallback + const universalQuotePromises = failedUniversalOrders.map( + async (order) => { + const token = getUniversalTokenName(order.token as Address) + const sellToken = + operation === 'redeem' ? token : selectedToken.address + const buyToken = + operation === 'redeem' ? selectedToken.address : token + const amount = + operation === 'redeem' + ? BigInt(order.token_amount ?? '0') + : BigInt(order.pair_token_amount ?? '0') + return await getCowswapQuote({ + sellToken: sellToken as Address, + buyToken: buyToken as Address, + amount, + address: address as Address, + operation, + orderBookApi, + }) + } + ) + + const results = await Promise.all([ + ...quotePromises, + ...universalQuotePromises, + ]) failedOrders.forEach((order, i) => { setQuotes((prev) => ({ @@ -432,6 +516,8 @@ export const useRefreshQuotes = () => { })) }) + setUniversalFailedOrders([]) + return quotes }, }) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 9acacd916..a1721fffa 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -63,6 +63,15 @@ export function useQuoteSignatures(refresh = false) { const limiter = pLimit(1) return useMutation({ + mutationKey: [ + 'quote-signatures', + chainId, + address, + operation, + JSON.stringify(quotes, (_, value) => + typeof value === 'bigint' ? value.toString() : value + ), + ], mutationFn: async () => { if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { console.error('No global kit') diff --git a/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx index fe76ab8ac..fd3db462b 100644 --- a/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx @@ -8,6 +8,7 @@ import { useMemo } from 'react' import { Quote } from 'universal-sdk' import { formatUnits } from 'viem' import { operationAtom } from './atom' +import { getUniversalTokenAddress } from './providers/universal' const UniversalFailedOrder = ({ quote }: { quote: Quote }) => { const operation = useAtomValue(operationAtom) @@ -16,14 +17,14 @@ const UniversalFailedOrder = ({ quote }: { quote: Quote }) => { const { token, firstAmount, secondAmount } = useMemo(() => { return operation === 'redeem' ? { - token: quote.token, - firstAmount: quote.token_amount, - secondAmount: quote.pair_token_amount, + token: quote?.pair_token, + firstAmount: quote?.token_amount, + secondAmount: quote?.pair_token_amount, } : { - token: quote.pair_token, - firstAmount: quote.pair_token_amount, - secondAmount: quote.token_amount, + token: getUniversalTokenAddress(quote?.token), + firstAmount: quote?.token_amount, + secondAmount: quote?.pair_token_amount, } }, [quote, operation]) From 2fe6350a7f0da6410e8524984ca5b6efc5258d49 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Tue, 24 Jun 2025 12:51:30 -0300 Subject: [PATCH 55/85] fix: refresh --- .../index-dtf/issuance/async-swaps/hooks/useQuote.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 29c216217..9a8c71279 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -30,6 +30,7 @@ import { } from '../providers/GlobalProtocolKitProvider' import { CustomUniversalQuote, + getUniversalTokenAddress, getUniversalTokenName, } from '../providers/universal' import { QuoteProvider } from '../types' @@ -480,15 +481,15 @@ export const useRefreshQuotes = () => { // Failed Universal orders are retried through CowSwap as fallback const universalQuotePromises = failedUniversalOrders.map( async (order) => { - const token = getUniversalTokenName(order.token as Address) + const token = getUniversalTokenAddress(order.token) const sellToken = operation === 'redeem' ? token : selectedToken.address const buyToken = operation === 'redeem' ? selectedToken.address : token const amount = operation === 'redeem' - ? BigInt(order.token_amount ?? '0') - : BigInt(order.pair_token_amount ?? '0') + ? BigInt(order.pair_token_amount ?? '0') + : BigInt(order.token_amount ?? '0') return await getCowswapQuote({ sellToken: sellToken as Address, buyToken: buyToken as Address, @@ -504,7 +505,7 @@ export const useRefreshQuotes = () => { ...quotePromises, ...universalQuotePromises, ]) - + console.log(results) failedOrders.forEach((order, i) => { setQuotes((prev) => ({ ...prev, From a5ae5bd58423da3ea95f3593a0e8a85b2a368af2 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Tue, 24 Jun 2025 20:54:05 -0300 Subject: [PATCH 56/85] chore: refactor async mint/redeem --- .../issuance/async-swaps/async-mint/index.tsx | 21 +- .../async-swaps/async-redeem/index.tsx | 17 +- .../index-dtf/issuance/async-swaps/atom.ts | 53 +++-- .../async-swaps/collateral-acquisition.tsx | 25 ++- .../issuance/async-swaps/collaterals.tsx | 47 +++-- .../async-swaps/hooks/useOrderStatus.ts | 21 +- .../issuance/async-swaps/hooks/useQuote.ts | 6 +- .../async-swaps/hooks/useQuoteSignatures.ts | 186 +++++++++--------- .../index-dtf/issuance/async-swaps/index.tsx | 8 +- .../issuance/async-swaps/success.tsx | 46 +++-- .../index-dtf/issuance/async-swaps/types.ts | 10 +- 11 files changed, 207 insertions(+), 233 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx index 39d479797..0f5218809 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/index.tsx @@ -10,12 +10,11 @@ import { indexDTFAtom } from '@/state/dtf/atoms' import { formatCurrencyCompact } from '@/utils' import { useAtom, useAtomValue } from 'jotai' import { - asyncSwapResponseAtom, collateralAcquiredAtom, - hasAllCollateralsAtom, isMintingAtom, mintValueAtom, mintValueUSDAtom, + ordersSubmittedAtom, selectedTokenAtom, selectedTokenBalanceAtom, userInputAtom, @@ -35,12 +34,10 @@ const AsyncMint = () => { const selectedTokenPrice = useChainlinkPrice(chainId, selectedToken.address) const inputValueUSD = (selectedTokenPrice || 0) * Number(inputAmount) const onMax = () => setInputAmount(selectedTokenBalance?.balance || '0') - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const ordersSubmitted = useAtomValue(ordersSubmittedAtom) const collateralAcquired = useAtomValue(collateralAcquiredAtom) - const orderSubmitted = !!asyncSwapResponse const amountOut = useAtomValue(mintValueAtom) const amountOutValue = useAtomValue(mintValueUSDAtom) - const hasAllCollaterals = useAtomValue(hasAllCollateralsAtom) const { isLoading, isFetching } = useQuotesForMint() @@ -61,17 +58,17 @@ const AsyncMint = () => { value: inputAmount, onChange: setInputAmount, onMax, - disabled: orderSubmitted, + disabled: ordersSubmitted, className: cn( 'rounded-3xl border-8 border-card', - orderSubmitted && 'border-background bg-background' + ordersSubmitted && 'border-background bg-background' ), }} /> { value: amountOut.toString(), className: cn( 'rounded-3xl border-8 border-card rounded-b-none pb-2', - orderSubmitted && 'border-background bg-background', + ordersSubmitted && 'border-background bg-background', collateralAcquired && !isMinting && 'border-card bg-card' ), }} @@ -96,9 +93,9 @@ const AsyncMint = () => { isMinting ? 'bg-background' : 'bg-card' )} > - {!orderSubmitted && } - {orderSubmitted && } - {!hasAllCollaterals &&
} + {!ordersSubmitted && } + {ordersSubmitted && } + {!collateralAcquired &&
}
) diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx index 318057f3b..821a45501 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/index.tsx @@ -16,10 +16,10 @@ import { useAtom, useAtomValue } from 'jotai' import { useMemo } from 'react' import { formatEther } from 'viem' import { - asyncSwapResponseAtom, collateralAcquiredAtom, indexDTFBalanceAtom, isMintingAtom, + ordersSubmittedAtom, redeemAssetsAtom, selectedTokenAtom, userInputAtom, @@ -73,9 +73,8 @@ const AsyncRedeem = () => { const indexDTFBalance = useAtomValue(indexDTFBalanceAtom) const indxDTFParsedBalance = formatEther(indexDTFBalance) const onMax = () => setInputAmount(indxDTFParsedBalance) - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const ordersSubmitted = useAtomValue(ordersSubmittedAtom) const collateralAcquired = useAtomValue(collateralAcquiredAtom) - const orderSubmitted = !!asyncSwapResponse const amountOut = inputPrice const amountOutValue = inputPrice const redeemAssets = useAtomValue(redeemAssetsAtom) @@ -107,10 +106,10 @@ const AsyncRedeem = () => { value: inputAmount, onChange: setInputAmount, onMax, - disabled: orderSubmitted, + disabled: ordersSubmitted, className: cn( 'rounded-3xl border-8 border-card', - orderSubmitted && 'border-background bg-background' + ordersSubmitted && 'border-background bg-background' ), }} /> @@ -118,7 +117,7 @@ const AsyncRedeem = () => { { value: amountOut.toString(), className: cn( 'rounded-3xl border-8 border-card rounded-b-none pb-2', - orderSubmitted && 'border-background bg-background', + ordersSubmitted && 'border-background bg-background', collateralAcquired && !isMinting && 'border-card bg-card' ), }} @@ -146,10 +145,10 @@ const AsyncRedeem = () => { )} > {!assetsRedeemed && } - {assetsRedeemed && !orderSubmitted && ( + {assetsRedeemed && !ordersSubmitted && ( )} - {orderSubmitted && } + {ordersSubmitted && }
) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 16cb78d7b..88b80411f 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -2,17 +2,16 @@ import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' -import { OrderStatus } from '@cowprotocol/cow-sdk' +import { EnrichedOrder, OrderStatus } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' +import { Quote } from 'universal-sdk' import { Address, parseEther, parseUnits } from 'viem' import { AsyncSwapOrderResponse, QuoteAggregated, - QuoteProvider, UniversalOrder, } from './types' -import { Quote } from 'universal-sdk' const ASYNC_SWAP_BUFFER = 0.005 @@ -23,13 +22,14 @@ export const indexDTFBalanceAtom = atom(0n) export const txHashAtom = atom(undefined) // tx hash for minting or redeeming export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) -export const orderIdsAtom = atom<{ id: string; provider: QuoteProvider }[]>([]) -export const asyncSwapResponseAtom = atom( - undefined +export const cowswapOrderIdsAtom = atom([]) +export const cowswapOrdersCreatedAtAtom = atom(undefined) +export const cowswapOrdersAtom = atom<(EnrichedOrder & { orderId: string })[]>( + [] ) + export const slippageAtom = atom('100') export const applyWalletBalanceAtom = atom(true) -// export const ordersAtom = atom>({}) export const refetchQuotesAtom = atom<{ fn: () => void }>({ fn: () => {} }) export const fetchingQuotesAtom = atom(false) @@ -37,6 +37,9 @@ export const fetchingQuotesAtom = atom(false) export const isMintingAtom = atom(false) export const successAtom = atom(false) +export const universalSuccessOrdersAtom = atom([]) +export const universalFailedOrdersAtom = atom([]) + // Render Atoms export const openCollateralPanelAtom = atom(true) export const showSettingsAtom = atom(false) @@ -68,11 +71,12 @@ export const insufficientBalanceAtom = atom((get) => { }) export const collateralAcquiredAtom = atom((get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) - return Boolean( - asyncSwapResponse?.cowswapOrders.every( - (order) => order.status === OrderStatus.FULFILLED - ) + const cowswapOrders = get(cowswapOrdersAtom) + const universalFailedOrders = get(universalFailedOrdersAtom) + return ( + cowswapOrders.length > 0 && + cowswapOrders.every((order) => order.status === OrderStatus.FULFILLED) && + universalFailedOrders.length === 0 ) }) @@ -101,22 +105,24 @@ export const mintValueWeiAtom = atom((get) => { return parseEther(amountOut.toString()) }) +// Only Cowswap Orders export const failedOrdersAtom = atom( (get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) + const cowswapOrders = get(cowswapOrdersAtom) return ( - asyncSwapResponse?.cowswapOrders.filter((order) => + cowswapOrders.filter((order) => [OrderStatus.CANCELLED, OrderStatus.EXPIRED].includes(order.status) ) || [] ) } ) +// Only Cowswap Orders export const pendingOrdersAtom = atom( (get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) + const cowswapOrders = get(cowswapOrdersAtom) return ( - asyncSwapResponse?.cowswapOrders.filter((order) => + cowswapOrders.filter((order) => [OrderStatus.OPEN, OrderStatus.PRESIGNATURE_PENDING].includes( order.status ) @@ -125,16 +131,7 @@ export const pendingOrdersAtom = atom( } ) -export const hasAllCollateralsAtom = atom((get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) - if (!asyncSwapResponse) return false - return ( - asyncSwapResponse?.cowswapOrders.length > 0 && - asyncSwapResponse?.cowswapOrders.every( - (order) => order.status === OrderStatus.FULFILLED - ) - ) +export const ordersSubmittedAtom = atom((get) => { + const cowswapOrdersCreatedAt = get(cowswapOrdersCreatedAtAtom) + return Boolean(cowswapOrdersCreatedAt) }) - -export const universalSuccessOrdersAtom = atom([]) -export const universalFailedOrdersAtom = atom([]) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index e64c8880d..4f570ce1e 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -6,18 +6,17 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, ArrowRight, Check, Loader, RefreshCw } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { - asyncSwapResponseAtom, + collateralAcquiredAtom, + cowswapOrdersCreatedAtAtom, failedOrdersAtom, - hasAllCollateralsAtom, openCollateralPanelAtom, operationAtom, pendingOrdersAtom, successAtom, } from './atom' -import MintButton from './mint-button' -import { OrderStatus } from '@cowprotocol/cow-sdk' import { useRefreshQuotes } from './hooks/useQuote' import { useQuoteSignatures } from './hooks/useQuoteSignatures' +import MintButton from './mint-button' const OpenCollateralPanel = () => { const basket = useAtomValue(indexDTFBasketAtom) @@ -81,12 +80,12 @@ const RequoteFailedOrders = () => { const CollateralAcquisition = () => { const operation = useAtomValue(operationAtom) - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const cowswapOrdersCreatedAt = useAtomValue(cowswapOrdersCreatedAtAtom) const [elapsedTime, setElapsedTime] = useState(0) const setSuccess = useSetAtom(successAtom) const failedOrders = useAtomValue(failedOrdersAtom) const pendingOrders = useAtomValue(pendingOrdersAtom) - const hasAllCollaterals = useAtomValue(hasAllCollateralsAtom) + const collateralAcquired = useAtomValue(collateralAcquiredAtom) const refreshQuotes = useMemo( () => failedOrders.length > 0 && pendingOrders.length === 0, @@ -94,27 +93,27 @@ const CollateralAcquisition = () => { ) useEffect(() => { - if (!asyncSwapResponse?.createdAt) return + if (!cowswapOrdersCreatedAt) return const interval = setInterval(() => { const now = new Date() - const createdAt = new Date(asyncSwapResponse.createdAt) + const createdAt = new Date(cowswapOrdersCreatedAt) const elapsed = now.getTime() - createdAt.getTime() setElapsedTime(elapsed / 1000) }, 1000) return () => clearInterval(interval) - }, [asyncSwapResponse?.createdAt]) + }, [cowswapOrdersCreatedAt]) useEffect(() => { - if (hasAllCollaterals && operation === 'redeem') { + if (collateralAcquired && operation === 'redeem') { setSuccess(true) } - }, [hasAllCollaterals, setSuccess, operation]) + }, [collateralAcquired, setSuccess, operation]) - if (!asyncSwapResponse) return null + if (!cowswapOrdersCreatedAt) return null - if (hasAllCollaterals && operation === 'mint') { + if (collateralAcquired && operation === 'mint') { return (
diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index f55c90a11..f736d43bf 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -3,14 +3,14 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' import { atom, useAtom, useAtomValue } from 'jotai' import { useEffect, useMemo } from 'react' import { - asyncSwapResponseAtom, + cowswapOrderIdsAtom, + cowswapOrdersAtom, openCollateralPanelAtom, - orderIdsAtom, + ordersSubmittedAtom, universalFailedOrdersAtom, universalSuccessOrdersAtom, } from './atom' import CowSwapOrder from './cowswap-order' -import { QuoteProvider } from './types' import UniversalFailedOrder from './universal-failed-order' import UniversalOrder from './universal-order' @@ -25,14 +25,15 @@ const STATUS_PRIORITY: Record = { const isVisibleAtom = atom(false) const shouldRenderAtom = atom(false) export const showCollateralsAtom = atom((get) => { - const asyncSwapResponse = get(asyncSwapResponseAtom) + const ordersSubmitted = get(ordersSubmittedAtom) const open = get(openCollateralPanelAtom) - return asyncSwapResponse && open + return ordersSubmitted && open }) const Collaterals = () => { - const orderIDs = useAtomValue(orderIdsAtom) - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const cowswapOrderIds = useAtomValue(cowswapOrderIdsAtom) + const cowswapOrders = useAtomValue(cowswapOrdersAtom) + const ordersSubmitted = useAtomValue(ordersSubmittedAtom) const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) const universalFailedOrders = useAtomValue(universalFailedOrdersAtom) const open = useAtomValue(openCollateralPanelAtom) @@ -40,7 +41,7 @@ const Collaterals = () => { const [shouldRender, setShouldRender] = useAtom(shouldRenderAtom) useEffect(() => { - if (asyncSwapResponse && open) { + if (ordersSubmitted && open) { setShouldRender(true) const timer = setTimeout(() => setIsVisible(true), 0) return () => clearTimeout(timer) @@ -49,26 +50,22 @@ const Collaterals = () => { const timer = setTimeout(() => setShouldRender(false), 300) return () => clearTimeout(timer) } - }, [asyncSwapResponse, open, setIsVisible, setShouldRender]) + }, [ordersSubmitted, open, setIsVisible, setShouldRender]) - const { cowswapOrders = [] } = asyncSwapResponse || {} - - const sortedOrderIds = useMemo( + const sortedCowswapOrderIds = useMemo( () => - orderIDs - .filter((o) => o.provider === QuoteProvider.CowSwap) - .sort((a, b) => { - const orderA = cowswapOrders.find((o) => o.orderId === a.id) - const orderB = cowswapOrders.find((o) => o.orderId === b.id) + cowswapOrderIds.sort((a, b) => { + const orderA = cowswapOrders.find((o) => o.orderId === a) + const orderB = cowswapOrders.find((o) => o.orderId === b) - if (!orderA?.status || !orderB?.status) return 0 + if (!orderA?.status || !orderB?.status) return 0 - const orderAPriority = STATUS_PRIORITY[orderA.status as OrderStatus] - const orderBPriority = STATUS_PRIORITY[orderB.status as OrderStatus] + const orderAPriority = STATUS_PRIORITY[orderA.status] + const orderBPriority = STATUS_PRIORITY[orderB.status] - return orderAPriority - orderBPriority - }), - [cowswapOrders] + return orderAPriority - orderBPriority + }), + [cowswapOrders, cowswapOrderIds] ) if (!shouldRender) return null @@ -83,8 +80,8 @@ const Collaterals = () => { {universalFailedOrders.map((quote, index) => ( ))} - {sortedOrderIds.map((order) => ( - + {sortedCowswapOrderIds.map((orderId) => ( + ))} {universalSuccessOrders.map((order, index) => ( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts index bcb3df6bc..55fa4ba68 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useOrderStatus.ts @@ -1,7 +1,7 @@ import { OrderStatus } from '@cowprotocol/cow-sdk' import { useQuery } from '@tanstack/react-query' import { useSetAtom } from 'jotai' -import { asyncSwapResponseAtom } from '../atom' +import { cowswapOrdersAtom } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' interface UseOrderStatusParams { @@ -10,7 +10,7 @@ interface UseOrderStatusParams { export function useOrderStatus({ orderId }: UseOrderStatusParams) { const { orderBookApi } = useGlobalProtocolKit() - const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + const setCowswapOrders = useSetAtom(cowswapOrdersAtom) return useQuery({ queryKey: ['order/status', orderId], @@ -21,19 +21,10 @@ export function useOrderStatus({ orderId }: UseOrderStatusParams) { } const order = await orderBookApi.getOrder(orderId) - setAsyncSwapResponse((prev) => { - if (!prev) { - return undefined - } - - return { - ...prev, - cowswapOrders: [ - ...(prev?.cowswapOrders.filter((o) => o.orderId !== orderId) || []), - { ...order, orderId }, - ], - } - }) + setCowswapOrders((prev) => [ + ...prev.filter((o) => o.orderId !== orderId), + { ...order, orderId }, + ]) return order }, diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index 9a8c71279..b7a61e472 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -455,7 +455,6 @@ export const useRefreshQuotes = () => { const failedOrders = useAtomValue(failedOrdersAtom) const failedUniversalOrders = useAtomValue(universalFailedOrdersAtom) const selectedToken = useAtomValue(selectedTokenAtom) - const setUniversalFailedOrders = useSetAtom(universalFailedOrdersAtom) const query = useQuery({ queryKey: ['refresh-quotes', failedOrders], @@ -490,6 +489,7 @@ export const useRefreshQuotes = () => { operation === 'redeem' ? BigInt(order.pair_token_amount ?? '0') : BigInt(order.token_amount ?? '0') + return await getCowswapQuote({ sellToken: sellToken as Address, buyToken: buyToken as Address, @@ -505,7 +505,7 @@ export const useRefreshQuotes = () => { ...quotePromises, ...universalQuotePromises, ]) - console.log(results) + failedOrders.forEach((order, i) => { setQuotes((prev) => ({ ...prev, @@ -517,8 +517,6 @@ export const useRefreshQuotes = () => { })) }) - setUniversalFailedOrders([]) - return quotes }, }) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index a1721fffa..47e7c4d23 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -1,7 +1,6 @@ import CowswapSettlement from '@/abis/CowSwapSettlement' import { chainIdAtom, walletAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' -import { uuidv4 } from '@/utils' import { OrderBalance } from '@cowprotocol/contracts' import { OrderCreation, @@ -12,21 +11,14 @@ import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import pLimit from 'p-limit' import { generateTypedData, OrderRequest } from 'universal-sdk' -import { - Address, - encodeFunctionData, - Hex, - maxUint256, - parseEther, - parseUnits, -} from 'viem' +import { Address, encodeFunctionData, Hex, maxUint256, parseUnits } from 'viem' import { useSendCalls, useSignTypedData } from 'wagmi' import { - asyncSwapResponseAtom, + cowswapOrderIdsAtom, + cowswapOrdersAtom, + cowswapOrdersCreatedAtAtom, failedOrdersAtom, - mintValueAtom, operationAtom, - orderIdsAtom, quotesAtom, selectedTokenAtom, universalFailedOrdersAtom, @@ -47,14 +39,14 @@ export function useQuoteSignatures(refresh = false) { const chainId = useAtomValue(chainIdAtom) const address = useAtomValue(walletAtom) const operation = useAtomValue(operationAtom) - const mintValue = useAtomValue(mintValueAtom) const inputAmount = useAtomValue(userInputAtom) const quoteToken = useAtomValue(selectedTokenAtom) const [quotes, setQuotes] = useAtom(quotesAtom) - const setOrderIDs = useSetAtom(orderIdsAtom) - const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) + const setCowswapOrderIds = useSetAtom(cowswapOrderIdsAtom) + const setCowswapOrders = useSetAtom(cowswapOrdersAtom) const setUniversalFailedOrders = useSetAtom(universalFailedOrdersAtom) const setUniversalSuccessOrders = useSetAtom(universalSuccessOrdersAtom) + const setCowswapOrdersCreatedAt = useSetAtom(cowswapOrdersCreatedAtAtom) const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) @@ -222,7 +214,6 @@ export function useQuoteSignatures(refresh = false) { } } - // TODO: tx confirmation checks if (txData.length > 0) { const txBundle = await sendCallsAsync({ calls: txData, @@ -233,95 +224,100 @@ export function useQuoteSignatures(refresh = false) { console.log({ txBundle }) } - // TODO: Wait here until Safe tx is onchain - // I wonder if this is better suited for a different hook tbh - - // TODO: Create an order Index which is independently managed - const orderIds = ( - await Promise.all( - validOrderData - .filter((e) => e != null) - .map(({ type, data }) => - limiter(async () => { - if (type === QuoteProvider.CowSwap) { - const order = data.quote as OrderCreation - const e = await orderBookApi.sendOrder({ - ...order, - from: address, - signature: address, - signingScheme: SigningScheme.PRESIGN, - }) - return { - id: e, - provider: QuoteProvider.CowSwap, - } - } else { - if (type === QuoteProvider.Universal) { - const quote = data.quote as OrderRequest - const { typedData } = await generateTypedData(quote) - const _typedData = convertTypeDataToBigInt(typedData) - const signature = await signTypedDataAsync(_typedData) - try { - const universalOrder = await universalSdk.submitOrder({ - ...quote, - signature, - }) - - setUniversalSuccessOrders((prev) => { - return [ - ...prev, - { - ...quote, - orderId: universalOrder.order_id, - transactionHash: universalOrder.transaction_hash, - }, - ] - }) - - return undefined - } catch (error) { - console.error(error) - setUniversalFailedOrders((prev) => [...prev, quote]) - return undefined - } - } - } - }) - ) + // Separate signature generation from order submission to optimize performance + const universalQuotes = validOrderData.filter( + ({ type }) => type === QuoteProvider.Universal + ) + + // Step 1: Generate all signatures in parallel + const signedQuotes = await Promise.all( + universalQuotes.map(({ data }) => + limiter(async () => { + const quote = data.quote as OrderRequest + const { typedData } = await generateTypedData(quote) + const _typedData = convertTypeDataToBigInt(typedData) + const signature = await signTypedDataAsync(_typedData) + + return { quote, signature } + }) ) - ).filter((order) => order !== undefined) + ) + + // Step 2: Submit all orders in parallel + const universalOrderResults = await Promise.all( + signedQuotes.map(async ({ quote, signature }) => { + try { + const universalOrder = await universalSdk.submitOrder({ + ...quote, + signature, + }) + + setUniversalSuccessOrders((prev) => { + return [ + ...prev, + { + ...quote, + orderId: universalOrder.order_id, + transactionHash: universalOrder.transaction_hash, + }, + ] + }) + + return { success: true, quote, order: universalOrder } + } catch (error) { + console.error(error) + setUniversalFailedOrders((prev) => [...prev, quote]) + return { success: false, quote, error } + } + }) + ) + + // Log results for debugging + const successfulOrders = universalOrderResults.filter( + (result) => result.success + ) + const failedUniversalOrders = universalOrderResults.filter( + (result) => !result.success + ) + + console.log( + `Universal orders completed: ${successfulOrders.length} successful, ${failedUniversalOrders.length} failed` + ) + + const orderIds = await Promise.all( + validOrderData + .filter(({ type }) => type === QuoteProvider.CowSwap) + .map(async ({ data }) => { + const order = data.quote as OrderCreation + const orderId = await orderBookApi.sendOrder({ + ...order, + from: address, + signature: address, + signingScheme: SigningScheme.PRESIGN, + }) + return orderId + }) + ) if (refresh) { + // Reset universal failed orders + setUniversalFailedOrders([]) // replace failed orders with new ones - setOrderIDs((prev) => [ + setCowswapOrderIds((prev) => [ ...prev.filter( - (order) => !failedOrders.map((o) => o.orderId).includes(order.id) + (orderId) => !failedOrders.map((o) => o.orderId).includes(orderId) ), ...orderIds, ]) - setAsyncSwapResponse((prev) => { - if (!prev) return undefined - return { - ...prev, - cowswapOrders: prev?.cowswapOrders.filter( - (o) => !failedOrders.map((fo) => fo.orderId).includes(o.orderId) - ), - createdAt: new Date().toISOString(), - } - }) - } else { - setOrderIDs(orderIds) - setAsyncSwapResponse((prev) => ({ - swapOrderId: uuidv4(), - chainId, - signer: address, - dtf: indexDTF.id, - inputAmount, - amountOut: parseEther(mintValue.toString()).toString(), - createdAt: new Date().toISOString(), - cowswapOrders: prev?.cowswapOrders || [], + setCowswapOrders((prev) => ({ + ...prev.filter( + (o) => !failedOrders.map((fo) => fo.orderId).includes(o.orderId) + ), })) + } else { + setCowswapOrderIds(orderIds) } + setCowswapOrdersCreatedAt(new Date().toISOString()) setQuotes({}) return { diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 703c2481a..498ce284e 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -13,10 +13,10 @@ import Updater from '../manual/updater' import AsyncMint from './async-mint' import AsyncRedeem from './async-redeem' import { - asyncSwapResponseAtom, fetchingQuotesAtom, indexDTFBalanceAtom, operationAtom, + ordersSubmittedAtom, redeemAssetsAtom, refetchQuotesAtom, showSettingsAtom, @@ -26,8 +26,8 @@ import { import Collaterals, { showCollateralsAtom } from './collaterals' import GnosisSafeRequired from './gnosis-safe-required' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' -import Success from './success' import Config from './settings' +import Success from './success' function Content() { const showSettings = useAtomValue(showSettingsAtom) @@ -67,10 +67,10 @@ const Header = () => { const fetchingQuotes = useAtomValue(fetchingQuotesAtom) const input = useAtomValue(userInputAtom) const invalidInput = isNaN(Number(input)) || Number(input) === 0 - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const ordersSubmitted = useAtomValue(ordersSubmittedAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) const disableActions = - !!asyncSwapResponse || Object.keys(redeemAssets).length > 0 + !!ordersSubmitted || Object.keys(redeemAssets).length > 0 return (
diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 366b63805..b870c4950 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -22,20 +22,23 @@ import { } from 'lucide-react' import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { formatEther, formatUnits, parseUnits } from 'viem' +import { formatUnits } from 'viem' import { - userInputAtom, - asyncSwapResponseAtom, bufferValueAtom, - operationAtom, - txHashAtom, + cowswapOrderIdsAtom, + cowswapOrdersAtom, + cowswapOrdersCreatedAtAtom, + mintValueAtom, mintValueUSDAtom, + operationAtom, + quotesAtom, redeemAssetsAtom, - successAtom, selectedTokenAtom, - orderIdsAtom, - quotesAtom, + successAtom, + txHashAtom, + universalFailedOrdersAtom, universalSuccessOrdersAtom, + userInputAtom, } from './atom' import CowSwapOrder from './cowswap-order' import Details from './details' @@ -46,20 +49,26 @@ const viewTransactionsAtom = atom(false) const CloseButton = () => { const setTxHashAtom = useSetAtom(txHashAtom) const setSuccess = useSetAtom(successAtom) - const setAsyncSwapResponse = useSetAtom(asyncSwapResponseAtom) const setUserInputAtom = useSetAtom(userInputAtom) const setRedeemAssets = useSetAtom(redeemAssetsAtom) - const setOrderIdsAtom = useSetAtom(orderIdsAtom) + const setCowswapOrderIdsAtom = useSetAtom(cowswapOrderIdsAtom) + const setCowswapOrdersCreatedAtAtom = useSetAtom(cowswapOrdersCreatedAtAtom) + const setCowswapOrdersAtom = useSetAtom(cowswapOrdersAtom) const setQuotesAtom = useSetAtom(quotesAtom) + const setUniversalSuccessOrdersAtom = useSetAtom(universalSuccessOrdersAtom) + const setUniversalFailedOrdersAtom = useSetAtom(universalFailedOrdersAtom) const handleClose = () => { setTxHashAtom(undefined) setSuccess(false) - setAsyncSwapResponse(undefined) setUserInputAtom('') setRedeemAssets({}) setQuotesAtom({}) - setOrderIdsAtom([]) + setCowswapOrderIdsAtom([]) + setCowswapOrdersCreatedAtAtom(undefined) + setCowswapOrdersAtom([]) + setUniversalSuccessOrdersAtom([]) + setUniversalFailedOrdersAtom([]) } return ( @@ -132,12 +141,11 @@ const DTFAmount = () => { const indexDTF = useAtomValue(indexDTFAtom) const indexDTFPrice = useAtomValue(indexDTFPriceAtom) const inputAmountUSD = useAtomValue(mintValueUSDAtom) - const orders = useAtomValue(asyncSwapResponseAtom) const operation = useAtomValue(operationAtom) const sharesRedeemed = useAtomValue(userInputAtom) + const mintValue = useAtomValue(mintValueAtom) - const sharesMinted = Number(formatEther(BigInt(orders?.amountOut || 0))) - const valueMinted = (indexDTFPrice || 0) * sharesMinted + const valueMinted = (indexDTFPrice || 0) * mintValue const priceImpact = inputAmountUSD ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) : 0 @@ -151,7 +159,7 @@ const DTFAmount = () => {
{operation === 'mint' - ? formatTokenAmount(sharesMinted) + ? formatTokenAmount(mintValue) : formatTokenAmount(Number(sharesRedeemed))}
{indexDTF?.token.symbol || ''}
@@ -175,10 +183,9 @@ const DTFAmount = () => { } const USDCReceivedOnRedeem = () => { - const asyncSwapResponse = useAtomValue(asyncSwapResponseAtom) + const cowswapOrders = useAtomValue(cowswapOrdersAtom) const selectedToken = useAtomValue(selectedTokenAtom) const assetsRedeemed = useAtomValue(redeemAssetsAtom) - const { cowswapOrders = [] } = asyncSwapResponse || {} const notSwappedAssets = Number( @@ -321,9 +328,8 @@ const MainTransaction = () => { const Transactions = () => { const setViewTransactions = useSetAtom(viewTransactionsAtom) - const orders = useAtomValue(asyncSwapResponseAtom) + const cowswapOrders = useAtomValue(cowswapOrdersAtom) const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) - const { cowswapOrders = [] } = orders || {} return (
diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index 0425b2705..5c4eb4a85 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -2,6 +2,7 @@ import { Token } from '@/types' import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' import { Quote } from 'universal-sdk' import { Address } from 'viem' +import { CustomUniversalQuote } from './providers/universal' export enum QuoteProvider { CowSwap = 'CowSwap', @@ -23,7 +24,7 @@ export type QuoteAggregated = token: Token success: true type: QuoteProvider.Universal - data: unknown // TODO: Type Universal Quote Response + data: CustomUniversalQuote } export type UniversalOrder = Quote & { @@ -32,12 +33,5 @@ export type UniversalOrder = Quote & { } export type AsyncSwapOrderResponse = { - swapOrderId: string - chainId: number - signer: Address - dtf: Address - inputAmount: string - amountOut: string cowswapOrders: (EnrichedOrder & { orderId: string })[] - createdAt: string } From f399e7879fcdcc84dbd419528b38cc818e00b816 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 11:10:14 -0300 Subject: [PATCH 57/85] chore: failed universal orders --- .../index-dtf/issuance/async-swaps/atom.ts | 7 +- .../issuance/async-swaps/hooks/useQuote.ts | 124 +++++--- .../async-swaps/hooks/useQuoteSignatures.ts | 295 +++++++++++------- .../issuance/async-swaps/success.tsx | 3 + .../index-dtf/issuance/async-swaps/types.ts | 29 +- 5 files changed, 295 insertions(+), 163 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 88b80411f..435418f82 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -2,7 +2,11 @@ import { balancesAtom, chainIdAtom, TokenBalance } from '@/state/atoms' import { indexDTFPriceAtom } from '@/state/dtf/atoms' import { Token } from '@/types' import { reducedZappableTokens } from '@/views/yield-dtf/issuance/components/zapV2/constants' -import { EnrichedOrder, OrderStatus } from '@cowprotocol/cow-sdk' +import { + EnrichedOrder, + OrderQuoteResponse, + OrderStatus, +} from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Quote } from 'universal-sdk' @@ -22,6 +26,7 @@ export const indexDTFBalanceAtom = atom(0n) export const txHashAtom = atom(undefined) // tx hash for minting or redeeming export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) +export const fallbackQuotesAtom = atom>({}) export const cowswapOrderIdsAtom = atom([]) export const cowswapOrdersCreatedAtAtom = atom(undefined) export const cowswapOrdersAtom = atom<(EnrichedOrder & { orderId: string })[]>( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index b7a61e472..ce33e75ba 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -15,6 +15,7 @@ import { Address, formatUnits, parseEther, zeroAddress } from 'viem' import { applyWalletBalanceAtom, failedOrdersAtom, + fallbackQuotesAtom, fetchingQuotesAtom, mintValueAtom, operationAtom, @@ -67,33 +68,38 @@ async function getCowswapQuote({ operation: 'redeem' | 'mint' orderBookApi: OrderBookApi }) { - const quote = await orderBookApi.getQuote({ - sellToken, - buyToken, - from: address, - receiver: address, - validFor: 60 * 10, // 10 minutes - priceQuality: PriceQuality.VERIFIED, - ...(operation === 'redeem' - ? { - kind: OrderQuoteSideKindSell.SELL, - sellAmountBeforeFee: amount.toString(), - } - : { - kind: OrderQuoteSideKindBuy.BUY, - buyAmountAfterFee: amount.toString(), - }), - signingScheme: SigningScheme.PRESIGN, - }) + try { + const quote = await orderBookApi.getQuote({ + sellToken, + buyToken, + from: address, + receiver: address, + validFor: 60 * 10, // 10 minutes + priceQuality: PriceQuality.VERIFIED, + ...(operation === 'redeem' + ? { + kind: OrderQuoteSideKindSell.SELL, + sellAmountBeforeFee: amount.toString(), + } + : { + kind: OrderQuoteSideKindBuy.BUY, + buyAmountAfterFee: amount.toString(), + }), + signingScheme: SigningScheme.PRESIGN, + }) - // CowSwap orders sometimes return every so slightly different amounts than requested. - if (operation === 'redeem') { - quote.quote.sellAmount = amount.toString() - } else { - quote.quote.buyAmount = amount.toString() - } + // CowSwap orders sometimes return every so slightly different amounts than requested. + if (operation === 'redeem') { + quote.quote.sellAmount = amount.toString() + } else { + quote.quote.buyAmount = amount.toString() + } - return quote + return quote + } catch (error) { + console.error(`Error getting cowswap quote:`, error) + return null + } } async function getUniversalQuote({ @@ -114,16 +120,13 @@ async function getUniversalQuote({ try { const universalAsset = getUniversalTokenName(buyToken) const universalQuote = await universalSdk.getQuote({ - type: 'BUY', + type: operation === 'redeem' ? 'SELL' : 'BUY', blockchain: 'BASE', token: universalAsset, pair_token: 'USDC', user_address: address, slippage_bips: 100, - token_amount: - universalAsset === 'SOL' - ? ((amount * 200n) / 100n).toString() - : amount.toString(), + token_amount: amount.toString(), }) const customQuote: CustomUniversalQuote = { @@ -180,8 +183,10 @@ async function getQuote({ // Try Universal first if available const universalAsset = getUniversalTokenName(buyToken) const hasMinValue = quoteValue && quoteValue > MIN_UNIVERSAL_QUOTE_VALUE_USD + let universalQuote: CustomUniversalQuote | null = null + if (universalAsset && hasMinValue) { - const universalQuote = await getUniversalQuote({ + universalQuote = await getUniversalQuote({ sellToken, buyToken, amount, @@ -189,15 +194,9 @@ async function getQuote({ operation, universalSdk, }) - - // If Universal fails, continue with CowSwap - if (universalQuote) { - return universalQuote - } } - // If no Universal or it failed, use CowSwap - return await getCowswapQuote({ + const cowswapQuote = await getCowswapQuote({ sellToken, buyToken, amount, @@ -205,6 +204,13 @@ async function getQuote({ operation, orderBookApi, }) + + // TODO: if universalQuote is worse than cowswapQuote, use cowswapQuote (set universalQuote to null) + + return { + universalQuote, + cowswapQuote, + } } export const useQuotesForMint = () => { @@ -217,6 +223,7 @@ export const useQuotesForMint = () => { const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) + const setFallbackQuotes = useSetAtom(fallbackQuotesAtom) const { orderBookApi, universalSdk } = useGlobalProtocolKit() const { data: folioDetails } = useFolioDetails({ shares: folioAmount }) @@ -259,7 +266,7 @@ export const useQuotesForMint = () => { amount, token.decimals ) - return await getQuote({ + const { universalQuote, cowswapQuote } = await getQuote({ sellToken: selectedToken.address, buyToken: token.address, amount, @@ -269,6 +276,15 @@ export const useQuotesForMint = () => { universalSdk, quoteValue, }) + + if (cowswapQuote) { + setFallbackQuotes((prev) => ({ + ...prev, + [token.address]: cowswapQuote, + })) + } + + return universalQuote || cowswapQuote } catch (error) { console.error(`Error getting quote for ${asset}:`, error) return null @@ -298,7 +314,7 @@ export const useQuotesForMint = () => { } return { - token: token, + token, success: true, type, quote, @@ -308,12 +324,14 @@ export const useQuotesForMint = () => { setQuotes((prev) => ({ ...prev, [token.address as string]: { + token, success: false, }, })) } return { + token, success: false, } } @@ -340,6 +358,8 @@ export const useQuotesForRedeem = () => { const [quotes, setQuotes] = useAtom(quotesAtom) const setRefetchQuotes = useSetAtom(refetchQuotesAtom) const setFetchingQuotes = useSetAtom(fetchingQuotesAtom) + const setFallbackQuotes = useSetAtom(fallbackQuotesAtom) + const { orderBookApi, universalSdk } = useGlobalProtocolKit() const assets = Object.keys(redeemAssets) @@ -379,7 +399,7 @@ export const useQuotesForRedeem = () => { amount, token.decimals ) - return await getQuote({ + const { universalQuote, cowswapQuote } = await getQuote({ sellToken: token.address, buyToken: selectedToken.address, amount, @@ -389,6 +409,15 @@ export const useQuotesForRedeem = () => { universalSdk, quoteValue, }) + + if (cowswapQuote) { + setFallbackQuotes((prev) => ({ + ...prev, + [token.address]: cowswapQuote, + })) + } + + return universalQuote || cowswapQuote } catch (error) { console.error(`Error getting quote for ${asset}:`, error) return null @@ -400,22 +429,27 @@ export const useQuotesForRedeem = () => { assets.forEach((asset, i) => { const token = tokensInfo[asset.toLowerCase()] const quote = results[i] + const type = + quote && '_originalQuote' in quote + ? QuoteProvider.Universal + : QuoteProvider.CowSwap + try { if (!signal.aborted) { setQuotes((prev) => ({ ...prev, [token.address as string]: { success: !!quote, - type: QuoteProvider.CowSwap, + type, data: quote, }, })) } return { - token: token, + token, success: true, - source: QuoteProvider.CowSwap, + type, quote, } } catch { @@ -423,12 +457,14 @@ export const useQuotesForRedeem = () => { setQuotes((prev) => ({ ...prev, [token.address as string]: { + token, success: false, }, })) } return { + token, success: false, } } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 47e7c4d23..60cb2fb0a 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -4,13 +4,14 @@ import { indexDTFAtom } from '@/state/dtf/atoms' import { OrderBalance } from '@cowprotocol/contracts' import { OrderCreation, + OrderQuoteResponse, OrderSigningUtils, SigningScheme, } from '@cowprotocol/cow-sdk' import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import pLimit from 'p-limit' -import { generateTypedData, OrderRequest } from 'universal-sdk' +import { generateTypedData, OrderRequest, Quote } from 'universal-sdk' import { Address, encodeFunctionData, Hex, maxUint256, parseUnits } from 'viem' import { useSendCalls, useSignTypedData } from 'wagmi' import { @@ -18,6 +19,7 @@ import { cowswapOrdersAtom, cowswapOrdersCreatedAtAtom, failedOrdersAtom, + fallbackQuotesAtom, operationAtom, quotesAtom, selectedTokenAtom, @@ -26,14 +28,97 @@ import { userInputAtom, } from '../atom' import { useGlobalProtocolKit } from '../providers/GlobalProtocolKitProvider' -import { CustomUniversalQuote } from '../providers/universal' -import { QuoteProvider } from '../types' +import { + CustomUniversalQuote, + getUniversalTokenAddress, +} from '../providers/universal' +import { CowswapQuote, QuoteProvider } from '../types' import { convertTypeDataToBigInt, getApprovalCallIfNeeded } from './utils' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const const UNIVERSAL_PERMIT2 = '0x000000000022D473030F116dDEE9F6B43aC78BA3' as const +type CowswapPreSignTx = { + type: QuoteProvider.CowSwap + data: { + orderId: string + quote: OrderCreation + preSignTx: Hex + sellToken: string + amount: string + } +} + +type UniversalQuote = { + type: QuoteProvider.Universal + data: CustomUniversalQuote & { + quote: Quote + } +} + +const getCowswapPreSignTx = async ({ + chainId, + orderQuote, + operation, + address, +}: { + chainId: number + orderQuote: OrderQuoteResponse + operation: string + address: Address +}): Promise => { + if (orderQuote.quote.sellAmount === '0') { + return undefined + } + + const modifiedQuote = { + ...orderQuote.quote, + feeAmount: '0', + buyAmount: + operation === 'mint' + ? orderQuote.quote.buyAmount + : ((BigInt(orderQuote.quote.buyAmount) * 98n) / 100n).toString(), + sellAmount: + operation === 'mint' + ? ((BigInt(orderQuote.quote.sellAmount) * 101n) / 100n).toString() + : orderQuote.quote.sellAmount, + from: address, + receiver: address!, + signature: address!, + signingScheme: SigningScheme.PRESIGN, + } as const satisfies OrderCreation + + const orderId = await OrderSigningUtils.generateOrderId( + chainId, + { + ...modifiedQuote, + sellTokenBalance: OrderBalance.ERC20, + buyTokenBalance: OrderBalance.ERC20, + }, + { + owner: address, + } + ) + + const encodedPreSignTx = encodeFunctionData({ + abi: CowswapSettlement, + functionName: 'setPreSignature', + args: [orderId.orderId as Hex, true], + }) + + return { + type: QuoteProvider.CowSwap, + data: { + orderId: orderId.orderId, + quote: modifiedQuote, + preSignTx: encodedPreSignTx, + sellToken: modifiedQuote.sellToken, + amount: modifiedQuote.sellAmount, + }, + } +} + export function useQuoteSignatures(refresh = false) { const indexDTF = useAtomValue(indexDTFAtom) const chainId = useAtomValue(chainIdAtom) @@ -42,6 +127,7 @@ export function useQuoteSignatures(refresh = false) { const inputAmount = useAtomValue(userInputAtom) const quoteToken = useAtomValue(selectedTokenAtom) const [quotes, setQuotes] = useAtom(quotesAtom) + const fallbackQuotes = useAtomValue(fallbackQuotesAtom) const setCowswapOrderIds = useSetAtom(cowswapOrderIdsAtom) const setCowswapOrders = useSetAtom(cowswapOrdersAtom) const setUniversalFailedOrders = useSetAtom(universalFailedOrdersAtom) @@ -86,79 +172,31 @@ export function useQuoteSignatures(refresh = false) { } // Generate order IDs and hashed messages for all quotes - const orderData = await Promise.all( - successfulQuotes.map(async (quote) => { - if (quote.type === QuoteProvider.CowSwap) { - if (quote.data.quote.sellAmount === '0') { - return null + const orderData: (CowswapPreSignTx | UniversalQuote | undefined)[] = + await Promise.all( + successfulQuotes.map(async (quote) => { + if (quote.type === QuoteProvider.CowSwap) { + return getCowswapPreSignTx({ + chainId, + orderQuote: quote.data, + operation, + address, + }) } - const modifiedQuote = { - ...quote.data.quote, - feeAmount: '0', - buyAmount: - operation === 'mint' - ? quote.data.quote.buyAmount - : ( - (BigInt(quote.data.quote.buyAmount) * 98n) / - 100n - ).toString(), - sellAmount: - operation === 'mint' - ? ( - (BigInt(quote.data.quote.sellAmount) * 101n) / - 100n - ).toString() - : quote.data.quote.sellAmount, - from: address, - receiver: address!, - signature: address!, - signingScheme: SigningScheme.PRESIGN, - } as const satisfies OrderCreation + if (quote.type === QuoteProvider.Universal) { + const uq = quote.data as CustomUniversalQuote - const orderId = await OrderSigningUtils.generateOrderId( - chainId, - { - ...modifiedQuote, - sellTokenBalance: OrderBalance.ERC20, - buyTokenBalance: OrderBalance.ERC20, - }, - { - owner: address, + return { + type: QuoteProvider.Universal, + data: { + ...uq, + quote: uq._originalQuote, + }, } - ) - - const encodedPreSignTx = encodeFunctionData({ - abi: CowswapSettlement, - functionName: 'setPreSignature', - args: [orderId.orderId as Hex, true], - }) - - return { - type: QuoteProvider.CowSwap, - data: { - orderId: orderId.orderId, - quote: modifiedQuote, - preSignTx: encodedPreSignTx, - sellToken: modifiedQuote.sellToken, - amount: modifiedQuote.sellAmount, - }, } - } - - if (quote.type === QuoteProvider.Universal) { - const uq = quote.data as CustomUniversalQuote - - return { - type: QuoteProvider.Universal, - data: { - ...uq, - quote: uq._originalQuote, - }, - } - } - }) - ) + }) + ) const validOrderData = orderData.filter((data) => !!data) @@ -189,7 +227,7 @@ export function useQuoteSignatures(refresh = false) { chainId, address: address, token: data.sellToken as Address, - requiredAmount: BigInt(data.amount as string), + requiredAmount: data.sellAmount, spender: UNIVERSAL_PERMIT2, }), ].filter((e) => e !== null) @@ -229,8 +267,7 @@ export function useQuoteSignatures(refresh = false) { ({ type }) => type === QuoteProvider.Universal ) - // Step 1: Generate all signatures in parallel - const signedQuotes = await Promise.all( + const universalOrderResults = await Promise.all( universalQuotes.map(({ data }) => limiter(async () => { const quote = data.quote as OrderRequest @@ -238,40 +275,33 @@ export function useQuoteSignatures(refresh = false) { const _typedData = convertTypeDataToBigInt(typedData) const signature = await signTypedDataAsync(_typedData) - return { quote, signature } + try { + const universalOrder = await universalSdk.submitOrder({ + ...quote, + signature, + }) + + setUniversalSuccessOrders((prev) => { + return [ + ...prev, + { + ...quote, + orderId: universalOrder.order_id, + transactionHash: universalOrder.transaction_hash, + }, + ] + }) + + return { success: true, quote, order: universalOrder } + } catch (error) { + console.error(error) + setUniversalFailedOrders((prev) => [...prev, quote]) + return { success: false, quote, error } + } }) ) ) - // Step 2: Submit all orders in parallel - const universalOrderResults = await Promise.all( - signedQuotes.map(async ({ quote, signature }) => { - try { - const universalOrder = await universalSdk.submitOrder({ - ...quote, - signature, - }) - - setUniversalSuccessOrders((prev) => { - return [ - ...prev, - { - ...quote, - orderId: universalOrder.order_id, - transactionHash: universalOrder.transaction_hash, - }, - ] - }) - - return { success: true, quote, order: universalOrder } - } catch (error) { - console.error(error) - setUniversalFailedOrders((prev) => [...prev, quote]) - return { success: false, quote, error } - } - }) - ) - // Log results for debugging const successfulOrders = universalOrderResults.filter( (result) => result.success @@ -284,8 +314,63 @@ export function useQuoteSignatures(refresh = false) { `Universal orders completed: ${successfulOrders.length} successful, ${failedUniversalOrders.length} failed` ) + // For failed universal orders, use fallback quotes + const fallbackOrderData = ( + await Promise.all( + failedUniversalOrders.map(async ({ quote }) => { + const token = getUniversalTokenAddress(quote.token) + const fallbackQuote = fallbackQuotes[token] + console.log({ fallbackQuote }) + if (!fallbackQuote) { + return null + } + + return await getCowswapPreSignTx({ + chainId, + orderQuote: fallbackQuote, + operation, + address, + }) + }) + ) + ).filter((data) => !!data) + + const fallbackTxData = await Promise.all( + fallbackOrderData.map(async ({ type, data }) => { + if (type === QuoteProvider.CowSwap) { + return [ + operation === 'redeem' + ? await getApprovalCallIfNeeded({ + chainId, + address: address, + token: data.sellToken as Address, + requiredAmount: BigInt(data.amount as string), + spender: COWSWAP_VAULT, + }) + : null, + { + to: COWSWAP_SETTLEMENT, + data: data.preSignTx, + value: 0n, + }, + ].filter((e) => e !== null) + } + return null + }) + ).then((results) => results.filter((data) => data !== null).flat()) + + if (fallbackTxData.length > 0) { + const txBundle = await sendCallsAsync({ + calls: fallbackTxData, + account: address, + forceAtomic: true, + }) + + console.log({ txBundle }) + } + const orderIds = await Promise.all( - validOrderData + [...validOrderData, ...fallbackOrderData] .filter(({ type }) => type === QuoteProvider.CowSwap) .map(async ({ data }) => { const order = data.quote as OrderCreation diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index b870c4950..a0e41fa0b 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -28,6 +28,7 @@ import { cowswapOrderIdsAtom, cowswapOrdersAtom, cowswapOrdersCreatedAtAtom, + fallbackQuotesAtom, mintValueAtom, mintValueUSDAtom, operationAtom, @@ -57,6 +58,7 @@ const CloseButton = () => { const setQuotesAtom = useSetAtom(quotesAtom) const setUniversalSuccessOrdersAtom = useSetAtom(universalSuccessOrdersAtom) const setUniversalFailedOrdersAtom = useSetAtom(universalFailedOrdersAtom) + const setFallbackQuotesAtom = useSetAtom(fallbackQuotesAtom) const handleClose = () => { setTxHashAtom(undefined) @@ -69,6 +71,7 @@ const CloseButton = () => { setCowswapOrdersAtom([]) setUniversalSuccessOrdersAtom([]) setUniversalFailedOrdersAtom([]) + setFallbackQuotesAtom({}) } return ( diff --git a/src/views/index-dtf/issuance/async-swaps/types.ts b/src/views/index-dtf/issuance/async-swaps/types.ts index 5c4eb4a85..ef29b296a 100644 --- a/src/views/index-dtf/issuance/async-swaps/types.ts +++ b/src/views/index-dtf/issuance/async-swaps/types.ts @@ -1,7 +1,6 @@ import { Token } from '@/types' import { EnrichedOrder, OrderQuoteResponse } from '@cowprotocol/cow-sdk' import { Quote } from 'universal-sdk' -import { Address } from 'viem' import { CustomUniversalQuote } from './providers/universal' export enum QuoteProvider { @@ -9,23 +8,27 @@ export enum QuoteProvider { Universal = 'Universal', } +export type CowswapQuote = { + token: Token + success: true + type: QuoteProvider.CowSwap + data: OrderQuoteResponse +} + +export type UniversalQuote = { + token: Token + success: true + type: QuoteProvider.Universal + data: CustomUniversalQuote +} + export type QuoteAggregated = | { token: Token success: false } - | { - token: Token - success: true - type: QuoteProvider.CowSwap - data: OrderQuoteResponse - } - | { - token: Token - success: true - type: QuoteProvider.Universal - data: CustomUniversalQuote - } + | CowswapQuote + | UniversalQuote export type UniversalOrder = Quote & { orderId: string From d7a9955106d724fa2b0dc838c48e8f863e0d3893 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 11:11:52 -0300 Subject: [PATCH 58/85] chore: remove universal failed order component --- .../issuance/async-swaps/collaterals.tsx | 6 -- .../issuance/async-swaps/hooks/useQuote.ts | 31 +------ .../async-swaps/universal-failed-order.tsx | 81 ------------------- 3 files changed, 1 insertion(+), 117 deletions(-) delete mode 100644 src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index f736d43bf..65193f916 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -7,11 +7,9 @@ import { cowswapOrdersAtom, openCollateralPanelAtom, ordersSubmittedAtom, - universalFailedOrdersAtom, universalSuccessOrdersAtom, } from './atom' import CowSwapOrder from './cowswap-order' -import UniversalFailedOrder from './universal-failed-order' import UniversalOrder from './universal-order' const STATUS_PRIORITY: Record = { @@ -35,7 +33,6 @@ const Collaterals = () => { const cowswapOrders = useAtomValue(cowswapOrdersAtom) const ordersSubmitted = useAtomValue(ordersSubmittedAtom) const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) - const universalFailedOrders = useAtomValue(universalFailedOrdersAtom) const open = useAtomValue(openCollateralPanelAtom) const [isVisible, setIsVisible] = useAtom(isVisibleAtom) const [shouldRender, setShouldRender] = useAtom(shouldRenderAtom) @@ -77,9 +74,6 @@ const Collaterals = () => { isVisible ? 'w-[400px]' : 'w-0' )} > - {universalFailedOrders.map((quote, index) => ( - - ))} {sortedCowswapOrderIds.map((orderId) => ( ))} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index ce33e75ba..fc8486bc6 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -489,8 +489,6 @@ export const useRefreshQuotes = () => { const [quotes, setQuotes] = useAtom(quotesAtom) const operation = useAtomValue(operationAtom) const failedOrders = useAtomValue(failedOrdersAtom) - const failedUniversalOrders = useAtomValue(universalFailedOrdersAtom) - const selectedToken = useAtomValue(selectedTokenAtom) const query = useQuery({ queryKey: ['refresh-quotes', failedOrders], @@ -513,34 +511,7 @@ export const useRefreshQuotes = () => { }) }) - // Failed Universal orders are retried through CowSwap as fallback - const universalQuotePromises = failedUniversalOrders.map( - async (order) => { - const token = getUniversalTokenAddress(order.token) - const sellToken = - operation === 'redeem' ? token : selectedToken.address - const buyToken = - operation === 'redeem' ? selectedToken.address : token - const amount = - operation === 'redeem' - ? BigInt(order.pair_token_amount ?? '0') - : BigInt(order.token_amount ?? '0') - - return await getCowswapQuote({ - sellToken: sellToken as Address, - buyToken: buyToken as Address, - amount, - address: address as Address, - operation, - orderBookApi, - }) - } - ) - - const results = await Promise.all([ - ...quotePromises, - ...universalQuotePromises, - ]) + const results = await Promise.all(quotePromises) failedOrders.forEach((order, i) => { setQuotes((prev) => ({ diff --git a/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx deleted file mode 100644 index fd3db462b..000000000 --- a/src/views/index-dtf/issuance/async-swaps/universal-failed-order.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import TokenLogo from '@/components/token-logo' -import Help from '@/components/ui/help' -import { Skeleton } from '@/components/ui/skeleton' -import { indexDTFBasketAtom } from '@/state/dtf/atoms' -import { formatCurrency, formatTokenAmount } from '@/utils' -import { useAtomValue } from 'jotai' -import { useMemo } from 'react' -import { Quote } from 'universal-sdk' -import { formatUnits } from 'viem' -import { operationAtom } from './atom' -import { getUniversalTokenAddress } from './providers/universal' - -const UniversalFailedOrder = ({ quote }: { quote: Quote }) => { - const operation = useAtomValue(operationAtom) - const indexDTFBasket = useAtomValue(indexDTFBasketAtom) - - const { token, firstAmount, secondAmount } = useMemo(() => { - return operation === 'redeem' - ? { - token: quote?.pair_token, - firstAmount: quote?.token_amount, - secondAmount: quote?.pair_token_amount, - } - : { - token: getUniversalTokenAddress(quote?.token), - firstAmount: quote?.token_amount, - secondAmount: quote?.pair_token_amount, - } - }, [quote, operation]) - - return ( -
-
- t.address === token)?.symbol || '' - } - size="xl" - /> -
- {secondAmount ? ( -
- {operation === 'mint' ? '-' : '+'}{' '} - {formatCurrency(Number(formatUnits(BigInt(secondAmount), 6)))}{' '} - USDC -
- ) : ( - - )} - {firstAmount ? ( -
- {operation === 'mint' ? '+' : '-'}{' '} - {formatTokenAmount( - Number( - formatUnits( - BigInt(firstAmount), - indexDTFBasket?.find((t) => t.address === token) - ?.decimals || 18 - ) - ) - )}{' '} - {indexDTFBasket?.find((t) => t.address === token)?.symbol || ''} -
- ) : ( - - )} -
-
-
- Not Filled - -
-
- ) -} - -export default UniversalFailedOrder From a829a0eb35476778ce6c9832b66c5447241227ea Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 11:26:13 -0300 Subject: [PATCH 59/85] fix: styles --- src/views/index-dtf/issuance/async-swaps/collaterals.tsx | 5 ++++- .../issuance/async-swaps/hooks/useQuoteSignatures.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx index 65193f916..b950a698e 100644 --- a/src/views/index-dtf/issuance/async-swaps/collaterals.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collaterals.tsx @@ -6,6 +6,7 @@ import { cowswapOrderIdsAtom, cowswapOrdersAtom, openCollateralPanelAtom, + operationAtom, ordersSubmittedAtom, universalSuccessOrdersAtom, } from './atom' @@ -29,6 +30,7 @@ export const showCollateralsAtom = atom((get) => { }) const Collaterals = () => { + const operation = useAtomValue(operationAtom) const cowswapOrderIds = useAtomValue(cowswapOrderIdsAtom) const cowswapOrders = useAtomValue(cowswapOrdersAtom) const ordersSubmitted = useAtomValue(ordersSubmittedAtom) @@ -71,7 +73,8 @@ const Collaterals = () => {
{sortedCowswapOrderIds.map((orderId) => ( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 60cb2fb0a..011eee079 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -32,7 +32,7 @@ import { CustomUniversalQuote, getUniversalTokenAddress, } from '../providers/universal' -import { CowswapQuote, QuoteProvider } from '../types' +import { QuoteProvider } from '../types' import { convertTypeDataToBigInt, getApprovalCallIfNeeded } from './utils' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const From f922e6844d49696b3ce6b2e711777aa450985866 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 12:09:47 -0300 Subject: [PATCH 60/85] chore: redeem --- .../async-redeem/submit-redeem-orders.tsx | 85 ++++++++++++------- .../index-dtf/issuance/async-swaps/atom.ts | 4 +- .../async-swaps/collateral-acquisition.tsx | 45 +++++++--- .../issuance/async-swaps/hooks/useQuote.ts | 22 +++-- .../issuance/async-swaps/universal-order.tsx | 5 +- 5 files changed, 110 insertions(+), 51 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx index f6ca892eb..3d38cdee0 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx @@ -3,44 +3,71 @@ import { cn } from '@/lib/utils' import { useAtomValue } from 'jotai' import { redeemAssetsAtom } from '../atom' import { useQuoteSignatures } from '../hooks/useQuoteSignatures' +import { useMemo } from 'react' type SubmitRedeemOrdersProps = { loadingQuote?: boolean } -const SubmitRedeemOrders = ({ loadingQuote }: SubmitRedeemOrdersProps) => { +const SubmitRedeemButton = ({ + mutate, + isPending, + loadingQuote, +}: { + mutate: () => void + isPending: boolean + loadingQuote?: boolean +}) => { const redeemAssets = useAtomValue(redeemAssetsAtom) - const { mutate, isPending } = useQuoteSignatures() - const disabled = - isPending || - loadingQuote || - !redeemAssets || - Object.keys(redeemAssets).length === 0 + const disabled = useMemo( + () => + isPending || + loadingQuote || + !redeemAssets || + Object.keys(redeemAssets).length === 0, + [isPending, loadingQuote, redeemAssets] + ) + + const buttonText = useMemo(() => { + if (loadingQuote) { + return 'Awaiting Quote' + } + if (isPending) { + return 'Signing...' + } + return ( + + Sell Collateral for USDC + - Step 2/2 + + ) + }, [isPending, loadingQuote]) + + return ( + + ) +} + +const SubmitRedeemOrders = ({ loadingQuote }: SubmitRedeemOrdersProps) => { + const { mutate, isPending } = useQuoteSignatures() return ( -
- -
+ ) } diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 435418f82..994543b29 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -77,11 +77,9 @@ export const insufficientBalanceAtom = atom((get) => { export const collateralAcquiredAtom = atom((get) => { const cowswapOrders = get(cowswapOrdersAtom) - const universalFailedOrders = get(universalFailedOrdersAtom) return ( cowswapOrders.length > 0 && - cowswapOrders.every((order) => order.status === OrderStatus.FULFILLED) && - universalFailedOrders.length === 0 + cowswapOrders.every((order) => order.status === OrderStatus.FULFILLED) ) }) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 4f570ce1e..3f855b0da 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -41,10 +41,26 @@ const OpenCollateralPanel = () => { ) } -const RequoteFailedOrders = () => { - const { isFetching } = useRefreshQuotes() +const RequoteFailedOrdersButton = ({ + mutate, + isPending, + isFetching, +}: { + mutate: () => void + isPending: boolean + isFetching: boolean +}) => { const failedOrdersQty = useAtomValue(failedOrdersAtom).length - const { mutate: signQuotes, isPending: isSigning } = useQuoteSignatures(true) + + const buttonText = useMemo(() => { + if (isFetching) { + return 'Awaiting Quotes' + } + if (isPending) { + return 'Signing...' + } + return 'Accept New Quotes' + }, [isFetching, isPending]) return (
@@ -65,19 +81,28 @@ const RequoteFailedOrders = () => {
) } +const RequoteFailedOrders = () => { + const { isFetching } = useRefreshQuotes() + const { mutate: signQuotes, isPending: isSigning } = useQuoteSignatures(true) + + return ( + + ) +} + const CollateralAcquisition = () => { const operation = useAtomValue(operationAtom) const cowswapOrdersCreatedAt = useAtomValue(cowswapOrdersCreatedAtAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts index fc8486bc6..646f5fc85 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuote.ts @@ -23,7 +23,6 @@ import { redeemAssetsAtom, refetchQuotesAtom, selectedTokenAtom, - universalFailedOrdersAtom, } from '../atom' import { UniversalRelayerWithRateLimiter, @@ -31,7 +30,6 @@ import { } from '../providers/GlobalProtocolKitProvider' import { CustomUniversalQuote, - getUniversalTokenAddress, getUniversalTokenName, } from '../providers/universal' import { QuoteProvider } from '../types' @@ -118,7 +116,9 @@ async function getUniversalQuote({ universalSdk: UniversalRelayerWithRateLimiter }) { try { - const universalAsset = getUniversalTokenName(buyToken) + const universalAsset = getUniversalTokenName( + operation === 'redeem' ? sellToken : buyToken + ) const universalQuote = await universalSdk.getQuote({ type: operation === 'redeem' ? 'SELL' : 'BUY', blockchain: 'BASE', @@ -133,10 +133,16 @@ async function getUniversalQuote({ _originalQuote: universalQuote, buyToken, sellToken, - type: 'BUY', + type: operation === 'redeem' ? 'SELL' : 'BUY', userAddress: address, - sellAmount: BigInt(universalQuote.pair_token_amount ?? '0'), - buyAmount: amount, + sellAmount: + operation === 'redeem' + ? amount + : BigInt(universalQuote.pair_token_amount ?? '0'), + buyAmount: + operation === 'redeem' + ? BigInt(universalQuote.pair_token_amount ?? '0') + : amount, validTo: Number(universalQuote.deadline ?? 0), } return customQuote @@ -181,7 +187,9 @@ async function getQuote({ } // Try Universal first if available - const universalAsset = getUniversalTokenName(buyToken) + const universalAsset = getUniversalTokenName( + operation === 'redeem' ? sellToken : buyToken + ) const hasMinValue = quoteValue && quoteValue > MIN_UNIVERSAL_QUOTE_VALUE_USD let universalQuote: CustomUniversalQuote | null = null diff --git a/src/views/index-dtf/issuance/async-swaps/universal-order.tsx b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx index dd477e103..0078d2c13 100644 --- a/src/views/index-dtf/issuance/async-swaps/universal-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/universal-order.tsx @@ -18,14 +18,15 @@ const UniversalOrder = ({ order }: { order: UniversalOrderType }) => { const indexDTFBasket = useAtomValue(indexDTFBasketAtom) const chainId = useAtomValue(chainIdAtom) const { token, firstAmount, secondAmount } = useMemo(() => { + const token = getUniversalTokenAddress(order?.token) return operation === 'redeem' ? { - token: order?.pair_token, + token, firstAmount: order?.token_amount, secondAmount: order?.pair_token_amount, } : { - token: getUniversalTokenAddress(order?.token), + token, firstAmount: order?.token_amount, secondAmount: order?.pair_token_amount, } From b3319b7de56c315fc039c9a034dcaafbe837bf0c Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 15:10:32 -0300 Subject: [PATCH 61/85] fix: unintentional refersh --- .../async-mint/submit-mint-orders.tsx | 6 ++--- .../async-swaps/async-redeem/index.tsx | 7 ++++- .../async-redeem/submit-redeem-orders.tsx | 6 ++--- .../index-dtf/issuance/async-swaps/atom.ts | 17 +++++++++++- .../async-swaps/collateral-acquisition.tsx | 5 ++-- .../issuance/async-swaps/hooks/useQuote.ts | 2 +- .../async-swaps/hooks/useQuoteSignatures.ts | 27 +++++++++++++++++-- 7 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 748431275..47ef6144e 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -1,9 +1,9 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { useQuoteSignatures } from '../hooks/useQuoteSignatures' -import { insufficientBalanceAtom, userInputAtom } from '../atom' import { useAtomValue } from 'jotai' import { useMemo } from 'react' +import { insufficientBalanceAtom, userInputAtom } from '../atom' +import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' type SubmitMintProps = { loadingQuote?: boolean @@ -62,7 +62,7 @@ const SubmitMintButton = ({ } const SubmitMint = ({ loadingQuote }: SubmitMintProps) => { - const { mutate, isPending } = useQuoteSignatures() + const { mutate, isPending } = useStableQuoteSignatures() return ( {
({ + ...r, + chain: indexDTF.chainId, + }))} size={24} + overlap={-2} reverseStack + outsource />
diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx index 3d38cdee0..0a54b3e12 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx @@ -1,9 +1,9 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' import { useAtomValue } from 'jotai' -import { redeemAssetsAtom } from '../atom' -import { useQuoteSignatures } from '../hooks/useQuoteSignatures' import { useMemo } from 'react' +import { redeemAssetsAtom } from '../atom' +import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' type SubmitRedeemOrdersProps = { loadingQuote?: boolean @@ -60,7 +60,7 @@ const SubmitRedeemButton = ({ } const SubmitRedeemOrders = ({ loadingQuote }: SubmitRedeemOrdersProps) => { - const { mutate, isPending } = useQuoteSignatures() + const { mutate, isPending } = useStableQuoteSignatures() return ( ('mint') export const userInputAtom = atomWithReset('') export const indexDTFBalanceAtom = atom(0n) -export const txHashAtom = atom(undefined) // tx hash for minting or redeeming +export const txHashAtom = atom('') // tx hash for minting or redeeming export const redeemAssetsAtom = atom>({}) export const quotesAtom = atom>({}) export const fallbackQuotesAtom = atom>({}) @@ -138,3 +138,18 @@ export const ordersSubmittedAtom = atom((get) => { const cowswapOrdersCreatedAt = get(cowswapOrdersCreatedAtAtom) return Boolean(cowswapOrdersCreatedAt) }) + +// Global processing state atoms to persist progress across re-renders +export const processingStateAtom = atom<{ + isProcessing: boolean + step: 'preparing' | 'signing' | 'submitting' | 'complete' | 'error' + progress: number + message: string +}>({ + isProcessing: false, + step: 'preparing', + progress: 0, + message: '', +}) + +export const processingErrorAtom = atom(null) diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 3f855b0da..71957d8d6 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -15,7 +15,7 @@ import { successAtom, } from './atom' import { useRefreshQuotes } from './hooks/useQuote' -import { useQuoteSignatures } from './hooks/useQuoteSignatures' +import { useStableQuoteSignatures } from './hooks/useQuoteSignatures' import MintButton from './mint-button' const OpenCollateralPanel = () => { @@ -92,7 +92,8 @@ const RequoteFailedOrdersButton = ({ const RequoteFailedOrders = () => { const { isFetching } = useRefreshQuotes() - const { mutate: signQuotes, isPending: isSigning } = useQuoteSignatures(true) + const { mutate: signQuotes, isPending: isSigning } = + useStableQuoteSignatures(true) return ( { ) const query = useQuery({ - queryKey: ['quotes/redeem', assets, redeemAssets], + queryKey: ['quotes/redeem', assets], queryFn: async ({ signal }) => { if ( !redeemAssets || diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 011eee079..c5723d81d 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -11,6 +11,7 @@ import { import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import pLimit from 'p-limit' +import { useCallback, useRef } from 'react' import { generateTypedData, OrderRequest, Quote } from 'universal-sdk' import { Address, encodeFunctionData, Hex, maxUint256, parseUnits } from 'viem' import { useSendCalls, useSignTypedData } from 'wagmi' @@ -149,6 +150,7 @@ export function useQuoteSignatures(refresh = false) { JSON.stringify(quotes, (_, value) => typeof value === 'bigint' ? value.toString() : value ), + refresh, ], mutationFn: async () => { if (!address || !orderBookApi || !chainId || !indexDTF || !universalSdk) { @@ -394,11 +396,11 @@ export function useQuoteSignatures(refresh = false) { ), ...orderIds, ]) - setCowswapOrders((prev) => ({ + setCowswapOrders((prev) => [ ...prev.filter( (o) => !failedOrders.map((fo) => fo.orderId).includes(o.orderId) ), - })) + ]) } else { setCowswapOrderIds(orderIds) } @@ -412,5 +414,26 @@ export function useQuoteSignatures(refresh = false) { onError(error) { console.error(error) }, + retry: false, + retryDelay: 0, + gcTime: 5 * 60 * 1000, }) } + +// Custom hook to stabilize dependencies +export const useStableQuoteSignatures = (refresh = false) => { + const { mutate, isPending } = useQuoteSignatures(refresh) + + // Use useRef to maintain a stable reference to mutate + const mutateRef = useRef(mutate) + mutateRef.current = mutate + + const stableMutate = useCallback(() => { + mutateRef.current() + }, []) + + return { + mutate: stableMutate, + isPending, + } +} From f4b394dfd1524f28d1dcb42d8cb6e7191a7f2bac Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 15:46:04 -0300 Subject: [PATCH 62/85] fix: unintentional refersh & icons --- .../async-swaps/collateral-acquisition.tsx | 9 +- .../async-swaps/hooks/useGetMintTx.ts | 89 +++++++++++++++++++ .../async-swaps/hooks/useQuoteSignatures.ts | 6 +- 3 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts diff --git a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx index 71957d8d6..90cc42708 100644 --- a/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx +++ b/src/views/index-dtf/issuance/async-swaps/collateral-acquisition.tsx @@ -1,6 +1,6 @@ import StackTokenLogo from '@/components/token-logo/StackTokenLogo' import { Button } from '@/components/ui/button' -import { indexDTFBasketAtom } from '@/state/dtf/atoms' +import { indexDTFAtom, indexDTFBasketAtom } from '@/state/dtf/atoms' import { getTimerFormat } from '@/utils' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, ArrowRight, Check, Loader, RefreshCw } from 'lucide-react' @@ -19,6 +19,7 @@ import { useStableQuoteSignatures } from './hooks/useQuoteSignatures' import MintButton from './mint-button' const OpenCollateralPanel = () => { + const indexDTF = useAtomValue(indexDTFAtom) const basket = useAtomValue(indexDTFBasketAtom) const [open, setOpen] = useAtom(openCollateralPanelAtom) @@ -31,10 +32,14 @@ const OpenCollateralPanel = () => { > {open && } ({ + ...token, + chain: indexDTF?.chainId, + }))} size={16} overlap={4} reverseStack + outsource /> {!open && } diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts new file mode 100644 index 000000000..026aedc96 --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts @@ -0,0 +1,89 @@ +import { indexDTFAtom } from '@/state/dtf/atoms' +import { walletAtom } from '@/state/atoms' +import { useAtomValue } from 'jotai' +import { useEffect, useState } from 'react' +import { Address, parseEventLogs, zeroAddress } from 'viem' +import { usePublicClient } from 'wagmi' +import dtfIndexAbi from '@/abis/dtf-index-abi' + +export const useGetMintTx = () => { + const [mintTxHash, setMintTxHash] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const indexDTF = useAtomValue(indexDTFAtom) + const walletAddress = useAtomValue(walletAtom) + const publicClient = usePublicClient() + + useEffect(() => { + if (!indexDTF?.id || !walletAddress || !publicClient) { + return + } + + setIsLoading(true) + + const checkForMintEvents = async () => { + try { + // Get the latest block number + const latestBlock = await publicClient.getBlockNumber() + + // Look back 100 blocks for Transfer events + const fromBlock = latestBlock - 100n + + const logs = await publicClient.getLogs({ + address: indexDTF.id as Address, + event: { + type: 'event', + name: 'Transfer', + inputs: [ + { type: 'address', name: 'from', indexed: true }, + { type: 'address', name: 'to', indexed: true }, + { type: 'uint256', name: 'value', indexed: false }, + ], + }, + fromBlock, + toBlock: latestBlock, + }) + + // Filter for Transfer events from zero address to connected wallet + const mintEvents = logs.filter((log) => { + const parsedLog = parseEventLogs({ + abi: dtfIndexAbi, + logs: [log], + eventName: 'Transfer', + })[0] + + return ( + parsedLog && + parsedLog.args.from === zeroAddress && + parsedLog.args.to === walletAddress && + parsedLog.args.value > 0n + ) + }) + + if (mintEvents.length > 0) { + // Get the most recent mint event + const latestMintEvent = mintEvents[mintEvents.length - 1] + setMintTxHash(latestMintEvent.transactionHash) + } + } catch (error) { + console.error('Error checking for mint events:', error) + } finally { + setIsLoading(false) + } + } + + // Check immediately + checkForMintEvents() + + // Set up polling every 5 seconds + const interval = setInterval(checkForMintEvents, 5000) + + return () => { + clearInterval(interval) + } + }, [indexDTF?.id, walletAddress, publicClient]) + + return { + mintTxHash, + isLoading, + } +} diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index c5723d81d..e36e0046c 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -273,11 +273,11 @@ export function useQuoteSignatures(refresh = false) { universalQuotes.map(({ data }) => limiter(async () => { const quote = data.quote as OrderRequest - const { typedData } = await generateTypedData(quote) - const _typedData = convertTypeDataToBigInt(typedData) - const signature = await signTypedDataAsync(_typedData) try { + const { typedData } = await generateTypedData(quote) + const _typedData = convertTypeDataToBigInt(typedData) + const signature = await signTypedDataAsync(_typedData) const universalOrder = await universalSdk.submitOrder({ ...quote, signature, From f2d5d6334416238102ccd21745ec8f0eb0b5cc5b Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 15:50:16 -0300 Subject: [PATCH 63/85] fix: flaky mint event listening --- .../issuance/async-swaps/hooks/useGetMintTx.ts | 8 ++++---- .../index-dtf/issuance/async-swaps/mint-button.tsx | 13 +++++++++++++ .../index-dtf/issuance/async-swaps/success.tsx | 6 +++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts index 026aedc96..1f27129c7 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useGetMintTx.ts @@ -25,8 +25,8 @@ export const useGetMintTx = () => { // Get the latest block number const latestBlock = await publicClient.getBlockNumber() - // Look back 100 blocks for Transfer events - const fromBlock = latestBlock - 100n + // Look back 10 blocks for Transfer events + const fromBlock = latestBlock - 10n const logs = await publicClient.getLogs({ address: indexDTF.id as Address, @@ -74,8 +74,8 @@ export const useGetMintTx = () => { // Check immediately checkForMintEvents() - // Set up polling every 5 seconds - const interval = setInterval(checkForMintEvents, 5000) + // Set up polling every 2 seconds + const interval = setInterval(checkForMintEvents, 2000) return () => { clearInterval(interval) diff --git a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx index ef8fe37ab..5c11c8c11 100644 --- a/src/views/index-dtf/issuance/async-swaps/mint-button.tsx +++ b/src/views/index-dtf/issuance/async-swaps/mint-button.tsx @@ -12,6 +12,7 @@ import { encodeFunctionData, erc20Abi, maxUint256, parseEther } from 'viem' import { useSendCalls, useWaitForCallsStatus } from 'wagmi' import { isMintingAtom, txHashAtom, mintValueAtom, successAtom } from './atom' import { useFolioDetails } from './hooks/useFolioDetails' +import { useGetMintTx } from './hooks/useGetMintTx' const MintButton = () => { const account = useAtomValue(walletAtom) @@ -31,6 +32,9 @@ const MintButton = () => { id: data?.id || '', }) + // New hook to detect mint events from Transfer logs + const { mintTxHash: eventMintTxHash } = useGetMintTx() + const { data: balanceData, isFetching: isFetchingBalanceData } = useERC20Balances( folioDetails?.assets.map((address) => ({ @@ -123,6 +127,15 @@ const MintButton = () => { } }, [callsStatus?.receipts, callsStatus?.status]) + // New effect to handle mint detection from Transfer events + useEffect(() => { + if (eventMintTxHash && isMinting) { + setMintTxHash(eventMintTxHash) + setSuccess(true) + setIsMinting(false) + } + }, [eventMintTxHash, isMinting, setMintTxHash, setSuccess, setIsMinting]) + useEffect(() => { if (isError) { setIsMinting(false) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index a0e41fa0b..2dd826aac 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -125,10 +125,14 @@ const SuccessHeader = () => { onClick={() => setViewTransactions(true)} > ({ + ...token, + chain: indexDTF?.chainId, + }))} size={16} overlap={4} reverseStack + outsource /> All Txs From ccf2f14c05808083acf60b12f0457c2e31f05d9a Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 15:59:37 -0300 Subject: [PATCH 64/85] chore: adjust styles --- src/views/index-dtf/issuance/async-swaps/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 498ce284e..caee9d35f 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -169,7 +169,7 @@ const AsyncSwaps = () => { return (
-
+
From 4aef284fbaecd1cd0a126c2723361399a56aa8fa Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 25 Jun 2025 16:33:16 -0300 Subject: [PATCH 65/85] chore: add retries --- .../index-dtf/issuance/async-swaps/atom.ts | 15 ---- .../async-swaps/hooks/useQuoteSignatures.ts | 40 +++++---- .../issuance/async-swaps/hooks/utils.ts | 90 +++++++++++++++++++ 3 files changed, 113 insertions(+), 32 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index af99faedb..794b72e83 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -138,18 +138,3 @@ export const ordersSubmittedAtom = atom((get) => { const cowswapOrdersCreatedAt = get(cowswapOrdersCreatedAtAtom) return Boolean(cowswapOrdersCreatedAt) }) - -// Global processing state atoms to persist progress across re-renders -export const processingStateAtom = atom<{ - isProcessing: boolean - step: 'preparing' | 'signing' | 'submitting' | 'complete' | 'error' - progress: number - message: string -}>({ - isProcessing: false, - step: 'preparing', - progress: 0, - message: '', -}) - -export const processingErrorAtom = atom(null) diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index e36e0046c..8a78e83ca 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -34,7 +34,12 @@ import { getUniversalTokenAddress, } from '../providers/universal' import { QuoteProvider } from '../types' -import { convertTypeDataToBigInt, getApprovalCallIfNeeded } from './utils' +import { + convertTypeDataToBigInt, + getApprovalCallIfNeeded, + sendCallsWithRetry, + signTypedDataWithRetry, +} from './utils' const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const const COWSWAP_VAULT = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const @@ -255,13 +260,11 @@ export function useQuoteSignatures(refresh = false) { } if (txData.length > 0) { - const txBundle = await sendCallsAsync({ - calls: txData, - account: address, - forceAtomic: true, - }) - - console.log({ txBundle }) + try { + await sendCallsWithRetry(sendCallsAsync, txData, address) + } catch (error) { + console.error('sendCallsAsync', error) + } } // Separate signature generation from order submission to optimize performance @@ -277,7 +280,12 @@ export function useQuoteSignatures(refresh = false) { try { const { typedData } = await generateTypedData(quote) const _typedData = convertTypeDataToBigInt(typedData) - const signature = await signTypedDataAsync(_typedData) + + const signature = await signTypedDataWithRetry( + signTypedDataAsync, + _typedData + ) + const universalOrder = await universalSdk.submitOrder({ ...quote, signature, @@ -296,7 +304,7 @@ export function useQuoteSignatures(refresh = false) { return { success: true, quote, order: universalOrder } } catch (error) { - console.error(error) + console.error('universalOrder', error) setUniversalFailedOrders((prev) => [...prev, quote]) return { success: false, quote, error } } @@ -362,13 +370,11 @@ export function useQuoteSignatures(refresh = false) { ).then((results) => results.filter((data) => data !== null).flat()) if (fallbackTxData.length > 0) { - const txBundle = await sendCallsAsync({ - calls: fallbackTxData, - account: address, - forceAtomic: true, - }) - - console.log({ txBundle }) + try { + await sendCallsWithRetry(sendCallsAsync, fallbackTxData, address) + } catch (error) { + console.error('sendCallsAsync', error) + } } const orderIds = await Promise.all( diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts index d2fce30cb..3f8db577b 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -89,3 +89,93 @@ export async function getAssetPrice( const data = (await response.json()) as TokenPrice[] return data[0] } + +// Function to handle sendCallsAsync with retry logic for user rejections +export const sendCallsWithRetry = async ( + sendCallsAsync: any, + calls: any[], + account: Address, + maxRetries: number = 2 +) => { + let lastError: Error | null = null + + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + const txBundle = await sendCallsAsync({ + calls, + account, + forceAtomic: true, + }) + console.log({ txBundle }) + return txBundle + } catch (error) { + lastError = error as Error + + // Check if it's a user rejection error + if ( + error instanceof Error && + error.message.includes('User rejected transaction') + ) { + console.log( + `User rejected transaction (attempt ${attempt + 1}/${maxRetries + 1})` + ) + + // If this was the last attempt, throw the error + if (attempt === maxRetries) { + throw new Error('USER_CANCELLED_TX') + } + + // Otherwise, continue to next attempt + continue + } + + // For other errors, throw immediately + throw error + } + } + + // This should never be reached, but just in case + throw lastError || new Error('Unknown error in sendCallsWithRetry') +} + +// Function to handle signTypedDataAsync with retry logic for user rejections +export const signTypedDataWithRetry = async ( + signTypedDataAsync: any, + typedData: any, + maxRetries: number = 2 +) => { + let lastError: Error | null = null + + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + const signature = await signTypedDataAsync(typedData) + return signature + } catch (error) { + lastError = error as Error + + // Check if it's a user rejection error + if ( + error instanceof Error && + error.message.includes('User rejected signature') + ) { + console.log( + `User rejected signature (attempt ${attempt + 1}/${maxRetries + 1})` + ) + + // If this was the last attempt, throw the error + if (attempt === maxRetries) { + throw new Error('USER_CANCELLED_SIGNATURE') + } + + // Otherwise, continue to next attempt + continue + } + + // For other errors, throw immediately + throw error + } + } + + // This should never be reached, but just in case + throw lastError || new Error('Unknown error in signTypedDataWithRetry') +} From e0cdb76263bc0b3fe723bf076f287c89c41a305b Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 26 Jun 2025 11:11:12 -0300 Subject: [PATCH 66/85] chore: add info and warning msg --- .../async-mint/submit-mint-orders.tsx | 12 ++- .../async-redeem/submit-redeem-orders.tsx | 8 +- .../index-dtf/issuance/async-swaps/atom.ts | 2 + .../issuance/async-swaps/cowswap-order.tsx | 2 +- .../async-swaps/hooks/useQuoteSignatures.ts | 79 +++++++++++++++---- .../issuance/async-swaps/hooks/utils.ts | 61 +++++++++++++- 6 files changed, 143 insertions(+), 21 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 47ef6144e..3030364b4 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -2,7 +2,11 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' import { useAtomValue } from 'jotai' import { useMemo } from 'react' -import { insufficientBalanceAtom, userInputAtom } from '../atom' +import { + infoMessageAtom, + insufficientBalanceAtom, + userInputAtom, +} from '../atom' import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' type SubmitMintProps = { @@ -21,6 +25,7 @@ const SubmitMintButton = ({ }) => { const insufficientBalance = useAtomValue(insufficientBalanceAtom) const inputAmount = useAtomValue(userInputAtom) + const infoMessage = useAtomValue(infoMessageAtom) const disabled = useMemo( () => @@ -32,6 +37,9 @@ const SubmitMintButton = ({ if (loadingQuote) { return 'Awaiting Quote' } + if (infoMessage) { + return infoMessage + } if (isPending) { return 'Signing...' } @@ -44,7 +52,7 @@ const SubmitMintButton = ({ - Step 1/2 ) - }, [insufficientBalance, isPending, loadingQuote]) + }, [insufficientBalance, isPending, loadingQuote, infoMessage]) return (
+ } + > + + + } + /> } /> } /> } /> diff --git a/vite.config.ts b/vite.config.ts index ecfa6f09b..1f27a7de0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,7 +5,6 @@ import viteTsconfigPaths from 'vite-tsconfig-paths' import path from 'path' import { lingui } from '@lingui/vite-plugin' import { viteStaticCopy } from 'vite-plugin-static-copy' -import { nodePolyfills } from 'vite-plugin-node-polyfills' // https://vitejs.dev/config/ export default defineConfig({ @@ -54,10 +53,6 @@ export default defineConfig({ }) }, }, - // Polyfills for node modules - @cowprotocol/cow-sdk needs it - nodePolyfills({ - protocolImports: true, - }), sentryVitePlugin({ org: 'abc-labs-0g', project: 'register', @@ -82,6 +77,8 @@ export default defineConfig({ __dirname, 'node_modules/@uniswap/uniswapx-sdk/dist/src/index.js' ), + // Polyfills for node modules - @cowprotocol/cow-sdk needs it + 'node-fetch': 'cross-fetch', }, }, optimizeDeps: { From 4b0b7be6a3e7564fe9fe7f3325b0a257f7810aa3 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 26 Jun 2025 15:23:47 -0300 Subject: [PATCH 71/85] chore: improve balance after and before --- .../async-mint/submit-mint-orders.tsx | 15 +++- .../async-redeem/submit-redeem-orders.tsx | 20 ++++- .../index-dtf/issuance/async-swaps/atom.ts | 21 ++++- .../issuance/async-swaps/success.tsx | 88 ++++++++----------- 4 files changed, 83 insertions(+), 61 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index 3030364b4..fc4ea6114 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -1,10 +1,12 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { useAtomValue } from 'jotai' -import { useMemo } from 'react' +import { useAtomValue, useSetAtom } from 'jotai' +import { useCallback, useMemo } from 'react' import { + balanceAfterSwapAtom, infoMessageAtom, insufficientBalanceAtom, + selectedTokenBalanceAtom, userInputAtom, } from '../atom' import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' @@ -24,8 +26,15 @@ const SubmitMintButton = ({ loadingQuote?: boolean }) => { const insufficientBalance = useAtomValue(insufficientBalanceAtom) + const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const inputAmount = useAtomValue(userInputAtom) const infoMessage = useAtomValue(infoMessageAtom) + const setBalanceAfterSwap = useSetAtom(balanceAfterSwapAtom) + + const handleSubmit = useCallback(() => { + setBalanceAfterSwap(selectedTokenBalance?.value || 0n) + mutate() + }, [mutate, selectedTokenBalance?.value, setBalanceAfterSwap]) const disabled = useMemo( () => @@ -61,7 +70,7 @@ const SubmitMintButton = ({ 'w-full rounded-xl', isPending && 'opacity-50 cursor-not-allowed' )} - onClick={() => mutate()} + onClick={handleSubmit} disabled={disabled} > {buttonText} diff --git a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx index 48674e532..aed9f8fea 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-redeem/submit-redeem-orders.tsx @@ -1,8 +1,13 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { useAtomValue } from 'jotai' -import { useMemo } from 'react' -import { infoMessageAtom, redeemAssetsAtom } from '../atom' +import { useAtomValue, useSetAtom } from 'jotai' +import { useCallback, useMemo } from 'react' +import { + balanceAfterSwapAtom, + infoMessageAtom, + redeemAssetsAtom, + selectedTokenBalanceAtom, +} from '../atom' import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' type SubmitRedeemOrdersProps = { @@ -18,8 +23,15 @@ const SubmitRedeemButton = ({ isPending: boolean loadingQuote?: boolean }) => { + const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const redeemAssets = useAtomValue(redeemAssetsAtom) const infoMessage = useAtomValue(infoMessageAtom) + const setBalanceAfterSwap = useSetAtom(balanceAfterSwapAtom) + + const handleSubmit = useCallback(() => { + setBalanceAfterSwap(selectedTokenBalance?.value || 0n) + mutate() + }, [mutate, selectedTokenBalance?.value, setBalanceAfterSwap]) const disabled = useMemo( () => @@ -55,7 +67,7 @@ const SubmitRedeemButton = ({ 'w-full rounded-xl', isPending && 'opacity-50 cursor-not-allowed' )} - onClick={() => mutate()} + onClick={handleSubmit} disabled={disabled} > {buttonText} diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index a4f83f94e..5a0038065 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -10,7 +10,7 @@ import { import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' import { Quote } from 'universal-sdk' -import { Address, parseEther, parseUnits } from 'viem' +import { Address, formatUnits, parseEther, parseUnits } from 'viem' import { AsyncSwapOrderResponse, QuoteAggregated, @@ -46,6 +46,8 @@ export const universalSuccessOrdersAtom = atom([]) export const infoMessageAtom = atom(undefined) +export const balanceAfterSwapAtom = atom(0n) + // Render Atoms export const openCollateralPanelAtom = atom(true) export const showSettingsAtom = atom(false) @@ -99,9 +101,10 @@ export const mintValueUSDAtom = atom((get) => { return (Number(inputAmount) || 0) * (1 - ASYNC_SWAP_BUFFER) }) -export const bufferValueAtom = atom((get) => { +export const savedAmountAtom = atom((get) => { const inputAmount = get(userInputAtom) - return (Number(inputAmount) || 0) * ASYNC_SWAP_BUFFER + const balanceDifference = get(balanceDifferenceAtom) + return (Number(inputAmount) || 0) - balanceDifference }) export const mintValueWeiAtom = atom((get) => { @@ -139,3 +142,15 @@ export const ordersSubmittedAtom = atom((get) => { const cowswapOrdersCreatedAt = get(cowswapOrdersCreatedAtAtom) return Boolean(cowswapOrdersCreatedAt) }) + +export const balanceDifferenceAtom = atom((get) => { + const selectedToken = get(selectedTokenAtom) + const balanceAfterSwap = get(balanceAfterSwapAtom) + const selectedTokenBalance = get(selectedTokenBalanceAtom) + const operation = get(operationAtom) + const result = + operation === 'mint' + ? balanceAfterSwap - (selectedTokenBalance?.value || 0n) + : selectedTokenBalance?.value || 0n - balanceAfterSwap + return Number(formatUnits(result, selectedToken.decimals)) +}) diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 546c38f49..2d7a5099b 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -9,7 +9,12 @@ import { indexDTFBasketAtom, indexDTFPriceAtom, } from '@/state/dtf/atoms' -import { formatCurrency, formatTokenAmount, shortenAddress } from '@/utils' +import { + formatCurrency, + formatPercentage, + formatTokenAmount, + shortenAddress, +} from '@/utils' import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { @@ -24,7 +29,7 @@ import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { formatUnits } from 'viem' import { - bufferValueAtom, + balanceDifferenceAtom, cowswapOrderIdsAtom, cowswapOrdersAtom, cowswapOrdersCreatedAtAtom, @@ -34,6 +39,7 @@ import { operationAtom, quotesAtom, redeemAssetsAtom, + savedAmountAtom, selectedTokenAtom, successAtom, txHashAtom, @@ -144,14 +150,15 @@ const DTFAmount = () => { const chainId = useAtomValue(chainIdAtom) const indexDTF = useAtomValue(indexDTFAtom) const indexDTFPrice = useAtomValue(indexDTFPriceAtom) - const inputAmountUSD = useAtomValue(mintValueUSDAtom) + const balanceDifference = useAtomValue(balanceDifferenceAtom) const operation = useAtomValue(operationAtom) const sharesRedeemed = useAtomValue(userInputAtom) const mintValue = useAtomValue(mintValueAtom) - const valueMinted = (indexDTFPrice || 0) * mintValue - const priceImpact = inputAmountUSD - ? ((valueMinted * 100) / inputAmountUSD - 100).toFixed(2) + const valueRedeemed = (indexDTFPrice || 0) * Number(sharesRedeemed) + + const priceImpact = balanceDifference + ? (valueMinted * 100) / balanceDifference - 100 : 0 return ( @@ -176,44 +183,27 @@ const DTFAmount = () => { className="rounded-full" />
- {operation === 'mint' && ( -
- ${formatCurrency(valueMinted)}{' '} - ({priceImpact}%) -
- )} +
+ ${formatCurrency(operation === 'mint' ? valueMinted : valueRedeemed)}{' '} + {operation === 'mint' && ( + + ({formatPercentage(priceImpact)}) + + )} +
) } -const USDCReceivedOnRedeem = () => { - const cowswapOrders = useAtomValue(cowswapOrdersAtom) - const selectedToken = useAtomValue(selectedTokenAtom) - const assetsRedeemed = useAtomValue(redeemAssetsAtom) - - const notSwappedAssets = - Number( - formatUnits( - assetsRedeemed[selectedToken.address] || 0n, - selectedToken.decimals - ) - ) || 0 - - const amountOut = - notSwappedAssets + - cowswapOrders.reduce( - (acc, order) => - acc + - Number(formatUnits(BigInt(order.buyAmount), selectedToken.decimals)), - 0 - ) - return {formatCurrency(amountOut)} -} - const USDCAmount = () => { const inputAmount = useAtomValue(userInputAtom) - const inputAmountUSD = useAtomValue(mintValueUSDAtom) const operation = useAtomValue(operationAtom) + const balanceDifference = useAtomValue(balanceDifferenceAtom) + const indexDTFPrice = useAtomValue(indexDTFPriceAtom) + const valueRedeemed = (indexDTFPrice || 0) * Number(inputAmount) + const priceImpact = valueRedeemed + ? (balanceDifference * 100) / valueRedeemed - 100 + : 0 return (
@@ -223,11 +213,7 @@ const USDCAmount = () => {
- {operation === 'mint' ? ( - formatCurrency(inputAmountUSD) - ) : ( - - )} + {formatCurrency(balanceDifference)}
USDC
@@ -241,18 +227,18 @@ const USDCAmount = () => { )}
- {operation === 'mint' ? ( - ${formatCurrency(inputAmountUSD)} - ) : ( - - $ - - )} + ${formatCurrency(balanceDifference)} {operation === 'mint' && ( ${formatCurrency(Number(inputAmount))} )} + {operation === 'redeem' && ( + + ({priceImpact > 0 ? '+' : ''} + {formatPercentage(priceImpact)}) + + )}
{operation === 'mint' && (
@@ -265,7 +251,7 @@ const USDCAmount = () => { } const BufferInfo = () => { - const buffer = useAtomValue(bufferValueAtom) + const savedAmount = useAtomValue(savedAmountAtom) return (
@@ -280,7 +266,7 @@ const BufferInfo = () => {
$ - {formatCurrency(buffer)} + {formatCurrency(savedAmount)}
) From c969f29b47393702341d47f42bcadc50af163b95 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 2 Jul 2025 19:35:03 -0300 Subject: [PATCH 72/85] chore: add appData and appDataHex to cowswap --- package-lock.json | 33 +++++++++++++++++-- package.json | 1 + .../async-swaps/hooks/useQuoteSignatures.ts | 19 ++++++++++- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19e5642ae..c5670c347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", + "@cowprotocol/app-data": "^3.1.0", "@cowprotocol/cow-sdk": "^5.10.3", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", @@ -2038,9 +2039,10 @@ } }, "node_modules/@cowprotocol/app-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-2.5.1.tgz", - "integrity": "sha512-GvcLQ44ZUHKdSAXiZ+YCaIehtme/OIvbvL/4go1UqNLTj3jDTDkagPh7CH/z2IPwFWTADyNZO/RSzKrW5UDNaA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-3.1.0.tgz", + "integrity": "sha512-hdIWp6fGz/vx3gdoJgwd8Dx8rYAblpZEBiXss5mNzgF/LBb21VVhF075sDl9oxyesKuJayKjgiAgaFiZYVgblA==", + "license": "MIT", "dependencies": { "ajv": "^8.11.0", "cross-fetch": "^3.1.5", @@ -2087,6 +2089,25 @@ "ethers": "^5.7.2" } }, + "node_modules/@cowprotocol/cow-sdk/node_modules/@cowprotocol/app-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-2.5.1.tgz", + "integrity": "sha512-GvcLQ44ZUHKdSAXiZ+YCaIehtme/OIvbvL/4go1UqNLTj3jDTDkagPh7CH/z2IPwFWTADyNZO/RSzKrW5UDNaA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "cross-fetch": "^3.1.5", + "ipfs-only-hash": "^4.0.0", + "json-stringify-deterministic": "^1.0.8", + "multiformats": "^9.6.4" + }, + "peerDependencies": { + "cross-fetch": "^3.x", + "ethers": "^5.0.0", + "ipfs-only-hash": "^4.x", + "multiformats": "^9.x" + } + }, "node_modules/@cowprotocol/cow-sdk/node_modules/form-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", @@ -2114,6 +2135,12 @@ "graphql": "14 - 16" } }, + "node_modules/@cowprotocol/cow-sdk/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", diff --git a/package.json b/package.json index a38c98a03..a4f2d4cc4 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "type": "module", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", + "@cowprotocol/app-data": "^3.1.0", "@cowprotocol/cow-sdk": "^5.10.3", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 1db65a460..99c5e971b 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -1,8 +1,11 @@ import CowswapSettlement from '@/abis/CowSwapSettlement' +import { notifyError } from '@/hooks/useNotification' import { chainIdAtom, walletAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' +import { MetadataApi } from '@cowprotocol/app-data' import { OrderBalance } from '@cowprotocol/contracts' import { + AppDataHash, OrderCreation, OrderQuoteResponse, OrderSigningUtils, @@ -43,7 +46,6 @@ import { sendCallsWithRetry, signTypedDataWithRetry, } from './utils' -import { notifyError } from '@/hooks/useNotification' export const COWSWAP_SETTLEMENT = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41' as const @@ -73,11 +75,13 @@ const getCowswapPreSignTx = async ({ orderQuote, operation, address, + appDataHex, }: { chainId: number orderQuote: OrderQuoteResponse operation: string address: Address + appDataHex: AppDataHash }): Promise => { if (orderQuote.quote.sellAmount === '0') { return undefined @@ -106,6 +110,7 @@ const getCowswapPreSignTx = async ({ ...modifiedQuote, sellTokenBalance: OrderBalance.ERC20, buyTokenBalance: OrderBalance.ERC20, + appData: appDataHex, }, { owner: address, @@ -170,6 +175,15 @@ export function useQuoteSignatures(refresh = false) { } } + const metadataApi = new MetadataApi() + + const appDataDoc = await metadataApi.generateAppDataDoc({ + appCode: 'Reserve Protocol', + environment: 'production', + }) + const { appDataContent, appDataHex } = + await metadataApi.getAppDataInfo(appDataDoc) + const successfulQuotes = Object.values(quotes).filter( (quote) => quote.success ) @@ -193,6 +207,7 @@ export function useQuoteSignatures(refresh = false) { orderQuote: quote.data, operation, address, + appDataHex, }) } @@ -364,6 +379,7 @@ export function useQuoteSignatures(refresh = false) { orderQuote: fallbackQuote, operation, address, + appDataHex, }) }) ) @@ -425,6 +441,7 @@ export function useQuoteSignatures(refresh = false) { from: address, signature: address, signingScheme: SigningScheme.PRESIGN, + appData: appDataContent, }) return orderId } catch (error) { From 35f64805c2cf7bb71a5543f28885872ff0408647 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 13:49:48 -0300 Subject: [PATCH 73/85] chore: move universal to reserver-api --- .../async-swaps/providers/universal-api.ts | 99 +++++++++++++++++++ .../async-swaps/providers/universal.ts | 28 +++--- 2 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts diff --git a/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts b/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts new file mode 100644 index 000000000..1a0bec66e --- /dev/null +++ b/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts @@ -0,0 +1,99 @@ +import { RESERVE_API } from '@/utils/constants' +import type { + OrderRequest, + OrderResponse, + OrdersParams, + OrdersResponse, + Quote, + QuoteRequest, +} from 'universal-sdk' + +// const API_BASE_URL = RESERVE_API +const API_BASE_URL = 'http://localhost:3000/' + +const getQuote = async (quote: QuoteRequest): Promise => { + const queryParams = new URLSearchParams({ + type: quote.type, + token: quote.token, + pair_token: quote.pair_token, + blockchain: quote.blockchain, + user_address: quote.user_address, + ...(quote.token_amount && { token_amount: quote.token_amount }), + ...(quote.pair_token_amount && { + pair_token_amount: quote.pair_token_amount, + }), + ...(quote.slippage_bips !== undefined && { + slippage_bips: quote.slippage_bips.toString(), + }), + }) + + const response = await fetch( + `${API_BASE_URL}universal/quote?${queryParams}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + } + ) + + if (!response.ok) { + const error = await response.json() + throw new Error(error.error || 'Failed to get quote') + } + + return response.json() +} + +const submitOrder = async (order: OrderRequest): Promise => { + const response = await fetch(`${API_BASE_URL}universal/order`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(order), + }) + + if (!response.ok) { + const error = await response.json() + throw new Error(error.error || 'Failed to submit order') + } + + return response.json() +} + +const getOrders = async (params?: OrdersParams): Promise => { + const queryParams = new URLSearchParams() + + if (params) { + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + queryParams.append(key, value.toString()) + } + }) + } + + const url = queryParams.toString() + ? `${API_BASE_URL}universal/orders?${queryParams}` + : `${API_BASE_URL}universal/orders` + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + + if (!response.ok) { + const error = await response.json() + throw new Error(error.error || 'Failed to get orders') + } + + return response.json() +} + +export const universal = { + getQuote, + submitOrder, + getOrders, +} diff --git a/src/views/index-dtf/issuance/async-swaps/providers/universal.ts b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts index a95c224ae..c123e2fd6 100644 --- a/src/views/index-dtf/issuance/async-swaps/providers/universal.ts +++ b/src/views/index-dtf/issuance/async-swaps/providers/universal.ts @@ -1,7 +1,14 @@ import { RateLimiter } from 'limiter' -import { Quote, TokenName, UniversalRelayerSDK } from 'universal-sdk' -import { TokenAddresses } from 'universal-sdk/dist/config' +import { + OrderRequest, + OrdersParams, + Quote, + QuoteRequest, + TokenName, +} from 'universal-sdk' +import { BlockchainConfigs, TokenAddresses } from 'universal-sdk/dist/config' import { Address } from 'viem' +import { universal } from './universal-api' export type CustomUniversalQuote = { userAddress: Address @@ -31,7 +38,7 @@ export const getUniversalTokenName = (token: Address) => { export const getUniversalTokenAddress = (token: TokenName) => { // @ts-expect-error - USDC is not in the universalTokenMap but we need it for the universal SDK if (token === 'USDC') { - return '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' + return BlockchainConfigs.BASE.usdcAddress } return Object.keys(universalTokenMap).find( @@ -44,22 +51,19 @@ export const createUniversalSdkWrapper = () => { tokensPerInterval: 1, interval: 750, }) - const sdk = new UniversalRelayerSDK() return { - getQuote: async (quote: Parameters[0]) => { + getQuote: async (quote: QuoteRequest) => { await limiter.removeTokens(1) - - return sdk.getQuote(quote) + return await universal.getQuote(quote) }, - getOrders: async (orders: Parameters[0]) => { + getOrders: async (orders: OrdersParams) => { await limiter.removeTokens(1) - return sdk.getOrders(orders) + return await universal.getOrders(orders) }, - submitOrder: async (order: Parameters[0]) => { + submitOrder: async (order: OrderRequest) => { await limiter.removeTokens(1) - - return sdk.submitOrder(order) + return await universal.submitOrder(order) }, } } From 4f48035d5121ba356409e608c0a5a402085ec2f5 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 17:51:33 -0300 Subject: [PATCH 74/85] chore: change success view styles --- src/views/index-dtf/issuance/async-swaps/index.tsx | 6 +++--- src/views/index-dtf/issuance/async-swaps/success.tsx | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index caee9d35f..8dc3b26f2 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -159,7 +159,7 @@ const AsyncSwaps = () => { if (!isSafeMultisig) { return ( -
+
) @@ -167,7 +167,7 @@ const AsyncSwaps = () => { if (success) { return ( -
+
@@ -178,7 +178,7 @@ const AsyncSwaps = () => { } return ( -
+
diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index 2d7a5099b..b80e142ea 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -16,7 +16,7 @@ import { shortenAddress, } from '@/utils' import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' -import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' +import { atom, useAtomValue, useSetAtom } from 'jotai' import { ArrowLeft, ArrowUpRight, @@ -27,7 +27,6 @@ import { } from 'lucide-react' import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { formatUnits } from 'viem' import { balanceDifferenceAtom, cowswapOrderIdsAtom, @@ -35,12 +34,10 @@ import { cowswapOrdersCreatedAtAtom, fallbackQuotesAtom, mintValueAtom, - mintValueUSDAtom, operationAtom, quotesAtom, redeemAssetsAtom, savedAmountAtom, - selectedTokenAtom, successAtom, txHashAtom, universalSuccessOrdersAtom, @@ -322,7 +319,7 @@ const Transactions = () => { const universalSuccessOrders = useAtomValue(universalSuccessOrdersAtom) return ( -
+
-
Gnosis Safe Required
+
Atomic Batch Required
@@ -75,7 +75,7 @@ const GnosisSafeRequired = () => { {isConnected ? 'Switch Wallets' : 'Connect Wallet'} {' '} - - Gnosis Safe Required + - Atomic Batch Required { ) } -export default GnosisSafeRequired +export default AtomicBatchRequired diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 1b9762c22..71c6e027d 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -1,12 +1,12 @@ import { Button } from '@/components/ui/button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' -import useERC20Balance from '@/hooks/useERC20Balance' import { cn } from '@/lib/utils' -import { isSafeMultisigAtom } from '@/state/atoms' +import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' -import { useAtom, useAtomValue, useSetAtom } from 'jotai' +import { useAtom, useAtomValue } from 'jotai' import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' +import { useCapabilities } from 'wagmi' import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' import Updater from '../manual/updater' @@ -14,7 +14,6 @@ import AsyncMint from './async-mint' import AsyncRedeem from './async-redeem' import { fetchingQuotesAtom, - indexDTFBalanceAtom, operationAtom, ordersSubmittedAtom, redeemAssetsAtom, @@ -24,7 +23,7 @@ import { userInputAtom, } from './atom' import Collaterals, { showCollateralsAtom } from './collaterals' -import GnosisSafeRequired from './gnosis-safe-required' +import AtomicBatchRequired from './atomic-batch-required' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Config from './settings' import Success from './success' @@ -128,11 +127,12 @@ const Header = () => { const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') - const isSafeMultisig = useAtomValue(isSafeMultisigAtom) + const chainId = useAtomValue(chainIdAtom) const [currentTab, setCurrentTab] = useAtom(operationAtom) const [showSettings, setShowSettings] = useAtom(showSettingsAtom) const indexDTF = useAtomValue(indexDTFAtom) const success = useAtomValue(successAtom) + const { data } = useCapabilities() const reset = () => { setShowSettings(false) @@ -150,10 +150,10 @@ const AsyncSwaps = () => { if (!indexDTF) return null - if (!isSafeMultisig) { + if (!data?.[chainId]?.atomicBatch?.supported) { return (
- +
) } From 7035c12ad9924cd4e94a8c158b9dfa34e4069d25 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 18:58:47 -0300 Subject: [PATCH 78/85] chore: change universal api base url --- .../async-swaps/providers/universal-api.ts | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts b/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts index 1a0bec66e..20fe7a27b 100644 --- a/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts +++ b/src/views/index-dtf/issuance/async-swaps/providers/universal-api.ts @@ -8,9 +8,6 @@ import type { QuoteRequest, } from 'universal-sdk' -// const API_BASE_URL = RESERVE_API -const API_BASE_URL = 'http://localhost:3000/' - const getQuote = async (quote: QuoteRequest): Promise => { const queryParams = new URLSearchParams({ type: quote.type, @@ -27,15 +24,12 @@ const getQuote = async (quote: QuoteRequest): Promise => { }), }) - const response = await fetch( - `${API_BASE_URL}universal/quote?${queryParams}`, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - } - ) + const response = await fetch(`${RESERVE_API}universal/quote?${queryParams}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) if (!response.ok) { const error = await response.json() @@ -46,7 +40,7 @@ const getQuote = async (quote: QuoteRequest): Promise => { } const submitOrder = async (order: OrderRequest): Promise => { - const response = await fetch(`${API_BASE_URL}universal/order`, { + const response = await fetch(`${RESERVE_API}universal/order`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -74,8 +68,8 @@ const getOrders = async (params?: OrdersParams): Promise => { } const url = queryParams.toString() - ? `${API_BASE_URL}universal/orders?${queryParams}` - : `${API_BASE_URL}universal/orders` + ? `${RESERVE_API}universal/orders?${queryParams}` + : `${RESERVE_API}universal/orders` const response = await fetch(url, { method: 'GET', From eed8c2e7fdccd2953b90484572be6aaf5774c0ee Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 19:17:55 -0300 Subject: [PATCH 79/85] chore: remove unused file --- src/views/index-dtf/issuance/async-swaps/atom.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/index-dtf/issuance/async-swaps/atom.ts b/src/views/index-dtf/issuance/async-swaps/atom.ts index 08d12dc86..40d1e4e76 100644 --- a/src/views/index-dtf/issuance/async-swaps/atom.ts +++ b/src/views/index-dtf/issuance/async-swaps/atom.ts @@ -9,7 +9,6 @@ import { } from '@cowprotocol/cow-sdk' import { atom } from 'jotai' import { atomWithReset } from 'jotai/utils' -import { Quote } from 'universal-sdk' import { Address, formatUnits, parseEther, parseUnits } from 'viem' import { AsyncSwapOrderResponse, From 72f14c2f6ec781355dd09804045a42db8b0b8511 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 19:19:51 -0300 Subject: [PATCH 80/85] chore: change build command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bca4d032c..feceb413e 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ }, "scripts": { "start": "vite", - "build": "tsc && vite build", + "build": "tsc && node --max-old-space-size=8192 ./node_modules/.bin/vite build", "serve": "vite preview", "analyze": "vite-bundle-visualizer 'build/static/js/*.js'", "test": "vite test", From 834a763de333129eaea7674cde7a5a4f9992e197 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 19:27:50 -0300 Subject: [PATCH 81/85] chore: update package.json --- package-lock.json | 4057 +++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 2621 insertions(+), 1438 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47fd26a68..dc6ca54ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "theme-ui": "0.17.1", "universal-sdk": "^0.1.34", "vaul": "^1.1.1", - "viem": "2.30.0", + "viem": "^2.30.0", "wagmi": "^2.15.6", "zod": "^3.23.8" }, @@ -139,7 +139,8 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", + "license": "MIT" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -169,7 +170,8 @@ "node_modules/@assemblyscript/loader": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==", + "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.26.2", @@ -2025,6 +2027,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.3.tgz", "integrity": "sha512-h8gMLQNvP5TIJVXFOyQZaxbi1Mg5alFR4Z2/PEIngdyXZEoQGcVhzyQGuDa3t9zpllxvqfAaKfzDhsfCo+nhSQ==", + "license": "Apache-2.0", "dependencies": { "@noble/hashes": "^1.4.0", "clsx": "^1.2.1", @@ -2036,14 +2039,15 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@cowprotocol/app-data": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-3.1.0.tgz", - "integrity": "sha512-hdIWp6fGz/vx3gdoJgwd8Dx8rYAblpZEBiXss5mNzgF/LBb21VVhF075sDl9oxyesKuJayKjgiAgaFiZYVgblA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-3.3.0.tgz", + "integrity": "sha512-3lfknouwg+j/xSyL5u5FI8rAlGPkzi+QsmXQvPS0O0ETaikx9v9pt5t3pZOv6jtsAmafFBFPtAUp/cdPrDSUaA==", "license": "MIT", "dependencies": { "ajv": "^8.11.0", @@ -2062,12 +2066,14 @@ "node_modules/@cowprotocol/app-data/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@cowprotocol/contracts": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@cowprotocol/contracts/-/contracts-1.8.0.tgz", "integrity": "sha512-rMEHo1UBB6k4kRoWejHZNGggg6IBVt7vAd8x0FhEvjxhbq3zlAex61f9HpAcDExJNuvfwwDjsOc/7UGztCzhSw==", + "license": "LGPL-3.0-or-later", "peerDependencies": { "ethers": "^5.4.0" } @@ -2076,6 +2082,7 @@ "version": "5.10.3", "resolved": "https://registry.npmjs.org/@cowprotocol/cow-sdk/-/cow-sdk-5.10.3.tgz", "integrity": "sha512-whnfufOmJqJWw7u2HqLt6k+rw8eMH+ywmB++oxG6U6zLBdQihk18mIMz1wrNwfTUk0FFtn8g8nhrQL14oV27rg==", + "license": "(MIT OR Apache-2.0)", "dependencies": { "@cowprotocol/app-data": "^2.4.0", "@cowprotocol/contracts": "^1.6.0", @@ -2111,13 +2118,15 @@ } }, "node_modules/@cowprotocol/cow-sdk/node_modules/form-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", - "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.35" }, "engines": { @@ -2128,6 +2137,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", "integrity": "sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==", + "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", "extract-files": "^9.0.0", @@ -2200,6 +2210,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.3.tgz", "integrity": "sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==", + "license": "MIT", "engines": { "bun": ">=1", "deno": ">=2", @@ -2210,9 +2221,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "license": "MIT", "optional": true, "peer": true, @@ -2349,6 +2360,74 @@ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", @@ -2366,183 +2445,361 @@ "node": ">=12" } }, - "node_modules/@ethereumjs/common": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", - "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "crc-32": "^1.2.0" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "bin": { - "rlp": "bin/rlp" - }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" + "node": ">=12" } }, - "node_modules/@ethereumjs/tx": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", - "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", - "dependencies": { - "@ethereumjs/common": "^3.2.0", - "@ethereumjs/rlp": "^4.0.1", - "@ethereumjs/util": "^8.1.0", - "ethereum-cryptography": "^2.0.0" - }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14" + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" + "node": ">=12" } }, - "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/@ethereumjs/util/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@ethereumjs/common": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", + "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", + "license": "MIT", "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@ethereumjs/util": "^8.1.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=14" } }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "node_modules/@ethereumjs/tx": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", + "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", + "license": "MPL-2.0", "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=14" } }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "license": "MPL-2.0", "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@ethersproject/abi": { @@ -2676,6 +2933,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -2754,6 +3012,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -2808,6 +3067,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -2837,6 +3097,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -2922,6 +3183,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -2960,6 +3222,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -2987,6 +3250,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -3017,6 +3281,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -3056,6 +3321,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -3100,6 +3366,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3171,6 +3438,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3191,6 +3459,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3246,6 +3515,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -3311,9 +3581,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", "cpu": [ "arm64" ], @@ -3330,13 +3600,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" + "@img/sharp-libvips-darwin-arm64": "1.1.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", "cpu": [ "x64" ], @@ -3353,13 +3623,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" + "@img/sharp-libvips-darwin-x64": "1.1.0" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", "cpu": [ "arm64" ], @@ -3374,9 +3644,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", "cpu": [ "x64" ], @@ -3391,9 +3661,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", "cpu": [ "arm" ], @@ -3408,9 +3678,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", "cpu": [ "arm64" ], @@ -3425,9 +3695,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", "cpu": [ "ppc64" ], @@ -3442,9 +3712,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", "cpu": [ "s390x" ], @@ -3459,9 +3729,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", "cpu": [ "x64" ], @@ -3476,9 +3746,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", "cpu": [ "arm64" ], @@ -3493,9 +3763,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", "cpu": [ "x64" ], @@ -3510,9 +3780,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", "cpu": [ "arm" ], @@ -3529,13 +3799,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" + "@img/sharp-libvips-linux-arm": "1.1.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", "cpu": [ "arm64" ], @@ -3552,36 +3822,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" + "@img/sharp-libvips-linux-arm64": "1.1.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", "cpu": [ "s390x" ], @@ -3598,13 +3845,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" + "@img/sharp-libvips-linux-s390x": "1.1.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", "cpu": [ "x64" ], @@ -3621,13 +3868,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" + "@img/sharp-libvips-linux-x64": "1.1.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", "cpu": [ "arm64" ], @@ -3644,13 +3891,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", "cpu": [ "x64" ], @@ -3667,13 +3914,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", "cpu": [ "wasm32" ], @@ -3681,7 +3928,7 @@ "optional": true, "peer": true, "dependencies": { - "@emnapi/runtime": "^1.4.4" + "@emnapi/runtime": "^1.4.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -3691,9 +3938,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", "cpu": [ "arm64" ], @@ -3711,9 +3958,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", "cpu": [ "ia32" ], @@ -3731,9 +3978,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", "cpu": [ "x64" ], @@ -4320,12 +4567,14 @@ "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" + "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", + "license": "BSD-3-Clause" }, "node_modules/@lit/reactive-element": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz", "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==", + "license": "BSD-3-Clause", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0" } @@ -4403,6 +4652,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-2.0.4.tgz", "integrity": "sha512-StnIgUB75x7a7AgUhiaUZDpCsqGp7VkNnZh2XivXkJ6mPkE83U8ARGQj5MbRis7VJY8BC5V1AbB1fjdh0hupPQ==", + "license": "(Apache-2.0 AND MIT)", "dependencies": { "@metamask/superstruct": "^3.1.0", "@metamask/utils": "^9.0.0" @@ -4411,15 +4661,60 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/eth-json-rpc-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", - "integrity": "sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==", + "node_modules/@metamask/abi-utils/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", "dependencies": { - "@metamask/json-rpc-engine": "^7.0.0", - "@metamask/safe-event-emitter": "^3.0.0", - "@metamask/utils": "^5.0.1" - }, + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/abi-utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@metamask/abi-utils/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@metamask/eth-json-rpc-provider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", + "integrity": "sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==", + "dependencies": { + "@metamask/json-rpc-engine": "^7.0.0", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^5.0.1" + }, "engines": { "node": ">=14.0.0" } @@ -4428,6 +4723,7 @@ "version": "7.3.3", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz", "integrity": "sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==", + "license": "ISC", "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", @@ -4441,6 +4737,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", @@ -4460,6 +4757,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.1.2", "@types/debug": "^4.1.7", @@ -4475,6 +4773,7 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4482,10 +4781,24 @@ "node": ">=10" } }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@metamask/json-rpc-engine": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz", "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==", + "license": "ISC", "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", @@ -4495,40 +4808,11 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/json-rpc-engine/node_modules/@metamask/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", - "dependencies": { - "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.0.0", - "@noble/hashes": "^1.3.1", - "@scure/base": "^1.1.3", - "@types/debug": "^4.1.7", - "debug": "^4.3.4", - "pony-cause": "^2.1.10", - "semver": "^7.5.4", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@metamask/json-rpc-engine/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@metamask/json-rpc-middleware-stream": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz", "integrity": "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==", + "license": "ISC", "dependencies": { "@metamask/json-rpc-engine": "^8.0.2", "@metamask/safe-event-emitter": "^3.0.0", @@ -4539,40 +4823,11 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/json-rpc-middleware-stream/node_modules/@metamask/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", - "dependencies": { - "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.0.0", - "@noble/hashes": "^1.3.1", - "@scure/base": "^1.1.3", - "@types/debug": "^4.1.7", - "debug": "^4.3.4", - "pony-cause": "^2.1.10", - "semver": "^7.5.4", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@metamask/json-rpc-middleware-stream/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@metamask/object-multiplex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz", "integrity": "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==", + "license": "ISC", "dependencies": { "once": "^1.4.0", "readable-stream": "^3.6.2" @@ -4585,6 +4840,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz", "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==", + "license": "MIT", "dependencies": { "bowser": "^2.9.0" } @@ -4593,6 +4849,7 @@ "version": "16.1.0", "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz", "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==", + "license": "MIT", "dependencies": { "@metamask/json-rpc-engine": "^8.0.1", "@metamask/json-rpc-middleware-stream": "^7.0.1", @@ -4611,13 +4868,39 @@ "node": "^18.18 || >=20" } }, - "node_modules/@metamask/providers/node_modules/@metamask/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "node_modules/@metamask/providers/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", + "license": "MIT", + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.0.0", + "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", @@ -4630,21 +4913,11 @@ "node": ">=16.0.0" } }, - "node_modules/@metamask/providers/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@metamask/providers/node_modules/semver": { + "node_modules/@metamask/rpc-errors/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4652,22 +4925,24 @@ "node": ">=10" } }, - "node_modules/@metamask/rpc-errors": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", - "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", - "dependencies": { - "@metamask/utils": "^9.0.0", - "fast-safe-stringify": "^2.0.6" - }, - "engines": { - "node": ">=16.0.0" + "node_modules/@metamask/rpc-errors/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@metamask/safe-event-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz", "integrity": "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==", + "license": "ISC", "engines": { "node": ">=12.0.0" } @@ -4729,6 +5004,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" } @@ -4737,6 +5013,7 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -4748,29 +5025,23 @@ "url": "https://opencollective.com/date-fns" } }, - "node_modules/@metamask/sdk/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@metamask/superstruct": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.2.1.tgz", "integrity": "sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==", + "license": "MIT", "engines": { "node": ">=16.0.0" } }, "node_modules/@metamask/utils": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", - "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.1.0", + "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", @@ -4787,6 +5058,7 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4794,10 +5066,24 @@ "node": ">=10" } }, + "node_modules/@metamask/utils/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@multiformats/base-x": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==", + "license": "MIT" }, "node_modules/@multiformats/dns": { "version": "1.0.6", @@ -4838,16 +5124,16 @@ } }, "node_modules/@next/env": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.4.tgz", - "integrity": "sha512-SJKOOkULKENyHSYXE5+KiFU6itcIb6wSBjgM92meK0HVKpo94dNOLZVdLLuS7/BxImROkGoPsjR4EnuDucqiiA==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.5.tgz", + "integrity": "sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==", "license": "MIT", "peer": true }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.4.tgz", - "integrity": "sha512-eVG55dnGwfUuG+TtnUCt+mEJ+8TGgul6nHEvdb8HEH7dmJIFYOCApAaFrIrxwtEq2Cdf+0m5sG1Np8cNpw9EAw==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.5.tgz", + "integrity": "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==", "cpu": [ "arm64" ], @@ -4862,9 +5148,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.4.tgz", - "integrity": "sha512-zqG+/8apsu49CltEj4NAmCGZvHcZbOOOsNoTVeIXphYWIbE4l6A/vuQHyqll0flU2o3dmYCXsBW5FmbrGDgljQ==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.5.tgz", + "integrity": "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==", "cpu": [ "x64" ], @@ -4879,9 +5165,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.4.tgz", - "integrity": "sha512-LRD4l2lq4R+2QCHBQVC0wjxxkLlALGJCwigaJ5FSRSqnje+MRKHljQNZgDCaKUZQzO/TXxlmUdkZP/X3KNGZaw==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.5.tgz", + "integrity": "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==", "cpu": [ "arm64" ], @@ -4896,9 +5182,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.4.tgz", - "integrity": "sha512-LsGUCTvuZ0690fFWerA4lnQvjkYg9gHo12A3wiPUR4kCxbx/d+SlwmonuTH2SWZI+RVGA9VL3N0S03WTYv6bYg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.5.tgz", + "integrity": "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==", "cpu": [ "arm64" ], @@ -4913,9 +5199,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.4.tgz", - "integrity": "sha512-aOy5yNRpLL3wNiJVkFYl6w22hdREERNjvegE6vvtix8LHRdsTHhWTpgvcYdCK7AIDCQW5ATmzr9XkPHvSoAnvg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.5.tgz", + "integrity": "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==", "cpu": [ "x64" ], @@ -4930,9 +5216,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.4.tgz", - "integrity": "sha512-FL7OAn4UkR8hKQRGBmlHiHinzOb07tsfARdGh7v0Z0jEJ3sz8/7L5bR23ble9E6DZMabSStqlATHlSxv1fuzAg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.5.tgz", + "integrity": "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==", "cpu": [ "x64" ], @@ -4947,9 +5233,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.4.tgz", - "integrity": "sha512-eEdNW/TXwjYhOulQh0pffTMMItWVwKCQpbziSBmgBNFZIIRn2GTXrhrewevs8wP8KXWYMx8Z+mNU0X+AfvtrRg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.5.tgz", + "integrity": "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==", "cpu": [ "arm64" ], @@ -4964,9 +5250,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.4.tgz", - "integrity": "sha512-SE5pYNbn/xZKMy1RE3pAs+4xD32OI4rY6mzJa4XUkp/ItZY+OMjIgilskmErt8ls/fVJ+Ihopi2QIeW6O3TrMw==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", + "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", "cpu": [ "x64" ], @@ -4981,9 +5267,10 @@ } }, "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -5057,30 +5344,115 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@openzeppelin/merkle-tree/-/merkle-tree-1.0.8.tgz", "integrity": "sha512-E2c9/Y3vjZXwVvPZKqCKUn7upnvam1P1ZhowJyZVQSkzZm5WhumtaRr+wkUXrZVfkIc7Gfrl7xzabElqDL09ow==", + "license": "MIT", "dependencies": { "@metamask/abi-utils": "^2.0.4", "ethereum-cryptography": "^3.0.0" } }, - "node_modules/@paulmillr/qr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", - "integrity": "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==", - "deprecated": "The package is now available as \"qr\": npm install qr", + "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@pedrouid/environment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pedrouid/environment/-/environment-1.0.1.tgz", - "integrity": "sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/curves": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", + "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@openzeppelin/merkle-tree/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@openzeppelin/merkle-tree/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@openzeppelin/merkle-tree/node_modules/ethereum-cryptography": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz", + "integrity": "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg==", + "license": "MIT", + "dependencies": { + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16", + "npm": ">=9" + } + }, + "node_modules/@paulmillr/qr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", + "integrity": "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==", + "deprecated": "The package is now available as \"qr\": npm install qr", + "license": "(MIT OR Apache-2.0)", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@pedrouid/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pedrouid/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, "engines": { @@ -5116,27 +5488,32 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -5145,27 +5522,32 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, "node_modules/@radix-ui/number": { "version": "1.1.0", @@ -5965,6 +6347,46 @@ } } }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", @@ -8970,15 +9392,16 @@ "license": "MIT" }, "node_modules/@rainbow-me/rainbowkit": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.8.tgz", - "integrity": "sha512-EdNIK2cdAT6GJ9G11wx7nCVfjqBfxh7dx/1DhPYrB+yg+VFrII6cM1PiMFVC9evD4mqVHe9mmLAt3nvlwDdiPQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.5.tgz", + "integrity": "sha512-UWEffskEeem1HnHolKvR0FO0haA7CYkm1/M3QlKz/K3gc8N1rjLXit9FG3PJ7l/EKn79VQm25mu8ACkNWBI8sA==", + "license": "MIT", "dependencies": { - "@vanilla-extract/css": "1.17.3", - "@vanilla-extract/dynamic": "2.1.4", - "@vanilla-extract/sprinkles": "1.6.4", + "@vanilla-extract/css": "1.15.5", + "@vanilla-extract/dynamic": "2.1.2", + "@vanilla-extract/sprinkles": "1.6.3", "clsx": "2.1.1", - "cuer": "0.0.2", + "qrcode": "1.5.4", "react-remove-scroll": "2.6.2", "ua-parser-js": "^1.0.37" }, @@ -9094,6 +9517,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.8.tgz", "integrity": "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", @@ -9114,28 +9538,18 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.8.tgz", "integrity": "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==", + "license": "Apache-2.0", "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", "viem": ">=2.29.0" } }, - "node_modules/@reown/appkit-common/node_modules/big.js": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, "node_modules/@reown/appkit-controllers": { "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.8.tgz", "integrity": "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-wallet": "1.7.8", @@ -9144,46 +9558,11 @@ "viem": ">=2.29.0" } }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -9211,6 +9590,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -9229,6 +9609,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/core": "2.21.0", "@walletconnect/events": "1.0.1", @@ -9245,6 +9626,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -9258,6 +9640,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -9277,6 +9660,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", @@ -9307,6 +9691,7 @@ "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", @@ -9330,6 +9715,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -9340,62 +9726,23 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit-controllers/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "peerDependencies": { - "ws": "*" - } - }, "node_modules/@reown/appkit-controllers/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@reown/appkit-controllers/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/@reown/appkit-controllers/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@reown/appkit-controllers/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -9408,6 +9755,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -9416,6 +9764,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -9507,6 +9856,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9527,6 +9877,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.7.8.tgz", "integrity": "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", @@ -9540,6 +9891,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.8.tgz", "integrity": "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==", + "license": "Apache-2.0", "dependencies": { "buffer": "6.0.3" } @@ -9548,6 +9900,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.8.tgz", "integrity": "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", @@ -9561,6 +9914,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.8.tgz", "integrity": "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", @@ -9573,6 +9927,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "license": "MIT", "dependencies": { "dijkstrajs": "^1.0.1", "encode-utf8": "^1.0.3", @@ -9590,6 +9945,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.8.tgz", "integrity": "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", @@ -9604,46 +9960,11 @@ "valtio": "1.13.2" } }, - "node_modules/@reown/appkit-utils/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -9671,6 +9992,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -9689,6 +10011,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/core": "2.21.0", "@walletconnect/events": "1.0.1", @@ -9705,6 +10028,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -9718,6 +10042,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -9737,6 +10062,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", @@ -9767,6 +10093,7 @@ "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", @@ -9790,6 +10117,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -9800,62 +10128,23 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit-utils/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "peerDependencies": { - "ws": "*" - } - }, "node_modules/@reown/appkit-utils/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@reown/appkit-utils/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/@reown/appkit-utils/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@reown/appkit-utils/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -9868,6 +10157,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -9876,6 +10166,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -9967,6 +10258,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9987,6 +10279,7 @@ "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.8.tgz", "integrity": "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-polyfills": "1.7.8", @@ -9998,50 +10291,16 @@ "version": "3.22.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@reown/appkit/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@reown/appkit/node_modules/@walletconnect/core": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -10069,6 +10328,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -10087,6 +10347,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/core": "2.21.0", "@walletconnect/events": "1.0.1", @@ -10103,6 +10364,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -10116,6 +10378,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -10135,6 +10398,7 @@ "version": "2.21.0", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", @@ -10165,6 +10429,7 @@ "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", @@ -10188,6 +10453,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -10198,62 +10464,23 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "peerDependencies": { - "ws": "*" - } - }, "node_modules/@reown/appkit/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@reown/appkit/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/@reown/appkit/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@reown/appkit/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -10266,6 +10493,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -10274,6 +10502,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -10365,6 +10594,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -10448,6 +10678,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", @@ -10469,13 +10700,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/pluginutils": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -10497,13 +10730,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10511,6 +10746,34 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.38.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", @@ -10525,102 +10788,310 @@ "darwin" ] }, - "node_modules/@rrweb/types": { - "version": "2.0.0-alpha.18", - "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.18.tgz", - "integrity": "sha512-iMH3amHthJZ9x3gGmBPmdfim7wLGygC2GciIkw2A6SO8giSn8PHYtRT8OKNH4V+k3SZ6RSnYHcTQxBA7pSWZ3Q==", - "license": "MIT" + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", + "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@safe-global/safe-apps-provider": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", - "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", - "dependencies": { - "@safe-global/safe-apps-sdk": "^9.1.0", - "events": "^3.3.0" - } + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", + "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@safe-global/safe-apps-sdk": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", - "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", - "dependencies": { - "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", - "viem": "^2.1.1" - } + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", + "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@safe-global/safe-gateway-typescript-sdk": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", - "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", - "engines": { - "node": ">=16" - } + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", + "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "funding": { - "url": "https://paulmillr.com/funding/" - } + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", + "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", + "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", + "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", + "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", + "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", + "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", + "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", + "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", + "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", + "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", + "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", + "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", + "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rrweb/types": { + "version": "2.0.0-alpha.18", + "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.18.tgz", + "integrity": "sha512-iMH3amHthJZ9x3gGmBPmdfim7wLGygC2GciIkw2A6SO8giSn8PHYtRT8OKNH4V+k3SZ6RSnYHcTQxBA7pSWZ3Q==", + "license": "MIT" + }, + "node_modules/@safe-global/safe-apps-provider": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", + "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", + "license": "MIT", "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@safe-global/safe-apps-sdk": "^9.1.0", + "events": "^3.3.0" } }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "node_modules/@safe-global/safe-apps-sdk": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", + "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", + "viem": "^2.1.1" } }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@safe-global/safe-gateway-typescript-sdk": { + "version": "3.23.1", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", + "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", + "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" - }, + "node": ">=16" + } + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "engines": { - "node": "^14.21.3 || >=16" + "node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -10895,13 +11366,115 @@ "node": ">=10" } }, - "node_modules/@sentry/core": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.16.0.tgz", - "integrity": "sha512-CECfs2HI4CAXJ9zusXw5Aa740TXe6w2n8WiiF9b+V3c5Prufl32oZZj9LL8Cqrc56ozlASLdPjWIo76ApoxTlQ==", - "license": "MIT", + "node_modules/@sentry/cli-linux-arm": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.2.tgz", + "integrity": "sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg==", + "cpu": [ + "arm" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], "engines": { - "node": ">=18" + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.2.tgz", + "integrity": "sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.2.tgz", + "integrity": "sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.2.tgz", + "integrity": "sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.2.tgz", + "integrity": "sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.2.tgz", + "integrity": "sha512-vPPGHjYoaGmfrU7xhfFxG7qlTBacroz5NdT+0FmDn6692D8IvpNXl1K+eV3Kag44ipJBBeR8g1HRJyx/F/9ACw==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.16.0.tgz", + "integrity": "sha512-CECfs2HI4CAXJ9zusXw5Aa740TXe6w2n8WiiF9b+V3c5Prufl32oZZj9LL8Cqrc56ozlASLdPjWIo76ApoxTlQ==", + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/@sentry/react": { @@ -10943,7 +11516,8 @@ "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" }, "node_modules/@styled-system/background": { "version": "5.1.2", @@ -11077,6 +11651,13 @@ "@styled-system/css": "^5.1.5" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0", + "peer": true + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -11408,16 +11989,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -11502,13 +12073,6 @@ "@types/ms": "*" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/dns-packet": { "version": "5.6.5", "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", @@ -11614,7 +12178,8 @@ "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -11628,7 +12193,8 @@ "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "license": "MIT" }, "node_modules/@types/mixpanel-browser": { "version": "2.54.0", @@ -11655,7 +12221,8 @@ "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", @@ -11749,7 +12316,8 @@ "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" }, "node_modules/@types/unist": { "version": "2.0.11", @@ -11825,6 +12393,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@uniswap/permit2-sdk/-/permit2-sdk-1.3.1.tgz", "integrity": "sha512-Eq2by4zVEVSZL3PJ1Yuf5+AZ/yE1GOuksWzPXPoxr5WRm3hqh34jKEqtyTImHqwuPrdILG8i02xJmgGLTH1QfA==", + "license": "MIT", "dependencies": { "ethers": "^5.7.0", "tiny-invariant": "^1.1.0" @@ -11834,6 +12403,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-4.2.1.tgz", "integrity": "sha512-hr7vwYrXScg+V8/rRc2UL/Ixc/p0P7yqe4D/OxzUdMRYr8RZd+8z5Iu9+WembjZT/DCdbTjde6lsph4Og0n1BQ==", + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.0.2", "big.js": "^5.2.2", @@ -11846,10 +12416,20 @@ "node": ">=10" } }, + "node_modules/@uniswap/sdk-core/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/@uniswap/uniswapx-sdk": { "version": "2.0.1-alpha.10", "resolved": "https://registry.npmjs.org/@uniswap/uniswapx-sdk/-/uniswapx-sdk-2.0.1-alpha.10.tgz", "integrity": "sha512-nDWJ9qLFBLId2lxJ8TMy15HIBlzQe2yFE6LEJSzEF1T5EGDFv1G/ioKQSm2LJg4cO11UfVouHKsn6rwYS6P9wA==", + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/providers": "^5.7.0", @@ -11862,12 +12442,13 @@ } }, "node_modules/@vanilla-extract/css": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.17.3.tgz", - "integrity": "sha512-jHivr1UPoJTX5Uel4AZSOwrCf4mO42LcdmnhJtUxZaRWhW4FviFbIfs0moAWWld7GOT+2XnuVZjjA/K32uUnMQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.5.tgz", + "integrity": "sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==", + "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.8", + "@vanilla-extract/private": "^1.0.6", "css-what": "^6.1.0", "cssesc": "^3.0.0", "csstype": "^3.0.7", @@ -11883,25 +12464,29 @@ "node_modules/@vanilla-extract/css/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@vanilla-extract/dynamic": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.4.tgz", - "integrity": "sha512-7+Ot7VlP3cIzhJnTsY/kBtNs21s0YD7WI1rKJJKYP56BkbDxi/wrQUWMGEczKPUDkJuFcvbye+E2ub1u/mHH9w==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz", + "integrity": "sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==", + "license": "MIT", "dependencies": { - "@vanilla-extract/private": "^1.0.8" + "@vanilla-extract/private": "^1.0.6" } }, "node_modules/@vanilla-extract/private": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.9.tgz", - "integrity": "sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.6.tgz", + "integrity": "sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==", + "license": "MIT" }, "node_modules/@vanilla-extract/sprinkles": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.4.tgz", - "integrity": "sha512-lW3MuIcdIeHKX81DzhTnw68YJdL1ial05exiuvTLJMdHXQLKcVB93AncLPajMM6mUhaVVx5ALZzNHMTrq/U9Hg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.3.tgz", + "integrity": "sha512-oCHlQeYOBIJIA2yWy2GnY5wE2A7hGHDyJplJo4lb+KEIBcJWRnDJDg8ywDwQS5VfWJrBBO3drzYZPFpWQjAMiQ==", + "license": "MIT", "peerDependencies": { "@vanilla-extract/css": "^1.0.0" } @@ -11940,15 +12525,13 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.3.tgz", + "integrity": "sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -11956,12 +12539,37 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", + "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "3.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", + "integrity": "sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==", "dev": true, - "license": "MIT", "dependencies": { "tinyrainbow": "^2.0.0" }, @@ -11970,15 +12578,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.3.tgz", + "integrity": "sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "3.1.3", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -11988,17 +12594,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.3.tgz", + "integrity": "sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", + "@vitest/pretty-format": "3.1.3", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -12010,31 +12614,28 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.3.tgz", + "integrity": "sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==", "dev": true, - "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", + "@vitest/pretty-format": "3.1.3", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -12045,6 +12646,7 @@ "version": "5.8.5", "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.8.5.tgz", "integrity": "sha512-CHh4uYP6MziCMlSVXmuAv7wMoYWdxXliuzwCRAxHNNkgXE7z37ez5XzJu0Sm39NUau3Fl8WSjwKo4a4w9BOYNA==", + "license": "MIT", "dependencies": { "@coinbase/wallet-sdk": "4.3.3", "@metamask/sdk": "0.32.0", @@ -12071,6 +12673,7 @@ "version": "2.17.3", "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.17.3.tgz", "integrity": "sha512-fgZR9fAiCFtGaosTspkTx5lidccq9Z5xRWOk1HG0VfB6euQGw2//Db7upiP4uQ7DPst2YS9yQN2A1m9+iJLYCw==", + "license": "MIT", "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", @@ -12097,6 +12700,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.1.tgz", "integrity": "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", @@ -12124,6 +12728,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -12142,6 +12747,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -12155,17 +12761,20 @@ "node_modules/@walletconnect/core/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@walletconnect/core/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@walletconnect/core/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -12178,6 +12787,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -12186,6 +12796,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -12277,6 +12888,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "license": "MIT", "dependencies": { "tslib": "1.14.1" } @@ -12284,12 +12896,14 @@ "node_modules/@walletconnect/environment/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/ethereum-provider": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.21.1.tgz", "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", + "license": "Apache-2.0", "dependencies": { "@reown/appkit": "1.7.8", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -12308,6 +12922,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -12326,6 +12941,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -12339,12 +12955,14 @@ "node_modules/@walletconnect/ethereum-provider/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@walletconnect/ethereum-provider/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -12357,6 +12975,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -12448,6 +13067,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "license": "MIT", "dependencies": { "keyvaluestorage-interface": "^1.0.0", "tslib": "1.14.1" @@ -12456,12 +13076,14 @@ "node_modules/@walletconnect/events/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/heartbeat": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "license": "MIT", "dependencies": { "@walletconnect/events": "^1.0.1", "@walletconnect/time": "^1.0.2", @@ -12472,6 +13094,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", + "license": "MIT", "dependencies": { "@walletconnect/jsonrpc-utils": "^1.0.6", "@walletconnect/safe-json": "^1.0.1", @@ -12483,6 +13106,7 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", + "license": "MIT", "dependencies": { "@walletconnect/jsonrpc-utils": "^1.0.8", "@walletconnect/safe-json": "^1.0.2", @@ -12493,6 +13117,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "license": "MIT", "dependencies": { "events": "^3.3.0", "keyvaluestorage-interface": "^1.0.0" @@ -12502,6 +13127,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "license": "MIT", "dependencies": { "@walletconnect/environment": "^1.0.1", "@walletconnect/jsonrpc-types": "^1.0.3", @@ -12511,12 +13137,14 @@ "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/jsonrpc-ws-connection": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "license": "MIT", "dependencies": { "@walletconnect/jsonrpc-utils": "^1.0.6", "@walletconnect/safe-json": "^1.0.2", @@ -12528,6 +13156,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -12548,6 +13177,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" @@ -12557,6 +13187,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", + "license": "MIT", "dependencies": { "@walletconnect/jsonrpc-types": "^1.0.2" } @@ -12565,6 +13196,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz", "integrity": "sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==", + "license": "MIT", "dependencies": { "@noble/curves": "1.8.0", "@noble/hashes": "1.7.0", @@ -12577,6 +13209,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz", "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.7.0" }, @@ -12591,6 +13224,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -12601,12 +13235,14 @@ "node_modules/@walletconnect/relay-auth/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@walletconnect/relay-auth/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -12615,6 +13251,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", + "license": "MIT", "dependencies": { "tslib": "1.14.1" } @@ -12622,12 +13259,14 @@ "node_modules/@walletconnect/safe-json/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/sign-client": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.1.tgz", "integrity": "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/core": "2.21.1", "@walletconnect/events": "1.0.1", @@ -12644,6 +13283,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", + "license": "MIT", "dependencies": { "tslib": "1.14.1" } @@ -12651,12 +13291,14 @@ "node_modules/@walletconnect/time/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/types": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.1.tgz", "integrity": "sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", @@ -12670,6 +13312,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -12688,6 +13331,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -12701,12 +13345,14 @@ "node_modules/@walletconnect/types/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@walletconnect/types/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -12719,6 +13365,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -12810,6 +13457,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.1.tgz", "integrity": "sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==", + "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -12829,6 +13477,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", @@ -12847,6 +13496,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -12860,12 +13510,14 @@ "node_modules/@walletconnect/universal-provider/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@walletconnect/universal-provider/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -12878,6 +13530,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -12969,6 +13622,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.1.tgz", "integrity": "sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==", + "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", @@ -12989,130 +13643,57 @@ "viem": "2.23.2" } }, - "node_modules/@walletconnect/utils/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "node_modules/@walletconnect/utils/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@walletconnect/utils/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/utils/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/utils/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/utils/node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@walletconnect/utils/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/utils/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "peerDependencies": { - "ws": "*" - } - }, "node_modules/@walletconnect/utils/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@walletconnect/utils/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/@walletconnect/utils/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/@walletconnect/utils/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -13125,6 +13706,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -13133,6 +13715,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", @@ -13230,6 +13813,7 @@ "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", @@ -13253,6 +13837,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -13273,6 +13858,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", + "license": "MIT", "dependencies": { "tslib": "1.14.1" } @@ -13280,12 +13866,14 @@ "node_modules/@walletconnect/window-getters/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@walletconnect/window-metadata": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", + "license": "MIT", "dependencies": { "@walletconnect/window-getters": "^1.0.1", "tslib": "1.14.1" @@ -13294,7 +13882,8 @@ "node_modules/@walletconnect/window-metadata/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@xstate/fsm": { "version": "1.6.5", @@ -13306,6 +13895,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -13337,7 +13927,8 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", @@ -13355,6 +13946,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -13490,6 +14082,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13499,6 +14092,7 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -13509,13 +14103,15 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/assert": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -13529,7 +14125,6 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" } @@ -13538,6 +14133,7 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" } @@ -13552,6 +14148,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -13748,7 +14345,8 @@ "node_modules/base-x": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", - "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==" + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" }, "node_modules/base64-arraybuffer": { "version": "1.0.2", @@ -13792,14 +14390,20 @@ "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" }, "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "license": "MIT", "engines": { "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" } }, "node_modules/binary-extensions": { @@ -13854,7 +14458,8 @@ "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" }, "node_modules/blob-to-it": { "version": "2.0.8", @@ -13886,7 +14491,8 @@ "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -13928,6 +14534,7 @@ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.17.0" } @@ -13937,6 +14544,7 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -13951,6 +14559,7 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, + "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -13962,6 +14571,7 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -13974,6 +14584,7 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", @@ -13988,6 +14599,7 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dev": true, + "license": "ISC", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -14008,13 +14620,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14029,13 +14643,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/browserify-sign/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -14044,13 +14660,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, + "license": "MIT", "dependencies": { "pako": "~1.0.5" } @@ -14091,6 +14709,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", "dependencies": { "base-x": "^5.0.0" } @@ -14123,7 +14742,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bufferutil": { "version": "4.0.9", @@ -14142,7 +14762,20 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "peer": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } }, "node_modules/cac": { "version": "6.7.14", @@ -14235,6 +14868,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -14251,6 +14885,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -14289,6 +14924,7 @@ "version": "3.9.3", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz", "integrity": "sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==", + "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.1", "buffer": "^6.0.3", @@ -14305,6 +14941,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -14320,11 +14957,10 @@ } }, "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, - "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -14333,7 +14969,7 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/chalk": { @@ -14404,7 +15040,6 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 16" } @@ -14452,6 +15087,7 @@ "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz", "integrity": "sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==", "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "multibase": "^4.0.1", "multicodec": "^3.0.1", @@ -14466,12 +15102,14 @@ "node_modules/cids/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/cids/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -14481,6 +15119,7 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" @@ -14706,7 +15345,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -14726,7 +15366,8 @@ "node_modules/cookie-es": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" }, "node_modules/core-js-compat": { "version": "3.41.0", @@ -14745,7 +15386,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", @@ -14777,6 +15419,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -14789,6 +15432,7 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -14798,13 +15442,15 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -14818,6 +15464,7 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -14831,7 +15478,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-fetch": { "version": "3.2.0", @@ -14860,6 +15508,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", "dependencies": { "uncrypto": "^0.1.3" } @@ -14869,6 +15518,7 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "dev": true, + "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", @@ -14900,6 +15550,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -14932,30 +15583,6 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/cuer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/cuer/-/cuer-0.0.2.tgz", - "integrity": "sha512-MG1BYnnSLqBnO0dOBS1Qm/TEc9DnFa9Sz2jMA24OF4hGzs8UuPjpKBMkRPF3lrpC+7b3EzULwooX9djcvsM8IA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "qr": "~0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18", - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -15111,9 +15738,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -15140,6 +15767,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -15155,6 +15783,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15182,14 +15811,16 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -15204,7 +15835,6 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -15245,7 +15875,8 @@ "node_modules/deep-object-diff": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", - "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -15317,7 +15948,8 @@ "node_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -15341,6 +15973,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/derive-valtio/-/derive-valtio-0.1.0.tgz", "integrity": "sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==", + "license": "MIT", "peerDependencies": { "valtio": "*" } @@ -15350,6 +15983,7 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -15358,12 +15992,14 @@ "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" }, "node_modules/detect-browser": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", + "license": "MIT" }, "node_modules/detect-libc": { "version": "2.0.4", @@ -15412,6 +16048,7 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -15422,7 +16059,8 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -15483,6 +16121,7 @@ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15520,6 +16159,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -15537,6 +16177,7 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", + "license": "MIT", "dependencies": { "@ecies/ciphers": "^0.2.3", "@noble/ciphers": "^1.3.0", @@ -15549,10 +16190,23 @@ "node": ">=16" } }, + "node_modules/eciesjs/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/eciesjs/node_modules/@noble/curves": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" }, @@ -15567,6 +16221,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -15632,7 +16287,8 @@ "node_modules/encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "license": "MIT" }, "node_modules/encoding": { "version": "0.1.13", @@ -15659,6 +16315,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -15667,6 +16324,7 @@ "version": "6.6.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -15679,6 +16337,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -15695,6 +16354,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -15715,6 +16375,7 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -15777,8 +16438,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -15810,7 +16470,12 @@ "node_modules/es-toolkit": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.33.0.tgz", - "integrity": "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==" + "integrity": "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] }, "node_modules/esbuild": { "version": "0.17.19", @@ -15876,7 +16541,6 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -15895,6 +16559,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz", "integrity": "sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==", + "license": "MIT", "dependencies": { "@metamask/eth-json-rpc-provider": "^1.0.0", "@metamask/safe-event-emitter": "^3.0.0", @@ -15910,6 +16575,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.1.2", "@types/debug": "^4.1.7", @@ -15925,6 +16591,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -15933,6 +16600,7 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -15944,6 +16612,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz", "integrity": "sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==", + "license": "ISC", "dependencies": { "@metamask/safe-event-emitter": "^3.0.0", "async-mutex": "^0.2.6", @@ -15959,6 +16628,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -15970,6 +16640,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", + "license": "ISC", "dependencies": { "json-rpc-random-id": "^1.0.0", "xtend": "^4.0.1" @@ -15979,46 +16650,78 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", + "license": "MIT", "dependencies": { "fast-safe-stringify": "^2.0.6" } }, "node_modules/ethereum-cryptography": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz", - "integrity": "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", "dependencies": { - "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.0", - "@noble/hashes": "1.8.0", - "@scure/bip32": "1.7.0", - "@scure/bip39": "1.6.0" - }, - "engines": { - "node": "^14.21.3 || >=16", - "npm": ">=9" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", - "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -16038,6 +16741,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", @@ -16086,6 +16790,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", @@ -16122,7 +16827,8 @@ "node_modules/eventemitter2": { "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -16134,6 +16840,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -16143,6 +16850,7 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -16201,7 +16909,8 @@ "node_modules/exponential-backoff": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==" + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "license": "Apache-2.0" }, "node_modules/extend": { "version": "3.0.2", @@ -16213,6 +16922,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==", + "license": "ISC", "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" @@ -16251,7 +16961,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-equals": { "version": "5.2.2", @@ -16288,6 +16999,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16295,7 +17007,8 @@ "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -16310,7 +17023,8 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.19.1", @@ -16381,6 +17095,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16773,6 +17488,7 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", + "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", @@ -16789,6 +17505,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz", "integrity": "sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==", + "license": "MIT", "dependencies": { "sparse-array": "^1.3.1", "uint8arrays": "^3.0.0" @@ -16801,12 +17518,14 @@ "node_modules/hamt-sharding/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/hamt-sharding/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -16815,6 +17534,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16885,6 +17605,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" @@ -17145,6 +17866,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -17156,6 +17878,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -17166,7 +17889,8 @@ "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/html-void-elements": { "version": "2.0.1", @@ -17204,7 +17928,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -17251,7 +17976,8 @@ "node_modules/idb-keyval": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", - "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==" + "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==", + "license": "Apache-2.0" }, "node_modules/ieee754": { "version": "1.2.1", @@ -17387,6 +18113,7 @@ "resolved": "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz", "integrity": "sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg==", "deprecated": "This module has been superseded by the multiformats module", + "license": "(Apache-2.0 AND MIT)", "dependencies": { "cids": "^1.1.6", "multicodec": "^3.0.1", @@ -17427,6 +18154,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz", "integrity": "sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA==", + "license": "MIT", "dependencies": { "ipfs-unixfs-importer": "^7.0.1", "meow": "^9.0.0" @@ -17449,6 +18177,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz", "integrity": "sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ==", + "license": "MIT", "dependencies": { "bl": "^5.0.0", "cids": "^1.1.5", @@ -17474,6 +18203,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", @@ -17484,6 +18214,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz", "integrity": "sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw==", + "license": "MIT", "dependencies": { "err-code": "^3.0.1", "protobufjs": "^6.10.2" @@ -17496,22 +18227,26 @@ "node_modules/ipfs-unixfs-importer/node_modules/it-all": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", - "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" + "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==", + "license": "ISC" }, "node_modules/ipfs-unixfs-importer/node_modules/it-first": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", - "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" + "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==", + "license": "ISC" }, "node_modules/ipfs-unixfs-importer/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/ipfs-unixfs-importer/node_modules/uint8arrays": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -17521,6 +18256,7 @@ "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz", "integrity": "sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg==", "deprecated": "This module has been superseded by @ipld/dag-pb and multiformats", + "license": "MIT", "dependencies": { "cids": "^1.0.0", "interface-ipld-format": "^1.0.0", @@ -17538,12 +18274,14 @@ "node_modules/ipld-dag-pb/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/ipld-dag-pb/node_modules/uint8arrays": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -17552,6 +18290,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/brc-dd" } @@ -17786,6 +18525,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -17849,6 +18589,7 @@ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -17994,6 +18735,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -18064,7 +18806,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -18087,20 +18828,22 @@ "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/isows": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", - "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "peerDependencies": { "ws": "*" } @@ -18114,7 +18857,8 @@ "node_modules/it-batch": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz", - "integrity": "sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==" + "integrity": "sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==", + "license": "ISC" }, "node_modules/it-first": { "version": "3.0.7", @@ -18150,6 +18894,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz", "integrity": "sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==", + "license": "ISC", "dependencies": { "it-batch": "^1.0.9" } @@ -18553,7 +19298,8 @@ "node_modules/jsbi": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", - "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==", + "license": "Apache-2.0" }, "node_modules/jsesc": { "version": "3.1.0", @@ -18577,6 +19323,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "license": "ISC", "dependencies": { "@metamask/safe-event-emitter": "^2.0.0", "eth-rpc-errors": "^4.0.2" @@ -18588,22 +19335,26 @@ "node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" + "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", + "license": "ISC" }, "node_modules/json-rpc-random-id": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", + "license": "ISC" }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-stringify-deterministic": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.12.tgz", "integrity": "sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -18638,6 +19389,7 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -18657,6 +19409,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18735,7 +19488,8 @@ "node_modules/limiter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/limiter/-/limiter-3.0.0.tgz", - "integrity": "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==" + "integrity": "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==", + "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -18747,6 +19501,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==", + "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^2.1.0", "lit-element": "^4.2.0", @@ -18757,6 +19512,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz", "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==", + "license": "BSD-3-Clause", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.1.0", @@ -18767,6 +19523,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.0.tgz", "integrity": "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==", + "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -18832,7 +19589,8 @@ "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" }, "node_modules/longest-streak": { "version": "3.1.0", @@ -18857,11 +19615,10 @@ } }, "node_modules/loupe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", - "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", - "dev": true, - "license": "MIT" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true }, "node_modules/lru-cache": { "version": "5.1.1", @@ -18896,6 +19653,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -18904,6 +19662,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -18935,6 +19694,7 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -19173,6 +19933,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" } @@ -19187,6 +19948,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -19212,6 +19974,7 @@ "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19223,6 +19986,7 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } @@ -19258,7 +20022,8 @@ "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "license": "MIT" }, "node_modules/micromark": { "version": "3.2.0", @@ -19841,6 +20606,7 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -19853,7 +20619,8 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", @@ -19927,6 +20694,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19935,6 +20703,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -19948,6 +20717,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19971,6 +20741,7 @@ "url": "https://github.com/sponsors/wagmi-dev" } ], + "license": "MIT", "peerDependencies": { "typescript": ">=5.0.4" }, @@ -19998,7 +20769,8 @@ "node_modules/modern-ahocorasick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", - "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==" + "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==", + "license": "MIT" }, "node_modules/moo": { "version": "0.5.2", @@ -20026,6 +20798,7 @@ "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "@multiformats/base-x": "^4.0.1" }, @@ -20039,6 +20812,7 @@ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz", "integrity": "sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==", "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "uint8arrays": "^3.0.0", "varint": "^6.0.0" @@ -20047,12 +20821,14 @@ "node_modules/multicodec/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/multicodec/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -20067,6 +20843,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", + "license": "MIT", "dependencies": { "multibase": "^4.0.1", "uint8arrays": "^3.0.0", @@ -20080,12 +20857,14 @@ "node_modules/multihashes/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/multihashes/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -20093,12 +20872,14 @@ "node_modules/multihashes/node_modules/varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "license": "MIT" }, "node_modules/multihashing-async": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz", "integrity": "sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg==", + "license": "MIT", "dependencies": { "blakejs": "^1.1.0", "err-code": "^3.0.0", @@ -20115,12 +20896,14 @@ "node_modules/multihashing-async/node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/multihashing-async/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", "dependencies": { "multiformats": "^9.4.2" } @@ -20129,6 +20912,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -20179,14 +20963,16 @@ } }, "node_modules/next": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-15.4.4.tgz", - "integrity": "sha512-kNcubvJjOL9yUOfwtZF3HfDhuhp+kVD+FM2A6Tyua1eI/xfmY4r/8ZS913MMz+oWKDlbps/dQOWdDricuIkXLw==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.5.tgz", + "integrity": "sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==", "license": "MIT", "peer": true, "dependencies": { - "@next/env": "15.4.4", + "@next/env": "15.3.5", + "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -20198,19 +20984,19 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.4.4", - "@next/swc-darwin-x64": "15.4.4", - "@next/swc-linux-arm64-gnu": "15.4.4", - "@next/swc-linux-arm64-musl": "15.4.4", - "@next/swc-linux-x64-gnu": "15.4.4", - "@next/swc-linux-x64-musl": "15.4.4", - "@next/swc-win32-arm64-msvc": "15.4.4", - "@next/swc-win32-x64-msvc": "15.4.4", - "sharp": "^0.34.3" + "@next/swc-darwin-arm64": "15.3.5", + "@next/swc-darwin-x64": "15.3.5", + "@next/swc-linux-arm64-gnu": "15.3.5", + "@next/swc-linux-arm64-musl": "15.3.5", + "@next/swc-linux-x64-gnu": "15.3.5", + "@next/swc-linux-x64-musl": "15.3.5", + "@next/swc-win32-arm64-msvc": "15.3.5", + "@next/swc-win32-x64-msvc": "15.3.5", + "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", + "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", @@ -20292,7 +21078,8 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -20317,7 +21104,8 @@ "node_modules/node-fetch-native": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "license": "MIT" }, "node_modules/node-gyp-build": { "version": "4.8.4", @@ -20333,7 +21121,8 @@ "node_modules/node-mock-http": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.1.tgz", - "integrity": "sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==" + "integrity": "sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==", + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", @@ -20346,6 +21135,7 @@ "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", "dev": true, + "license": "MIT", "dependencies": { "assert": "^2.0.0", "browser-resolve": "^2.0.0", @@ -20398,6 +21188,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -20407,12 +21198,14 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -20427,6 +21220,7 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -20503,6 +21297,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==", + "license": "ISC", "dependencies": { "end-of-stream": "^1.4.0", "once": "^1.4.0", @@ -20512,12 +21307,14 @@ "node_modules/obj-multiplex/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/obj-multiplex/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20531,12 +21328,14 @@ "node_modules/obj-multiplex/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/obj-multiplex/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -20624,6 +21423,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "license": "MIT", "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", @@ -20633,7 +21433,8 @@ "node_modules/on-exit-leak-free": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", @@ -20706,7 +21507,8 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/os-tmpdir": { "version": "1.0.2", @@ -20719,9 +21521,9 @@ } }, "node_modules/ox": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", - "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", "funding": [ { "type": "github", @@ -20782,6 +21584,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.1.1" }, @@ -20796,6 +21599,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -20821,6 +21625,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -20876,6 +21681,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -20890,7 +21696,8 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", @@ -20909,6 +21716,7 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, + "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", @@ -20980,7 +21788,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-exists": { "version": "3.0.0", @@ -21056,11 +21865,10 @@ "license": "MIT" }, "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.16" } @@ -21070,6 +21878,7 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", "dev": true, + "license": "MIT", "dependencies": { "create-hash": "~1.1.3", "create-hmac": "^1.1.7", @@ -21087,6 +21896,7 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -21099,6 +21909,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1" } @@ -21108,6 +21919,7 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^2.0.0", "inherits": "^2.0.1" @@ -21144,6 +21956,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", @@ -21165,6 +21978,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "license": "MIT", "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" @@ -21173,7 +21987,8 @@ "node_modules/pino-std-serializers": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", + "license": "MIT" }, "node_modules/pirates": { "version": "4.0.7", @@ -21189,6 +22004,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -21201,6 +22017,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -21217,6 +22034,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -21232,6 +22050,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -21247,6 +22066,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -21262,6 +22082,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -21346,6 +22167,7 @@ "version": "2.1.11", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "license": "0BSD", "engines": { "node": ">=12.0.0" } @@ -21524,6 +22346,7 @@ "version": "10.26.9", "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -21585,6 +22408,7 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -21592,12 +22416,14 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/process-warning": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -21640,6 +22466,7 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -21674,7 +22501,8 @@ "node_modules/proxy-compare": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", - "integrity": "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==" + "integrity": "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==", + "license": "MIT" }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -21703,6 +22531,7 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21716,12 +22545,14 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21737,17 +22568,6 @@ "node": ">=6" } }, - "node_modules/qr": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.0.tgz", - "integrity": "sha512-LtnyJsepKCMzfmHBZKVNo1g29kS+8ZbuxE9294EsRhHgVVpy4x8eFw9o4J9SIolDHoDYuaEIY+z8UjiCv/eudA==", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -21779,6 +22599,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -21793,6 +22614,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -21838,12 +22660,14 @@ "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "license": "MIT", "engines": { "node": ">=8" } @@ -21852,6 +22676,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "license": "MIT", "dependencies": { "@assemblyscript/loader": "^0.9.4", "bl": "^5.0.0", @@ -21868,6 +22693,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", @@ -21877,7 +22703,8 @@ "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" }, "node_modules/ramda": { "version": "0.27.2", @@ -21891,6 +22718,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -21900,6 +22728,7 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -22343,6 +23172,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -22357,6 +23187,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -22373,6 +23204,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -22385,6 +23217,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -22396,6 +23229,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -22410,6 +23244,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -22421,6 +23256,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -22429,6 +23265,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -22436,12 +23273,14 @@ "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -22453,6 +23292,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -22461,6 +23301,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -22496,6 +23337,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -22896,6 +23738,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -22997,6 +23840,7 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -23314,6 +24158,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -23336,7 +24181,8 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -23419,24 +24265,33 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, @@ -23453,28 +24308,27 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" } }, "node_modules/sharp/node_modules/semver": { @@ -23634,6 +24488,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -23648,6 +24503,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -23664,6 +24520,7 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -23676,6 +24533,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -23704,6 +24562,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -23749,12 +24608,14 @@ "node_modules/sparse-array": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==", + "license": "ISC" }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -23763,12 +24624,14 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -23777,12 +24640,14 @@ "node_modules/spdx-license-ids": { "version": "3.0.21", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "license": "CC0-1.0" }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -23791,6 +24656,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -23799,7 +24665,8 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" }, "node_modules/stack-utils": { "version": "2.0.6", @@ -23855,6 +24722,7 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -23865,6 +24733,7 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -23875,7 +24744,8 @@ "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" }, "node_modules/stream-to-it": { "version": "1.0.1", @@ -23886,10 +24756,20 @@ "it-stream-types": "^2.0.1" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -23996,26 +24876,6 @@ "node": ">=8" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -24155,6 +25015,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -24355,6 +25216,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "license": "MIT", "dependencies": { "real-require": "^0.1.0" } @@ -24371,6 +25233,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, + "license": "MIT", "dependencies": { "setimmediate": "^1.0.4" }, @@ -24397,11 +25260,10 @@ "dev": true }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -24414,11 +25276,10 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, - "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -24429,11 +25290,10 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -24442,11 +25302,10 @@ } }, "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -24456,17 +25315,15 @@ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -24488,7 +25345,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dev": true, + "license": "MIT", "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", @@ -24513,7 +25370,8 @@ "node_modules/toformat": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", - "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==", + "license": "MIT" }, "node_modules/tr46": { "version": "0.0.3", @@ -24535,6 +25393,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -24586,7 +25445,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/turbo-stream": { "version": "2.4.0", @@ -24611,7 +25471,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -24664,7 +25524,8 @@ "node_modules/ufo": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" }, "node_modules/uint8-varint": { "version": "2.0.4", @@ -24697,7 +25558,8 @@ "node_modules/uncrypto": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" }, "node_modules/undici": { "version": "7.6.0", @@ -24883,6 +25745,7 @@ "version": "0.1.34", "resolved": "https://registry.npmjs.org/universal-sdk/-/universal-sdk-0.1.34.tgz", "integrity": "sha512-1YNXbuEsBe6XWiHdWuUKvrOLm4G11LVWRQ8b/PSHNQE78sria+a0ONyZdtReGGk5uhJLdbCh39po2fl5Eg7BbQ==", + "license": "ISC", "dependencies": { "@uniswap/uniswapx-sdk": "^2.0.1-alpha.10", "axios": "^1.7.9", @@ -24988,6 +25851,7 @@ "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" @@ -25000,7 +25864,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/use-callback-ref": { "version": "1.3.3", @@ -25085,6 +25950,7 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -25100,13 +25966,10 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -25133,6 +25996,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -25142,6 +26006,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", "integrity": "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==", + "license": "MIT", "dependencies": { "derive-valtio": "0.1.0", "proxy-compare": "2.6.0", @@ -25167,6 +26032,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -25174,7 +26040,8 @@ "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "license": "MIT" }, "node_modules/vaul": { "version": "1.1.2", @@ -25312,50 +26179,46 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "node_modules/viem/node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "ws": "*" } }, - "node_modules/viem/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "node_modules/viem/node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "typescript": ">=5.4.0" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "typescript": { "optional": true } } @@ -25420,171 +26283,527 @@ } } }, - "node_modules/vite-bundle-visualizer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vite-bundle-visualizer/-/vite-bundle-visualizer-1.2.1.tgz", - "integrity": "sha512-cwz/Pg6+95YbgIDp+RPwEToc4TKxfsFWSG/tsl2DSZd9YZicUag1tQXjJ5xcL7ydvEoaC2FOZeaXOU60t9BRXw==", + "node_modules/vite-bundle-visualizer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vite-bundle-visualizer/-/vite-bundle-visualizer-1.2.1.tgz", + "integrity": "sha512-cwz/Pg6+95YbgIDp+RPwEToc4TKxfsFWSG/tsl2DSZd9YZicUag1tQXjJ5xcL7ydvEoaC2FOZeaXOU60t9BRXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "import-from-esm": "^1.3.3", + "rollup-plugin-visualizer": "^5.11.0", + "tmp": "^0.2.1" + }, + "bin": { + "vite-bundle-visualizer": "bin.js" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/vite-bundle-visualizer/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/vite-node": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.3.tgz", + "integrity": "sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/vite-plugin-node-polyfills": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", + "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-inject": "^5.0.5", + "node-stdlib-browser": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/davidmyersdev" + }, + "peerDependencies": { + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz", + "integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "p-map": "^7.0.3", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "import-from-esm": "^1.3.3", - "rollup-plugin-visualizer": "^5.11.0", - "tmp": "^0.2.1" - }, - "bin": { - "vite-bundle-visualizer": "bin.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=12" } }, - "node_modules/vite-bundle-visualizer/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.14" + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=12" } }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/vite-plugin-node-polyfills": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", - "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^5.0.5", - "node-stdlib-browser": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/davidmyersdev" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite-plugin-static-copy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz", - "integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "chokidar": "^3.5.3", - "fast-glob": "^3.2.11", - "fs-extra": "^11.1.0", - "p-map": "^7.0.3", - "picocolors": "^1.0.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" + "node": ">=12" } }, - "node_modules/vite-plugin-static-copy/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=12" } }, - "node_modules/vite-plugin-static-copy/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.10.0" + "node": ">=12" } }, - "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" @@ -25630,34 +26849,31 @@ } }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.3.tgz", + "integrity": "sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", + "@vitest/expect": "3.1.3", + "@vitest/mocker": "3.1.3", + "@vitest/pretty-format": "^3.1.3", + "@vitest/runner": "3.1.3", + "@vitest/snapshot": "3.1.3", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", "chai": "^5.2.0", - "debug": "^4.4.1", + "debug": "^4.4.0", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", + "tinyglobby": "^0.2.13", + "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.3", "why-is-node-running": "^2.3.0" }, "bin": { @@ -25673,8 +26889,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@vitest/browser": "3.1.3", + "@vitest/ui": "3.1.3", "happy-dom": "*", "jsdom": "*" }, @@ -25702,62 +26918,24 @@ } } }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "node_modules/vitest/node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wagmi": { "version": "2.15.6", "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.15.6.tgz", "integrity": "sha512-tR4tm+7eE0UloQe1oi4hUIjIDyjv5ImQlzq/QcvvfJYWF/EquTfGrmht6+nTYGCIeSzeEvbK90KgWyNqa+HD7Q==", + "license": "MIT", "dependencies": { "@wagmi/connectors": "5.8.5", "@wagmi/core": "2.17.3", @@ -25850,7 +27028,8 @@ "node_modules/webextension-polyfill": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", - "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==" + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", + "license": "MPL-2.0" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -26032,9 +27211,10 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -26063,6 +27243,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } @@ -26164,6 +27345,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -26220,6 +27402,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", + "license": "MIT", "engines": { "node": ">=12.20.0" }, diff --git a/package.json b/package.json index feceb413e..369333b4b 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "theme-ui": "0.17.1", "universal-sdk": "^0.1.34", "vaul": "^1.1.1", - "viem": "2.30.0", + "viem": "^2.30.0", "wagmi": "^2.15.6", "zod": "^3.23.8" }, From e44b9e172ff9b76f1c7410b2ffb512cf2ab0174d Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 24 Jul 2025 20:57:11 -0300 Subject: [PATCH 82/85] chore: add useAtomicBatch hook --- src/hooks/use-atomic-batch.ts | 23 +++++++++++++++++++ .../index-dtf/issuance/async-swaps/index.tsx | 10 ++++---- 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/hooks/use-atomic-batch.ts diff --git a/src/hooks/use-atomic-batch.ts b/src/hooks/use-atomic-batch.ts new file mode 100644 index 000000000..a25236fce --- /dev/null +++ b/src/hooks/use-atomic-batch.ts @@ -0,0 +1,23 @@ +import { chainIdAtom } from '@/state/atoms' +import { useAtomValue } from 'jotai' +import { useAccount, useCapabilities } from 'wagmi' + +const useAtomicBatch = () => { + const chainId = useAtomValue(chainIdAtom) + const { data } = useCapabilities() + const { connector } = useAccount() + + const atomicBatchSupported = data?.[chainId]?.atomicBatch?.supported + const atomicSupported = ['ready', 'supported'].includes( + data?.[chainId]?.atomic?.status ?? '' + ) + const isMetamask = + connector?.id.toLowerCase().includes('metamask') || + connector?.name.toLowerCase().includes('metamask') + + return { + atomicSupported: (atomicBatchSupported || atomicSupported) && !isMetamask, + } +} + +export default useAtomicBatch diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index 71c6e027d..d01a1a0fb 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -1,12 +1,11 @@ import { Button } from '@/components/ui/button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import useAtomicBatch from '@/hooks/use-atomic-batch' import { cn } from '@/lib/utils' -import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { useAtom, useAtomValue } from 'jotai' import { ArrowLeft, Settings } from 'lucide-react' import { useEffect } from 'react' -import { useCapabilities } from 'wagmi' import useTrackIndexDTFPage from '../../hooks/useTrackIndexDTFPage' import RefreshQuote from '../../overview/components/zap-mint/refresh-quote' import Updater from '../manual/updater' @@ -22,8 +21,8 @@ import { successAtom, userInputAtom, } from './atom' -import Collaterals, { showCollateralsAtom } from './collaterals' import AtomicBatchRequired from './atomic-batch-required' +import Collaterals, { showCollateralsAtom } from './collaterals' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Config from './settings' import Success from './success' @@ -127,12 +126,11 @@ const Header = () => { const AsyncSwaps = () => { useTrackIndexDTFPage('mint-async-swap') - const chainId = useAtomValue(chainIdAtom) const [currentTab, setCurrentTab] = useAtom(operationAtom) const [showSettings, setShowSettings] = useAtom(showSettingsAtom) const indexDTF = useAtomValue(indexDTFAtom) const success = useAtomValue(successAtom) - const { data } = useCapabilities() + const { atomicSupported } = useAtomicBatch() const reset = () => { setShowSettings(false) @@ -150,7 +148,7 @@ const AsyncSwaps = () => { if (!indexDTF) return null - if (!data?.[chainId]?.atomicBatch?.supported) { + if (!atomicSupported) { return (
From 4898b4172ac4aa0406461b4b457e74b98604b1ad Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 9 Oct 2025 16:59:00 -0300 Subject: [PATCH 83/85] chore: update cowswap packages --- package-lock.json | 1397 ++++------------- package.json | 5 +- .../issuance/async-swaps/cowswap-order.tsx | 3 + .../async-swaps/hooks/useQuoteSignatures.ts | 47 +- 4 files changed, 338 insertions(+), 1114 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc6ca54ac..c14d4c5a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,9 @@ "version": "1.0.0", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", - "@cowprotocol/app-data": "^3.1.0", - "@cowprotocol/cow-sdk": "^5.10.3", + "@cowprotocol/cow-sdk": "^7.0.8", + "@cowprotocol/sdk-app-data": "^4.1.1", + "@cowprotocol/sdk-viem-adapter": "^0.1.2", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", @@ -2044,12 +2045,48 @@ "node": ">=6" } }, - "node_modules/@cowprotocol/app-data": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-3.3.0.tgz", - "integrity": "sha512-3lfknouwg+j/xSyL5u5FI8rAlGPkzi+QsmXQvPS0O0ETaikx9v9pt5t3pZOv6jtsAmafFBFPtAUp/cdPrDSUaA==", + "node_modules/@cowprotocol/cow-sdk": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@cowprotocol/cow-sdk/-/cow-sdk-7.0.8.tgz", + "integrity": "sha512-G2RZvVsoZvLysXVtZWDXQuRMtEoyfL1P36gTt7YZA80ulUuZMBREtFPSwrRRxaGaDKvvmxa8ZS9FdQ5sWsA2ZA==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@cowprotocol/sdk-app-data": "4.1.1", + "@cowprotocol/sdk-common": "0.2.1", + "@cowprotocol/sdk-config": "0.1.0", + "@cowprotocol/sdk-contracts-ts": "0.3.1", + "@cowprotocol/sdk-order-book": "0.1.2", + "@cowprotocol/sdk-order-signing": "0.1.5", + "@cowprotocol/sdk-trading": "0.3.2" + }, + "peerDependencies": { + "@openzeppelin/merkle-tree": "^1.x", + "cross-fetch": "^3.x", + "ipfs-only-hash": "^4.x", + "multiformats": "^9.x" + }, + "peerDependenciesMeta": { + "@openzeppelin/merkle-tree": { + "optional": true + }, + "cross-fetch": { + "optional": false + }, + "ipfs-only-hash": { + "optional": true + }, + "multiformats": { + "optional": true + } + } + }, + "node_modules/@cowprotocol/sdk-app-data": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-app-data/-/sdk-app-data-4.1.1.tgz", + "integrity": "sha512-1S5oNejCX2sznRkrteDDoVSK1+HUHEXXI1yTihEN+ptIvnI1t9oI9Sp3SEil7TdPSfpliO+qMNGBflHJZbSI0A==", "license": "MIT", "dependencies": { + "@cowprotocol/sdk-common": "0.2.1", "ajv": "^8.11.0", "cross-fetch": "^3.1.5", "ipfs-only-hash": "^4.0.0", @@ -2057,102 +2094,96 @@ "multiformats": "^9.6.4" }, "peerDependencies": { + "ajv": "^8.x", "cross-fetch": "^3.x", - "ethers": "^5.0.0", "ipfs-only-hash": "^4.x", "multiformats": "^9.x" } }, - "node_modules/@cowprotocol/app-data/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" + "node_modules/@cowprotocol/sdk-common": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-common/-/sdk-common-0.2.1.tgz", + "integrity": "sha512-7EBKg7CyKLAtmDZdAh5Nsv2KPstUNbdLuNXtCimQk+TNb6OhWgNnCuCf9tOCyQ/yllQvXfNEc5shdXQfx5VXdw==", + "license": "MIT" }, - "node_modules/@cowprotocol/contracts": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@cowprotocol/contracts/-/contracts-1.8.0.tgz", - "integrity": "sha512-rMEHo1UBB6k4kRoWejHZNGggg6IBVt7vAd8x0FhEvjxhbq3zlAex61f9HpAcDExJNuvfwwDjsOc/7UGztCzhSw==", - "license": "LGPL-3.0-or-later", - "peerDependencies": { - "ethers": "^5.4.0" + "node_modules/@cowprotocol/sdk-config": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-config/-/sdk-config-0.1.0.tgz", + "integrity": "sha512-tbGbsa0IzlwDEAzl/03m/p7/AHe3p2BmdUykytVfLAGzKT8/8TDgD2FULtr5n4oaBFDpHCApaFZvpplQufZDGQ==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "limiter": "^2.1.0" } }, - "node_modules/@cowprotocol/cow-sdk": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/@cowprotocol/cow-sdk/-/cow-sdk-5.10.3.tgz", - "integrity": "sha512-whnfufOmJqJWw7u2HqLt6k+rw8eMH+ywmB++oxG6U6zLBdQihk18mIMz1wrNwfTUk0FFtn8g8nhrQL14oV27rg==", - "license": "(MIT OR Apache-2.0)", + "node_modules/@cowprotocol/sdk-contracts-ts": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-contracts-ts/-/sdk-contracts-ts-0.3.1.tgz", + "integrity": "sha512-0iC0VNnpxvMcv31osin67kWhmhSbWnNsqvLLR7lWedbgrLWGpEl0qavqikIAzkaTsTb7Lw72p38j6Jqkgno22Q==", + "license": "MIT", "dependencies": { - "@cowprotocol/app-data": "^2.4.0", - "@cowprotocol/contracts": "^1.6.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@openzeppelin/merkle-tree": "^1.0.5", - "cross-fetch": "^3.1.5", - "exponential-backoff": "^3.1.1", - "graphql": "^16.3.0", - "graphql-request": "^4.3.0", + "@cowprotocol/sdk-common": "0.2.1", + "@cowprotocol/sdk-config": "0.1.0" + } + }, + "node_modules/@cowprotocol/sdk-order-book": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-order-book/-/sdk-order-book-0.1.2.tgz", + "integrity": "sha512-dYJESuhxqJ1mcrp8Fmxg88dRildymh88xeOtJsOYIep8yMixCluSBQTmfokNeraYGytTWL187cyPtOvC95pneg==", + "license": "MIT", + "dependencies": { + "@cowprotocol/sdk-common": "0.2.1", + "@cowprotocol/sdk-config": "0.1.0", + "cross-fetch": "^3.2.0", + "exponential-backoff": "^3.1.2", "limiter": "^3.0.0" - }, - "peerDependencies": { - "ethers": "^5.7.2" } }, - "node_modules/@cowprotocol/cow-sdk/node_modules/@cowprotocol/app-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-2.5.1.tgz", - "integrity": "sha512-GvcLQ44ZUHKdSAXiZ+YCaIehtme/OIvbvL/4go1UqNLTj3jDTDkagPh7CH/z2IPwFWTADyNZO/RSzKrW5UDNaA==", + "node_modules/@cowprotocol/sdk-order-book/node_modules/limiter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-3.0.0.tgz", + "integrity": "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==", + "license": "MIT" + }, + "node_modules/@cowprotocol/sdk-order-signing": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-order-signing/-/sdk-order-signing-0.1.5.tgz", + "integrity": "sha512-geklxUqOajoPA/A+6b/AXmCeXyCkiaQfKgJv/E/z76JN3U0GrQPNUTcefd8qUa+hE/UF3RPjxrRkcc5N/zc2fA==", "license": "MIT", "dependencies": { - "ajv": "^8.11.0", - "cross-fetch": "^3.1.5", - "ipfs-only-hash": "^4.0.0", - "json-stringify-deterministic": "^1.0.8", - "multiformats": "^9.6.4" - }, - "peerDependencies": { - "cross-fetch": "^3.x", - "ethers": "^5.0.0", - "ipfs-only-hash": "^4.x", - "multiformats": "^9.x" + "@cowprotocol/sdk-common": "0.2.1", + "@cowprotocol/sdk-config": "0.1.0", + "@cowprotocol/sdk-contracts-ts": "0.3.1", + "@cowprotocol/sdk-order-book": "0.1.2" } }, - "node_modules/@cowprotocol/cow-sdk/node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "node_modules/@cowprotocol/sdk-trading": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-trading/-/sdk-trading-0.3.2.tgz", + "integrity": "sha512-W10c9Ocks0RPsTlwWXgNaz6rIpNOH9rU4G1gSBx5RpFDeKgfsw5qbhCb72TaX49PleSbZjbgpuVxzKHy9b3riQ==", "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" + "@cowprotocol/sdk-app-data": "4.1.1", + "@cowprotocol/sdk-common": "0.2.1", + "@cowprotocol/sdk-config": "0.1.0", + "@cowprotocol/sdk-contracts-ts": "0.3.1", + "@cowprotocol/sdk-order-book": "0.1.2", + "@cowprotocol/sdk-order-signing": "0.1.5", + "deepmerge": "^4.3.1" } }, - "node_modules/@cowprotocol/cow-sdk/node_modules/graphql-request": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", - "integrity": "sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==", + "node_modules/@cowprotocol/sdk-viem-adapter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cowprotocol/sdk-viem-adapter/-/sdk-viem-adapter-0.1.2.tgz", + "integrity": "sha512-3+hyq97YO/YtSR04qyPJCscliniKOxgiAlBSOaObkp8d+J6G4zkMgGMzSlk4G84hy6lacmtsKPwz/Aeht5kX+w==", "license": "MIT", "dependencies": { - "cross-fetch": "^3.1.5", - "extract-files": "^9.0.0", - "form-data": "^3.0.0" + "@cowprotocol/sdk-common": "0.2.1" }, "peerDependencies": { - "graphql": "14 - 16" + "viem": "^2.28.4" } }, - "node_modules/@cowprotocol/cow-sdk/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", @@ -2220,17 +2251,6 @@ "@noble/ciphers": "^1.0.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -3580,541 +3600,142 @@ "react-hook-form": "^7.0.0" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", - "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@ipld/dag-cbor": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.2.tgz", + "integrity": "sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", - "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/@ipld/dag-cbor/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/@ipld/dag-json": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.3.tgz", + "integrity": "sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-json/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/@ipld/dag-pb": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", + "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.1.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "engines": { + "node": ">=12" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", - "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", - "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", - "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", - "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", - "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", - "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", - "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/runtime": "^1.4.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", - "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", - "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", - "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.2.tgz", - "integrity": "sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-json": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.3.tgz", - "integrity": "sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", - "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { @@ -4309,6 +3930,12 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/@libp2p/crypto/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@libp2p/interface": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.7.0.tgz", @@ -4323,6 +3950,12 @@ "uint8arraylist": "^2.4.8" } }, + "node_modules/@libp2p/interface/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@libp2p/logger": { "version": "5.1.13", "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.13.tgz", @@ -4336,6 +3969,12 @@ "weald": "^1.0.4" } }, + "node_modules/@libp2p/logger/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@libp2p/peer-id": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.0.tgz", @@ -4348,6 +3987,12 @@ "uint8arrays": "^5.1.0" } }, + "node_modules/@libp2p/peer-id/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@lingui/babel-plugin-extract-messages": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.14.0.tgz", @@ -4648,64 +4293,6 @@ "moo": "^0.5.1" } }, - "node_modules/@metamask/abi-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-2.0.4.tgz", - "integrity": "sha512-StnIgUB75x7a7AgUhiaUZDpCsqGp7VkNnZh2XivXkJ6mPkE83U8ARGQj5MbRis7VJY8BC5V1AbB1fjdh0hupPQ==", - "license": "(Apache-2.0 AND MIT)", - "dependencies": { - "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^9.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@metamask/abi-utils/node_modules/@metamask/utils": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", - "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", - "license": "ISC", - "dependencies": { - "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.1.0", - "@noble/hashes": "^1.3.1", - "@scure/base": "^1.1.3", - "@types/debug": "^4.1.7", - "debug": "^4.3.4", - "pony-cause": "^2.1.10", - "semver": "^7.5.4", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@metamask/abi-utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@metamask/abi-utils/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@metamask/eth-json-rpc-provider": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", @@ -5111,160 +4698,30 @@ "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.0.tgz", - "integrity": "sha512-9RNmlIGwZbBLsHekT50dbt4o4u8Iciw9kGjv+WHiGxQdsJ6xKKjU1+C0Vbas6RilMbaVOAOnEyfNcXbUmTkLxQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.3.0" - } - }, - "node_modules/@next/env": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.5.tgz", - "integrity": "sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==", - "license": "MIT", - "peer": true - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.5.tgz", - "integrity": "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.5.tgz", - "integrity": "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.5.tgz", - "integrity": "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.5.tgz", - "integrity": "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.5.tgz", - "integrity": "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" + "uint8arrays": "^5.0.0" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.5.tgz", - "integrity": "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" + "node_modules/@multiformats/multiaddr-to-uri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.0.tgz", + "integrity": "sha512-9RNmlIGwZbBLsHekT50dbt4o4u8Iciw9kGjv+WHiGxQdsJ6xKKjU1+C0Vbas6RilMbaVOAOnEyfNcXbUmTkLxQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.3.0" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.5.tgz", - "integrity": "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "node_modules/@multiformats/multiaddr/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" }, - "node_modules/@next/swc-win32-x64-msvc": { + "node_modules/@next/env": { "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", - "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", - "cpu": [ - "x64" - ], + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.5.tgz", + "integrity": "sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "peer": true }, "node_modules/@noble/ciphers": { "version": "1.2.1", @@ -5340,99 +4797,6 @@ "node": ">= 8" } }, - "node_modules/@openzeppelin/merkle-tree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@openzeppelin/merkle-tree/-/merkle-tree-1.0.8.tgz", - "integrity": "sha512-E2c9/Y3vjZXwVvPZKqCKUn7upnvam1P1ZhowJyZVQSkzZm5WhumtaRr+wkUXrZVfkIc7Gfrl7xzabElqDL09ow==", - "license": "MIT", - "dependencies": { - "@metamask/abi-utils": "^2.0.4", - "ethereum-cryptography": "^3.0.0" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/curves": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", - "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/merkle-tree/node_modules/ethereum-cryptography": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz", - "integrity": "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg==", - "license": "MIT", - "dependencies": { - "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.0", - "@noble/hashes": "1.8.0", - "@scure/bip32": "1.7.0", - "@scure/bip39": "1.6.0" - }, - "engines": { - "node": "^14.21.3 || >=16", - "npm": ">=9" - } - }, "node_modules/@paulmillr/qr": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", @@ -9732,12 +9096,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@reown/appkit-controllers/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@reown/appkit-controllers/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -10134,12 +9492,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@reown/appkit-utils/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@reown/appkit-utils/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -10470,12 +9822,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@reown/appkit/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@reown/appkit/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -12764,12 +12110,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@walletconnect/core/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@walletconnect/core/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -13232,12 +12572,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@walletconnect/relay-auth/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@walletconnect/relay-auth/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -13683,12 +13017,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/@walletconnect/utils/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/@walletconnect/utils/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -15099,12 +14427,6 @@ "npm": ">=3.0.0" } }, - "node_modules/cids/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/cids/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -15241,21 +14563,6 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -15274,18 +14581,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -16001,17 +15296,6 @@ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", "license": "MIT" }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -17515,12 +16799,6 @@ "npm": ">=6.0.0" } }, - "node_modules/hamt-sharding/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/hamt-sharding/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -18236,12 +17514,6 @@ "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==", "license": "ISC" }, - "node_modules/ipfs-unixfs-importer/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/ipfs-unixfs-importer/node_modules/uint8arrays": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", @@ -18271,12 +17543,6 @@ "npm": ">=3.0.0" } }, - "node_modules/ipld-dag-pb/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/ipld-dag-pb/node_modules/uint8arrays": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", @@ -19384,6 +18650,12 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/just-performance": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz", + "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q==", + "license": "MIT" + }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -19464,6 +18736,12 @@ "wherearewe": "^2.0.1" } }, + "node_modules/kubo-rpc-client/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -19486,10 +18764,13 @@ } }, "node_modules/limiter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-3.0.0.tgz", - "integrity": "sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz", + "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==", + "license": "MIT", + "dependencies": { + "just-performance": "4.3.0" + } }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -20818,12 +20099,6 @@ "varint": "^6.0.0" } }, - "node_modules/multicodec/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/multicodec/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -20834,10 +20109,10 @@ } }, "node_modules/multiformats": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", - "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", - "license": "Apache-2.0 OR MIT" + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" }, "node_modules/multihashes": { "version": "4.0.3", @@ -20854,12 +20129,6 @@ "npm": ">=6.0.0" } }, - "node_modules/multihashes/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/multihashes/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -20893,12 +20162,6 @@ "npm": ">=6.0.0" } }, - "node_modules/multihashing-async/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/multihashing-async/node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -24288,63 +23551,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sharp": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", - "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.2", - "@img/sharp-darwin-x64": "0.34.2", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.2", - "@img/sharp-linux-arm64": "0.34.2", - "@img/sharp-linux-s390x": "0.34.2", - "@img/sharp-linux-x64": "0.34.2", - "@img/sharp-linuxmusl-arm64": "0.34.2", - "@img/sharp-linuxmusl-x64": "0.34.2", - "@img/sharp-wasm32": "0.34.2", - "@img/sharp-win32-arm64": "0.34.2", - "@img/sharp-win32-ia32": "0.34.2", - "@img/sharp-win32-x64": "0.34.2" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -24455,25 +23661,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -25555,6 +24742,12 @@ "multiformats": "^13.0.0" } }, + "node_modules/uint8arrays/node_modules/multiformats": { + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", + "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/uncrypto": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", diff --git a/package.json b/package.json index 369333b4b..b11c60a6e 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "type": "module", "dependencies": { "@binance/w3w-rainbow-connector-v2": "^1.0.2", - "@cowprotocol/app-data": "^3.1.0", - "@cowprotocol/cow-sdk": "^5.10.3", + "@cowprotocol/cow-sdk": "^7.0.8", + "@cowprotocol/sdk-app-data": "^4.1.1", + "@cowprotocol/sdk-viem-adapter": "^0.1.2", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", diff --git a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx index ca178b20a..e60d9e95f 100644 --- a/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx +++ b/src/views/index-dtf/issuance/async-swaps/cowswap-order.tsx @@ -12,6 +12,7 @@ import { operationAtom } from './atom' import { useOrderStatus } from './hooks/useOrderStatus' import { Skeleton } from '@/components/ui/skeleton' import { useMemo } from 'react' +import { chainIdAtom } from '@/state/atoms' const STATUS_MAP: Record = { [CowSwapOrderStatus.PRESIGNATURE_PENDING]: 'Processing', @@ -65,6 +66,7 @@ const CowSwapOrder = ({ orderId: string disableFetch?: boolean }) => { + const chainId = useAtomValue(chainIdAtom) const { data } = useOrderStatus({ orderId, disabled: disableFetch }) const operation = useAtomValue(operationAtom) const indexDTFBasket = useAtomValue(indexDTFBasketAtom) @@ -94,6 +96,7 @@ const CowSwapOrder = ({ symbol={ indexDTFBasket?.find((t) => t.address === token)?.symbol || '' } + chain={chainId} size="xl" />
diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts index 99c5e971b..2db3ff996 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/useQuoteSignatures.ts @@ -2,22 +2,23 @@ import CowswapSettlement from '@/abis/CowSwapSettlement' import { notifyError } from '@/hooks/useNotification' import { chainIdAtom, walletAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' -import { MetadataApi } from '@cowprotocol/app-data' -import { OrderBalance } from '@cowprotocol/contracts' +import { MetadataApi } from '@cowprotocol/sdk-app-data' import { AppDataHash, + OrderBalance, OrderCreation, OrderQuoteResponse, OrderSigningUtils, SigningScheme, } from '@cowprotocol/cow-sdk' +import { ViemAdapter } from '@cowprotocol/sdk-viem-adapter' import { useMutation } from '@tanstack/react-query' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import pLimit from 'p-limit' import { useCallback, useRef } from 'react' import { generateTypedData, OrderRequest, Quote } from 'universal-sdk' import { Address, encodeFunctionData, Hex, maxUint256, parseUnits } from 'viem' -import { useSendCalls, useSignTypedData } from 'wagmi' +import { useSendCalls, useSignTypedData, usePublicClient } from 'wagmi' import { cowswapOrderIdsAtom, cowswapOrdersAtom, @@ -153,6 +154,7 @@ export function useQuoteSignatures(refresh = false) { const { sendCallsAsync } = useSendCalls() const failedOrders = useAtomValue(failedOrdersAtom) const { signTypedDataAsync } = useSignTypedData() + const publicClient = usePublicClient() const limiter = pLimit(1) @@ -175,14 +177,39 @@ export function useQuoteSignatures(refresh = false) { } } - const metadataApi = new MetadataApi() + // Create a Viem adapter for the MetadataApi + let metadataApi: MetadataApi + if (publicClient) { + const viemAdapter = new ViemAdapter({ provider: publicClient }) + metadataApi = new MetadataApi(viemAdapter) + } else { + // Fallback without adapter + metadataApi = new MetadataApi() + } + + let appDataContent: string + let appDataHex: AppDataHash - const appDataDoc = await metadataApi.generateAppDataDoc({ - appCode: 'Reserve Protocol', - environment: 'production', - }) - const { appDataContent, appDataHex } = - await metadataApi.getAppDataInfo(appDataDoc) + try { + const appDataDoc = await metadataApi.generateAppDataDoc({ + appCode: 'Reserve Protocol', + environment: 'production', + }) + const appDataInfo = await metadataApi.getAppDataInfo(appDataDoc) + appDataContent = appDataInfo.appDataContent + appDataHex = appDataInfo.appDataHex + } catch (error) { + console.error('Failed to calculate appDataHex', error) + // Fallback to a simple appData structure if MetadataApi fails + appDataContent = JSON.stringify({ + appCode: 'Reserve Protocol', + environment: 'production', + version: '1.0.0' + }) + // Use a default hex value - this is the keccak256 hash of the appDataContent + appDataHex = '0x' + '0'.repeat(64) as AppDataHash + console.warn('Using fallback appData due to MetadataApi error') + } const successfulQuotes = Object.values(quotes).filter( (quote) => quote.success From ba5696a0abaa15b58d40ae6a13821e0c208d5880 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Thu, 9 Oct 2025 17:20:39 -0300 Subject: [PATCH 84/85] fix: atomic support --- src/hooks/use-atomic-batch.ts | 7 ++++--- src/views/index-dtf/issuance/async-swaps/success.tsx | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hooks/use-atomic-batch.ts b/src/hooks/use-atomic-batch.ts index a25236fce..1ee9cfcd7 100644 --- a/src/hooks/use-atomic-batch.ts +++ b/src/hooks/use-atomic-batch.ts @@ -5,11 +5,12 @@ import { useAccount, useCapabilities } from 'wagmi' const useAtomicBatch = () => { const chainId = useAtomValue(chainIdAtom) const { data } = useCapabilities() - const { connector } = useAccount() + const { connector, chainId: connectedChainId } = useAccount() - const atomicBatchSupported = data?.[chainId]?.atomicBatch?.supported + const atomicBatchSupported = + data?.[connectedChainId || chainId]?.atomicBatch?.supported const atomicSupported = ['ready', 'supported'].includes( - data?.[chainId]?.atomic?.status ?? '' + data?.[connectedChainId || chainId]?.atomic?.status ?? '' ) const isMetamask = connector?.id.toLowerCase().includes('metamask') || diff --git a/src/views/index-dtf/issuance/async-swaps/success.tsx b/src/views/index-dtf/issuance/async-swaps/success.tsx index c2b60cfe5..84ca2e8df 100644 --- a/src/views/index-dtf/issuance/async-swaps/success.tsx +++ b/src/views/index-dtf/issuance/async-swaps/success.tsx @@ -280,6 +280,7 @@ const MainTransaction = () => {
From 7d5706a05a93502fe5e76df061b2445155670b22 Mon Sep 17 00:00:00 2001 From: Juan Pablo Rombola Date: Wed, 15 Oct 2025 11:04:06 -0300 Subject: [PATCH 85/85] chore: improve wallet connection --- package-lock.json | 25 +++++------ package.json | 2 +- src/hooks/use-atomic-batch.ts | 44 ++++++++++++++----- src/views/index-dtf/index-dtf-container.tsx | 16 ++++++- .../async-mint/submit-mint-orders.tsx | 29 +++++++----- .../async-swaps/atomic-batch-required.tsx | 30 ++++++++----- .../async-swaps/hooks/useQuoteSignatures.ts | 13 ++++-- .../issuance/async-swaps/hooks/utils.ts | 2 + .../index-dtf/issuance/async-swaps/index.tsx | 11 +++-- 9 files changed, 116 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff1f35084..de0d9f2f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "@radix-ui/react-toggle": "^1.1.1", "@radix-ui/react-toggle-group": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.8", - "@rainbow-me/rainbowkit": "2.2.8", + "@rainbow-me/rainbowkit": "2.2.9", "@react-spring/web": "^9.7.1", "@reserve-protocol/dtf-rebalance-lib": "2.6.3", "@reserve-protocol/react-zapper": "^1.4.0", @@ -9129,16 +9129,16 @@ "license": "MIT" }, "node_modules/@rainbow-me/rainbowkit": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.8.tgz", - "integrity": "sha512-EdNIK2cdAT6GJ9G11wx7nCVfjqBfxh7dx/1DhPYrB+yg+VFrII6cM1PiMFVC9evD4mqVHe9mmLAt3nvlwDdiPQ==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.9.tgz", + "integrity": "sha512-zXAeqkqpznpj9yEs1bTbpZbq0pVYKdJUnqqK/nI8xyYFDWchIOyBoEb/4+goT5RaHfGbDe9dp6pIEu/KelKE6A==", "license": "MIT", "dependencies": { "@vanilla-extract/css": "1.17.3", "@vanilla-extract/dynamic": "2.1.4", "@vanilla-extract/sprinkles": "1.6.4", "clsx": "2.1.1", - "cuer": "0.0.2", + "cuer": "0.0.3", "react-remove-scroll": "2.6.2", "ua-parser-js": "^1.0.37" }, @@ -15864,9 +15864,9 @@ "license": "MIT" }, "node_modules/cuer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/cuer/-/cuer-0.0.2.tgz", - "integrity": "sha512-MG1BYnnSLqBnO0dOBS1Qm/TEc9DnFa9Sz2jMA24OF4hGzs8UuPjpKBMkRPF3lrpC+7b3EzULwooX9djcvsM8IA==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/cuer/-/cuer-0.0.3.tgz", + "integrity": "sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==", "funding": [ { "type": "github", @@ -22851,15 +22851,12 @@ } }, "node_modules/qr": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.0.tgz", - "integrity": "sha512-LtnyJsepKCMzfmHBZKVNo1g29kS+8ZbuxE9294EsRhHgVVpy4x8eFw9o4J9SIolDHoDYuaEIY+z8UjiCv/eudA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.2.tgz", + "integrity": "sha512-91M3sVlA7xCFpkJtYX5xzVH8tDo4rNZ7jr8v+1CRgPVkZ4D+Vl9y8rtZWJ/YkEUM6U/h0FAu5W/JAK7iowOteA==", "license": "(MIT OR Apache-2.0)", "engines": { "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" } }, "node_modules/qrcode": { diff --git a/package.json b/package.json index 91781c0b8..1bf278da8 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@radix-ui/react-toggle": "^1.1.1", "@radix-ui/react-toggle-group": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.8", - "@rainbow-me/rainbowkit": "2.2.8", + "@rainbow-me/rainbowkit": "2.2.9", "@react-spring/web": "^9.7.1", "@reserve-protocol/dtf-rebalance-lib": "2.6.3", "@reserve-protocol/react-zapper": "^1.4.0", diff --git a/src/hooks/use-atomic-batch.ts b/src/hooks/use-atomic-batch.ts index 1ee9cfcd7..2f96c5bcd 100644 --- a/src/hooks/use-atomic-batch.ts +++ b/src/hooks/use-atomic-batch.ts @@ -1,23 +1,43 @@ -import { chainIdAtom } from '@/state/atoms' +import { chainIdAtom, walletAtom } from '@/state/atoms' import { useAtomValue } from 'jotai' -import { useAccount, useCapabilities } from 'wagmi' +import { useEffect } from 'react' +import { useCapabilities } from 'wagmi' +import { notifyError } from './useNotification' const useAtomicBatch = () => { const chainId = useAtomValue(chainIdAtom) - const { data } = useCapabilities() - const { connector, chainId: connectedChainId } = useAccount() - - const atomicBatchSupported = - data?.[connectedChainId || chainId]?.atomicBatch?.supported + const account = useAtomValue(walletAtom) + const { data, isLoading, failureReason, error } = useCapabilities({ + chainId, + query: { + enabled: !!account, + }, + }) + const atomicBatchSupported = data?.atomicBatch?.supported const atomicSupported = ['ready', 'supported'].includes( - data?.[connectedChainId || chainId]?.atomic?.status ?? '' + data?.atomic?.status ?? '' ) - const isMetamask = - connector?.id.toLowerCase().includes('metamask') || - connector?.name.toLowerCase().includes('metamask') + + useEffect(() => { + if (error || failureReason) { + const name = error?.name || failureReason?.name || 'Error' + const message = + error?.message || failureReason?.message || 'Unknown error' + + if ( + name.includes('ConnectorNotConnected') || + name.includes('TypeError') + ) { + return + } + + notifyError(name, message) + } + }, [error, failureReason]) return { - atomicSupported: (atomicBatchSupported || atomicSupported) && !isMetamask, + atomicSupported: atomicBatchSupported || atomicSupported, + isLoading: isLoading && !failureReason, } } diff --git a/src/views/index-dtf/index-dtf-container.tsx b/src/views/index-dtf/index-dtf-container.tsx index 005fad593..96ea547aa 100644 --- a/src/views/index-dtf/index-dtf-container.tsx +++ b/src/views/index-dtf/index-dtf-container.tsx @@ -48,7 +48,13 @@ const useChainWatch = () => { }, [chainId]) } -const IndexDTFMetadataUpdater = ({ tokenAddress, chainId }: { tokenAddress?: string; chainId: number }) => { +const IndexDTFMetadataUpdater = ({ + tokenAddress, + chainId, +}: { + tokenAddress?: string + chainId: number +}) => { const setIndexDTF = useSetAtom(indexDTFAtom) const setIndexDTFBrand = useSetAtom(indexDTFBrandAtom) const { data } = useIndexDTF(tokenAddress, chainId as AvailableChain) @@ -86,7 +92,13 @@ const IndexDTFMetadataUpdater = ({ tokenAddress, chainId }: { tokenAddress?: str return null } -const IndexDTFBasketUpdater = ({ tokenAddress, chainId }: { tokenAddress?: string; chainId: number }) => { +const IndexDTFBasketUpdater = ({ + tokenAddress, + chainId, +}: { + tokenAddress?: string + chainId: number +}) => { const setBasket = useSetAtom(indexDTFBasketAtom) const setBasketPrices = useSetAtom(indexDTFBasketPricesAtom) const setBasketAmounts = useSetAtom(indexDTFBasketAmountsAtom) diff --git a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx index fc4ea6114..a73b19ac1 100644 --- a/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx +++ b/src/views/index-dtf/issuance/async-swaps/async-mint/submit-mint-orders.tsx @@ -10,6 +10,8 @@ import { userInputAtom, } from '../atom' import { useStableQuoteSignatures } from '../hooks/useQuoteSignatures' +import { TransactionButtonContainer } from '@/components/ui/transaction' +import { chainIdAtom } from '@/state/atoms' type SubmitMintProps = { loadingQuote?: boolean @@ -25,6 +27,7 @@ const SubmitMintButton = ({ isPending: boolean loadingQuote?: boolean }) => { + const chainId = useAtomValue(chainIdAtom) const insufficientBalance = useAtomValue(insufficientBalanceAtom) const selectedTokenBalance = useAtomValue(selectedTokenBalanceAtom) const inputAmount = useAtomValue(userInputAtom) @@ -64,17 +67,23 @@ const SubmitMintButton = ({ }, [insufficientBalance, isPending, loadingQuote, infoMessage]) return ( - + + ) } diff --git a/src/views/index-dtf/issuance/async-swaps/atomic-batch-required.tsx b/src/views/index-dtf/issuance/async-swaps/atomic-batch-required.tsx index 07b19dce4..052ebf913 100644 --- a/src/views/index-dtf/issuance/async-swaps/atomic-batch-required.tsx +++ b/src/views/index-dtf/issuance/async-swaps/atomic-batch-required.tsx @@ -1,6 +1,9 @@ import { Button } from '@/components/ui/button' import Help from '@/components/ui/help' +import { TransactionButtonContainer } from '@/components/ui/transaction' +import { chainIdAtom } from '@/state/atoms' import { useConnectModal } from '@rainbow-me/rainbowkit' +import { useAtomValue } from 'jotai' import { ExternalLink, OctagonAlert } from 'lucide-react' import { useEffect, useState } from 'react' import { useAccount, useDisconnect } from 'wagmi' @@ -10,6 +13,7 @@ const AtomicBatchRequired = () => { const { disconnect } = useDisconnect() const { isConnected } = useAccount() const [shouldOpenModal, setShouldOpenModal] = useState(false) + const chainId = useAtomValue(chainIdAtom) useEffect(() => { if (shouldOpenModal && !isConnected && openConnectModal) { @@ -67,17 +71,23 @@ const AtomicBatchRequired = () => {
- + + infoMessage || prev) - await sendCallsWithRetry(sendCallsAsync, txData, address) + await sendCallsWithRetry(sendCallsAsync, chainId, txData, address) } catch (error) { console.error('sendCallsAsync', error) notifyError('Transaction failed', 'Please try again') @@ -444,7 +444,12 @@ export function useQuoteSignatures(refresh = false) { ) setInfoMessage((prev) => fallbackInfoMessage || prev) - await sendCallsWithRetry(sendCallsAsync, fallbackTxData, address) + await sendCallsWithRetry( + sendCallsAsync, + chainId, + fallbackTxData, + address + ) } catch (error) { console.error('sendCallsAsync', error) notifyError('Transaction failed', 'Please try again') diff --git a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts index e0332fced..eed146d0a 100644 --- a/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts +++ b/src/views/index-dtf/issuance/async-swaps/hooks/utils.ts @@ -96,6 +96,7 @@ export async function getAssetPrice( // Function to handle sendCallsAsync with retry logic for user rejections export const sendCallsWithRetry = async ( sendCallsAsync: any, + chainId: number, calls: any[], account: Address, maxRetries: number = 2 @@ -105,6 +106,7 @@ export const sendCallsWithRetry = async ( for (let attempt = 0; attempt <= maxRetries; attempt++) { try { const txBundle = await sendCallsAsync({ + chainId, calls, account, forceAtomic: true, diff --git a/src/views/index-dtf/issuance/async-swaps/index.tsx b/src/views/index-dtf/issuance/async-swaps/index.tsx index d01a1a0fb..34fe81cc8 100644 --- a/src/views/index-dtf/issuance/async-swaps/index.tsx +++ b/src/views/index-dtf/issuance/async-swaps/index.tsx @@ -26,6 +26,7 @@ import Collaterals, { showCollateralsAtom } from './collaterals' import { GlobalProtocolKitProvider } from './providers/GlobalProtocolKitProvider' import Config from './settings' import Success from './success' +import { Skeleton } from '@/components/ui/skeleton' function Content() { const showSettings = useAtomValue(showSettingsAtom) @@ -130,7 +131,7 @@ const AsyncSwaps = () => { const [showSettings, setShowSettings] = useAtom(showSettingsAtom) const indexDTF = useAtomValue(indexDTFAtom) const success = useAtomValue(successAtom) - const { atomicSupported } = useAtomicBatch() + const { atomicSupported, isLoading } = useAtomicBatch() const reset = () => { setShowSettings(false) @@ -148,10 +149,14 @@ const AsyncSwaps = () => { if (!indexDTF) return null - if (!atomicSupported) { + if (isLoading || !atomicSupported) { return (
- + {isLoading ? ( + + ) : ( + + )}
) }