diff --git a/apps/web/package.json b/apps/web/package.json index f881107168..c44f416efa 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,6 +8,7 @@ "check": "tsc --pretty --noEmit", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf .next && rm -rf .swc", "dev": "next dev", + "generate-swaps": "tsx test/swap/scripts/generate-swaps.ts", "lint": "TIMING=1 next lint", "lint:fix": "TIMING=1 next lint --fix", "start": "next start", @@ -129,6 +130,7 @@ "postcss": "8.4.23", "schema-dts": "^1.1.2", "tailwindcss": "3.3.2", + "tsx": "^4.16.5", "typescript": "5.4.5", "unimported": "1.30.0" } diff --git a/apps/web/src/app/(cms)/academy/components/article-card/article-card.tsx b/apps/web/src/app/(cms)/academy/components/article-card/article-card.tsx index 7a8dc06ddc..e780b12d50 100644 --- a/apps/web/src/app/(cms)/academy/components/article-card/article-card.tsx +++ b/apps/web/src/app/(cms)/academy/components/article-card/article-card.tsx @@ -27,7 +27,7 @@ export function ArticleCard({ article }: ArticleCard) { className={classNames( isMediaVideo(article.cover.provider_metadata) ? '' - : 'group-hover:scale-[1.06] scale-[1.01] transition duration-[400ms]', + : 'group-hover:scale-[1.06] scale-[1.01] transition [animation-duration:400ms]', )} image={article.cover} quality={100} diff --git a/apps/web/src/app/(cms)/blog/components/article-card/article-card.tsx b/apps/web/src/app/(cms)/blog/components/article-card/article-card.tsx index 57bc0a7403..d841e14168 100644 --- a/apps/web/src/app/(cms)/blog/components/article-card/article-card.tsx +++ b/apps/web/src/app/(cms)/blog/components/article-card/article-card.tsx @@ -13,14 +13,14 @@ interface ArticleCard { export function ArticleCard({ article }: ArticleCard) { return ( -
+
{article.cover ? ( - error instanceof BaseError && - (error.message.includes('MinimalOutputBalanceViolation') || - error.message.includes('0x963b34a5')) +const isMinOutError = (_error: CallErrorType): Hex | false => { + const error = _error.walk() as RawContractError + const data = typeof error?.data === 'object' ? error.data?.data : error.data + return data?.includes('0x963b34a5') ? data : false +} export function useSimulateTrade({ trade, @@ -28,14 +27,15 @@ export function useSimulateTrade({ mutate: { setTokenTax }, } = useDerivedStateSimpleSwap() - const simulateTrade = useSimulateContract({ + const { address } = useAccount() + + const simulateTrade = useCall({ chainId: chainId, - address: isRouteProcessor4ChainId(chainId) + to: isRouteProcessor4ChainId(chainId) ? ROUTE_PROCESSOR_4_ADDRESS[chainId] : undefined, - abi: routeProcessor4Abi, - functionName: trade?.functionName || 'processRoute', // To make typescript happy - args: trade?.writeArgs as any, + data: trade?.txdata as Hex | undefined, + account: address, value: trade?.value || 0n, query: { retry: (i, error) => { @@ -50,35 +50,40 @@ export function useSimulateTrade({ enabled: enabled && Boolean( - trade?.writeArgs && - trade?.functionName && + address && + trade?.txdata && isRouteProcessor4ChainId(chainId) && trade?.route?.status !== 'NoWay', ), }, }) + const prevErrorRef = useRef() + const prevDataRef = useRef() + // onSuccess useEffect(() => { - if (simulateTrade.data) { - if (typeof trade?.tokenTax === 'undefined') { + if (simulateTrade.data && simulateTrade.data !== prevDataRef.current) { + prevDataRef.current = simulateTrade.data + + if (trade && typeof trade.tokenTax === 'undefined') { setTokenTax(false) } } - }, [setTokenTax, simulateTrade.data, trade?.tokenTax]) + }, [simulateTrade.data, trade, setTokenTax]) // onError useEffect(() => { - const error = simulateTrade.error + if (simulateTrade.error && simulateTrade.error !== prevErrorRef.current) { + prevErrorRef.current = simulateTrade.error - if (error) { - if (isMinOutError(error)) { + const errorData = isMinOutError(simulateTrade.error) + if (errorData) { if (trade?.amountOut && typeof trade.tokenTax === 'undefined') { const _tokenTax = getTokenTax({ - error, + data: errorData, expectedAmountOut: trade.amountOut, }) - setTokenTax(_tokenTax) } else if (trade?.tokenTax !== false) { setTokenTax(false) @@ -90,19 +95,34 @@ export function useSimulateTrade({ return useMemo( () => ({ ...simulateTrade, + data: simulateTrade.data + ? { + ...simulateTrade.data, + request: { + to: isRouteProcessor4ChainId(chainId) + ? ROUTE_PROCESSOR_4_ADDRESS[chainId] + : undefined, + data: trade?.txdata as Hex | undefined, + value: trade?.value || 0n, + account: address, + }, + } + : undefined, isError: trade && typeof trade.tokenTax === 'undefined' && + simulateTrade.error && isMinOutError(simulateTrade.error) ? false : simulateTrade.isError, error: trade && typeof trade.tokenTax === 'undefined' && + simulateTrade.error && isMinOutError(simulateTrade.error) ? null : simulateTrade.error, }), - [simulateTrade, trade], + [simulateTrade, trade, chainId, address], ) } diff --git a/apps/web/src/lib/swap/getTokenTax.ts b/apps/web/src/lib/swap/getTokenTax.ts index 795c2db1e0..508d3dd21e 100644 --- a/apps/web/src/lib/swap/getTokenTax.ts +++ b/apps/web/src/lib/swap/getTokenTax.ts @@ -1,50 +1,35 @@ -import { SimulateContractErrorType } from '@wagmi/core' import { Fraction, Percent } from 'sushi' import { Amount, Type } from 'sushi/currency' -import { decodeErrorResult } from 'viem' +import { Hex, decodeErrorResult } from 'viem' const MAX_TOKEN_TAX = new Percent(1_000, 10_000) // 10% export const getTokenTax = ({ - error, + data, expectedAmountOut, }: { - error: SimulateContractErrorType + data: Hex expectedAmountOut: Amount }) => { let amountOut: bigint | undefined = undefined try { - const decodedErrors = error.message.match( - /Error: MinimalOutputBalanceViolation\(uint256 amountOut\)\s+\(\d+\)/g, - ) - - if (decodedErrors) { - const parsedAmountOut = decodedErrors[0].match(/\(\d+\)/g) - if (parsedAmountOut) { - amountOut = BigInt(parsedAmountOut[0].slice(1, -1)) - } - } else { - const encodedErrors = error.message.match(/0x963b34a5[a-fA-F0-9]{64}/g) - if (encodedErrors) { - amountOut = decodeErrorResult({ - abi: [ + amountOut = decodeErrorResult({ + abi: [ + { + inputs: [ { - inputs: [ - { - internalType: 'uint256', - name: 'amountOut', - type: 'uint256', - }, - ], - name: 'MinimalOutputBalanceViolation', - type: 'error', + internalType: 'uint256', + name: 'amountOut', + type: 'uint256', }, ], - data: encodedErrors[0] as `0x${string}`, - }).args[0] - } - } + name: 'MinimalOutputBalanceViolation', + type: 'error', + }, + ], + data, + }).args[0] } catch (_) {} if (amountOut) { diff --git a/apps/web/src/lib/wagmi/hooks/trade/use-client-trade.ts b/apps/web/src/lib/wagmi/hooks/trade/use-client-trade.ts index fca842e051..369f465d99 100644 --- a/apps/web/src/lib/wagmi/hooks/trade/use-client-trade.ts +++ b/apps/web/src/lib/wagmi/hooks/trade/use-client-trade.ts @@ -146,23 +146,22 @@ export const useClientTrade = (variables: UseTradeParams) => { } if (route) { - const amountIn = Amount.fromRawAmount( - fromToken, - route.amountInBI.toString(), - ) + const amountIn = Amount.fromRawAmount(fromToken, route.amountInBI) const amountOut = Amount.fromRawAmount( toToken, new Fraction(route.amountOutBI).multiply( tokenTax ? new Percent(1).subtract(tokenTax) : 1, ).quotient, ) - const minAmountOut = Amount.fromRawAmount( - toToken, - slippageAmount( - amountOut, - new Percent(Math.floor(+slippagePercentage * 100), 10_000), - )[0], - ) + const minAmountOut = args?.amountOutMin + ? Amount.fromRawAmount(toToken, args.amountOutMin) + : Amount.fromRawAmount( + toToken, + slippageAmount( + Amount.fromRawAmount(toToken, route.amountOutBI), + new Percent(Math.floor(+slippagePercentage * 100), 10_000), + )[0], + ) const isOffset = chainId === ChainId.POLYGON && carbonOffset // let writeArgs: UseTradeReturnWriteArgs = args @@ -171,7 +170,7 @@ export const useClientTrade = (variables: UseTradeParams) => { args.tokenIn as Address, args.amountIn, args.tokenOut as Address, - minAmountOut.quotient, + args.amountOutMin, args.to as Address, args.routeCode as Hex, ] @@ -233,6 +232,7 @@ export const useClientTrade = (variables: UseTradeParams) => { : 'processRoute', writeArgs, value, + txdata: args?.data, tokenTax, }), 250, diff --git a/apps/web/src/ui/swap/simple/derivedstate-simple-swap-provider.tsx b/apps/web/src/ui/swap/simple/derivedstate-simple-swap-provider.tsx index dbc965712e..142bf21f7f 100644 --- a/apps/web/src/ui/swap/simple/derivedstate-simple-swap-provider.tsx +++ b/apps/web/src/ui/swap/simple/derivedstate-simple-swap-provider.tsx @@ -420,12 +420,17 @@ const useSimpleSwapTrade = () => { const useSwapApi = !isFallback && !forceClient + const adjustedSlippage = useMemo( + () => (tokenTax ? slippagePercent.add(tokenTax) : slippagePercent), + [slippagePercent, tokenTax], + ) + const apiTrade = useApiTrade({ chainId, fromToken: token0, toToken: token1, amount: swapAmount, - slippagePercentage: slippagePercent.toFixed(2), + slippagePercentage: adjustedSlippage.toFixed(2), gasPrice, recipient: recipient as Address, enabled: Boolean(useSwapApi && swapAmount?.greaterThan(ZERO)), @@ -442,7 +447,7 @@ const useSimpleSwapTrade = () => { fromToken: token0, toToken: token1, amount: swapAmount, - slippagePercentage: slippagePercent.toFixed(2), + slippagePercentage: adjustedSlippage.toFixed(2), gasPrice, recipient: recipient as Address, enabled: Boolean(!useSwapApi && swapAmount?.greaterThan(ZERO)), diff --git a/apps/web/src/ui/swap/simple/simple-swap-trade-review-dialog.tsx b/apps/web/src/ui/swap/simple/simple-swap-trade-review-dialog.tsx index 6479e2ba30..05f0ff1ade 100644 --- a/apps/web/src/ui/swap/simple/simple-swap-trade-review-dialog.tsx +++ b/apps/web/src/ui/swap/simple/simple-swap-trade-review-dialog.tsx @@ -53,8 +53,8 @@ import { import { useAccount, usePublicClient, + useSendTransaction, useWaitForTransactionReceipt, - useWriteContract, } from 'wagmi' import { APPROVE_TAG_SWAP } from '../../../lib/constants' import { @@ -353,10 +353,10 @@ export const SimpleSwapTradeReviewDialog: FC<{ ) const { - writeContractAsync, + sendTransactionAsync, isPending: isWritePending, data, - } = useWriteContract({ + } = useSendTransaction({ mutation: { onMutate: () => { // Set reference of current trade @@ -370,15 +370,15 @@ export const SimpleSwapTradeReviewDialog: FC<{ }) const write = useMemo(() => { - if (!writeContractAsync || !simulation) return undefined + if (!sendTransactionAsync || !simulation) return undefined return async (confirm: () => void) => { try { - await writeContractAsync(simulation.request) + await sendTransactionAsync(simulation.request) confirm() } catch {} } - }, [simulation, writeContractAsync]) + }, [simulation, sendTransactionAsync]) const { status } = useWaitForTransactionReceipt({ chainId: chainId, @@ -542,7 +542,7 @@ export const SimpleSwapTradeReviewDialog: FC<{ !!error || isWritePending || Boolean( - !writeContractAsync && + !sendTransactionAsync && swapAmount?.greaterThan(ZERO), ) || isError, diff --git a/apps/web/test/playwright.config.ts b/apps/web/test/playwright.config.ts index 93dfbf8074..0f42ccddae 100644 --- a/apps/web/test/playwright.config.ts +++ b/apps/web/test/playwright.config.ts @@ -20,7 +20,7 @@ const baseURL = `http://localhost:${PORT}` const config: PlaywrightTestConfig = { quiet: !!process.env.CI, testMatch: [ - 'pool.test.ts', + // 'pool.test.ts', 'simple.test.ts', // 'smart.test.ts', // 'cross-chain.test.ts', diff --git a/apps/web/test/swap/mock/137-native-to-usdc.json b/apps/web/test/swap/mock/137-native-to-usdc.json index b2e0d8c52a..cd74f7acd9 100644 --- a/apps/web/test/swap/mock/137-native-to-usdc.json +++ b/apps/web/test/swap/mock/137-native-to-usdc.json @@ -60,6 +60,7 @@ "amountOutMin": "89028230", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "routeCode": "0x0301ffff020146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270010d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0121988C9CFD08db3b5793c2C6782271dC9474925101f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "value": "100000000000000000000" + "value": "100000000000000000000", + "txdata": "0x2646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000000000000000000000000000000000000054e7686000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000700301ffff020146b3fdf7b5cde91ac049936bf0bdb12c5d22202e0d500b1d8e8ef31e21c99d1db9a6444d3adf1270010d500b1d8e8ef31e21c99d1db9a6444d3adf127001ffff0121988c9cfd08db3b5793c2c6782271dc9474925101f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-native-to-usdt.json b/apps/web/test/swap/mock/137-native-to-usdt.json index 7e0dcd3cae..cd79befd69 100644 --- a/apps/web/test/swap/mock/137-native-to-usdt.json +++ b/apps/web/test/swap/mock/137-native-to-usdt.json @@ -77,6 +77,7 @@ "amountOutMin": "89750498", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "routeCode": "0x0301ffff020146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270010d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0121988C9CFD08db3b5793c2C6782271dC947492510146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e012791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff018CFaab34f5159abf9C35587AC40d09a05dC9476501f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "value": "100000000000000000000" + "value": "100000000000000000000", + "txdata": "0x2646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f0000000000000000000000000000000000000000000000000000000005597be2000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b20301ffff020146b3fdf7b5cde91ac049936bf0bdb12c5d22202e0d500b1d8e8ef31e21c99d1db9a6444d3adf1270010d500b1d8e8ef31e21c99d1db9a6444d3adf127001ffff0121988c9cfd08db3b5793c2c6782271dc947492510146b3fdf7b5cde91ac049936bf0bdb12c5d22202e012791bca1f2de4661ed88a30c99a7a9449aa8417401ffff018cfaab34f5159abf9c35587ac40d09a05dc9476501f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-native-to-wbtc.json b/apps/web/test/swap/mock/137-native-to-wbtc.json index 1ae7f069d9..194c7f995a 100644 --- a/apps/web/test/swap/mock/137-native-to-wbtc.json +++ b/apps/web/test/swap/mock/137-native-to-wbtc.json @@ -116,6 +116,7 @@ "amountOutMin": "9524339", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "routeCode": "0x0301ffff020146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270010d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270031249016b75F2189F0E11C52e814E09e280eb1a9A8A094a01f39Fd6e51aad88F6F4ce6aB8827279cffFb9226613b101A374094527e1673A86dE625aa59517c5dE346d320146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202effff0186f1d8390222A3691C28938eC7404A1661E618e00146B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e017ceB23fD6bC0adD59E62ac25578270cFf1b9f61901ffff0150eaEDB835021E4A108B7290636d62E9765cc6d700f39Fd6e51aad88F6F4ce6aB8827279cffFb92266012791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff01eEF1A9507B3D505f0062f2be9453981255b503c800f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "value": "7000000000000000000000" + "value": "7000000000000000000000", + "txdata": "0x2646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000017b7883c069166000000000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd60000000000000000000000000000000000000000000000000000000000915473000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014c0301ffff020146b3fdf7b5cde91ac049936bf0bdb12c5d22202e0d500b1d8e8ef31e21c99d1db9a6444d3adf1270010d500b1d8e8ef31e21c99d1db9a6444d3adf1270031249016b75f2189f0e11c52e814e09e280eb1a9a8a094a01f39fd6e51aad88f6f4ce6ab8827279cfffb9226613b101a374094527e1673a86de625aa59517c5de346d320146b3fdf7b5cde91ac049936bf0bdb12c5d22202effff0186f1d8390222a3691c28938ec7404a1661e618e00146b3fdf7b5cde91ac049936bf0bdb12c5d22202e017ceb23fd6bc0add59e62ac25578270cff1b9f61901ffff0150eaedb835021e4a108b7290636d62e9765cc6d700f39fd6e51aad88f6f4ce6ab8827279cfffb92266012791bca1f2de4661ed88a30c99a7a9449aa8417401ffff01eef1a9507b3d505f0062f2be9453981255b503c800f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-unwrap.json b/apps/web/test/swap/mock/137-unwrap.json index a8a9eea218..7836b76b09 100644 --- a/apps/web/test/swap/mock/137-unwrap.json +++ b/apps/web/test/swap/mock/137-unwrap.json @@ -42,6 +42,7 @@ "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "amountOutMin": "10000000000000000000", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "routeCode": "0x020d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0200f39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "routeCode": "0x020d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0200f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "txdata": "0x2646478b0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002e020d500b1d8e8ef31e21c99d1db9a6444d3adf127001ffff0200f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-usdc-to-native.json b/apps/web/test/swap/mock/137-usdc-to-native.json index 3aea2ba653..b611412977 100644 --- a/apps/web/test/swap/mock/137-usdc-to-native.json +++ b/apps/web/test/swap/mock/137-usdc-to-native.json @@ -59,6 +59,7 @@ "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "amountOutMin": "99004631711647666831", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "routeCode": "0x022791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff0121988C9CFD08db3b5793c2C6782271dC947492510046B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e010d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0200f39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "routeCode": "0x022791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff0121988C9CFD08db3b5793c2C6782271dC947492510046B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e010d500B1d8E8eF31E21C99d1Db9A6444d3ADf127001ffff0200f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "txdata": "0x2646478b0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000000000000000000000000000000000000005554a19000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000055df71bfe2322128f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000070022791bca1f2de4661ed88a30c99a7a9449aa8417401ffff0121988c9cfd08db3b5793c2c6782271dc947492510046b3fdf7b5cde91ac049936bf0bdb12c5d22202e010d500b1d8e8ef31e21c99d1db9a6444d3adf127001ffff0200f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-usdc-to-usdt.json b/apps/web/test/swap/mock/137-usdc-to-usdt.json index 511419e1b8..28484fec06 100644 --- a/apps/web/test/swap/mock/137-usdc-to-usdt.json +++ b/apps/web/test/swap/mock/137-usdc-to-usdt.json @@ -42,6 +42,7 @@ "tokenOut": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "amountOutMin": "88523769", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "routeCode": "0x022791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff018CFaab34f5159abf9C35587AC40d09a05dC9476501f39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "routeCode": "0x022791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff018CFaab34f5159abf9C35587AC40d09a05dC9476501f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "txdata": "0x2646478b0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000000000000000000000000000000000000054e0840000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f000000000000000000000000000000000000000000000000000000000546c3f9000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000042022791bca1f2de4661ed88a30c99a7a9449aa8417401ffff018cfaab34f5159abf9c35587ac40d09a05dc9476501f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-usdt-to-native.json b/apps/web/test/swap/mock/137-usdt-to-native.json index a2219cde52..3d27d7fe50 100644 --- a/apps/web/test/swap/mock/137-usdt-to-native.json +++ b/apps/web/test/swap/mock/137-usdt-to-native.json @@ -59,6 +59,7 @@ "tokenOut": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", "amountOutMin": "98866408236462846279", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "routeCode": "0x02c2132D05D31c914a87C6611C10748AEb04B58e8F01ffff018CFaab34f5159abf9C35587AC40d09a05dC947650046B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e012791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff0121988C9CFD08db3b5793c2C6782271dC9474925100f39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "routeCode": "0x02c2132D05D31c914a87C6611C10748AEb04B58e8F01ffff018CFaab34f5159abf9C35587AC40d09a05dC947650046B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e012791Bca1f2de4661ED88A30C99A7a9449Aa8417401ffff0121988C9CFD08db3b5793c2C6782271dC9474925100f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "txdata": "0x2646478b000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f00000000000000000000000000000000000000000000000000000000054e08400000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000055c0c0a79711f3147000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008402c2132d05d31c914a87c6611c10748aeb04b58e8f01ffff018cfaab34f5159abf9c35587ac40d09a05dc947650046b3fdf7b5cde91ac049936bf0bdb12c5d22202e012791bca1f2de4661ed88a30c99a7a9449aa8417401ffff0121988c9cfd08db3b5793c2c6782271dc9474925100f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000" } } diff --git a/apps/web/test/swap/mock/137-wrap.json b/apps/web/test/swap/mock/137-wrap.json index f777403610..f46a478672 100644 --- a/apps/web/test/swap/mock/137-wrap.json +++ b/apps/web/test/swap/mock/137-wrap.json @@ -43,6 +43,7 @@ "amountOutMin": "10000000000000000000", "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "routeCode": "0x0301ffff0201f39Fd6e51aad88F6F4ce6aB8827279cffFb922660d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", - "value": "10000000000000000000" + "value": "10000000000000000000", + "txdata": "0x2646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002e0301ffff0201f39fd6e51aad88f6f4ce6ab8827279cfffb922660d500b1d8e8ef31e21c99d1db9a6444d3adf1270000000000000000000000000000000000000" } } diff --git a/apps/web/test/swap/scripts/generate-swaps.ts b/apps/web/test/swap/scripts/generate-swaps.ts new file mode 100644 index 0000000000..7d035405a6 --- /dev/null +++ b/apps/web/test/swap/scripts/generate-swaps.ts @@ -0,0 +1,182 @@ +import fs from 'fs' +import { type UseTradeParams, tradeValidator02 } from '@sushiswap/react-query' +import { ChainId } from 'sushi' +import { isRouteProcessor4ChainId } from 'sushi/config' +import { Amount, Native, USDC, USDT, WBTC } from 'sushi/currency' +import { isSwapApiEnabledChainId } from '../../../src/config' + +const RECIPIENT = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + +type TradeParams = Omit< + UseTradeParams, + 'chainId' | 'carbonOffset' | 'enabled' | 'recipient' +> + +const chainIdArg = process.argv[2] +if (!chainIdArg) { + throw new Error( + `Chain ID is required, usage: 'pnpm generate-swaps '`, + ) +} + +const chainId = Number(chainIdArg) + +if (Number.isNaN(chainId)) { + throw new Error(`Chain ID must be a number, got ${chainIdArg}`) +} + +if (!isSwapApiEnabledChainId(chainId)) { + throw new Error(`Chain ID ${chainId} is not supported by the swap API`) +} + +if (!(chainId in USDC) || !(chainId in USDT) || !(chainId in WBTC)) { + throw new Error( + `Chain ID ${chainId} does not support one of the required tokens`, + ) +} + +const MOCK_DIRECTORY = 'test/swap/mock' + +// // To make sure we're in the right place +if (!fs.existsSync(MOCK_DIRECTORY)) { + throw new Error(`Directory ${MOCK_DIRECTORY} does not exist`) +} + +fs.rmSync(MOCK_DIRECTORY, { recursive: true }) +fs.mkdirSync(MOCK_DIRECTORY) + +// ! COPIED FROM packages/react-query/src/hooks/trade/useTrade.ts +const API_BASE_URL = + process.env['API_BASE_URL'] || + process.env['NEXT_PUBLIC_API_BASE_URL'] || + 'https://api.sushi.com' + +function getApiVersion(chainId: ChainId) { + if (isRouteProcessor4ChainId(chainId)) { + return '/v4' + } + return '' +} + +const getSwapApiResult = async ({ + fromToken, + toToken, + amount, + gasPrice = 50n, + slippagePercentage, + source, +}: TradeParams) => { + const params = new URL( + `${API_BASE_URL}/swap${getApiVersion(chainId)}/${chainId}`, + ) + + params.searchParams.set( + 'tokenIn', + `${ + fromToken?.isNative + ? '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' + : fromToken?.wrapped.address + }`, + ) + params.searchParams.set( + 'tokenOut', + `${ + toToken?.isNative + ? '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' + : toToken?.wrapped.address + }`, + ) + params.searchParams.set('amount', `${amount?.quotient.toString()}`) + params.searchParams.set('maxPriceImpact', `${+slippagePercentage / 100}`) + params.searchParams.set('gasPrice', `${gasPrice}`) + params.searchParams.set('to', RECIPIENT) + params.searchParams.set('preferSushi', 'true') + if (source !== undefined) params.searchParams.set('source', `${source}`) + + console.log(params.toString()) + + const res = await fetch(params.toString()) + const json = await res.json() + const resp = tradeValidator02.parse(json) + return resp +} +// ! + +// Assume 100MATIC for Polygon, 1PROBABLY_ETH for the rest +const nativeAmounts: Partial>> = { + [ChainId.POLYGON]: Amount.fromRawAmount( + Native.onChain(ChainId.POLYGON), + 1e20, + ), +} +const nativeAmount = + nativeAmounts[chainId] || Amount.fromRawAmount(Native.onChain(chainId), 1e18) + +const trades: Record = {} +trades[`${chainId}-native-to-usdc`] = { + fromToken: Native.onChain(chainId), + toToken: USDC[chainId as keyof typeof USDC], + amount: nativeAmount, + slippagePercentage: '0.5', +} + +trades[`${chainId}-native-to-usdt`] = { + fromToken: Native.onChain(chainId), + toToken: USDT[chainId as keyof typeof USDT], + amount: nativeAmount, + slippagePercentage: '0.5', +} + +trades[`${chainId}-native-to-wbtc`] = { + fromToken: Native.onChain(chainId), + toToken: WBTC[chainId as keyof typeof WBTC], + amount: nativeAmount, + slippagePercentage: '0.5', +} + +trades[`${chainId}-unwrap`] = { + fromToken: Native.onChain(chainId).wrapped, + toToken: Native.onChain(chainId), + amount: nativeAmount, + slippagePercentage: '0.5', +} + +trades[`${chainId}-usdc-to-native`] = { + fromToken: USDC[chainId as keyof typeof USDC], + toToken: Native.onChain(chainId), + amount: Amount.fromRawAmount(USDC[chainId as keyof typeof USDC], 1e6), + slippagePercentage: '0.5', +} + +trades[`${chainId}-usdc-to-usdt`] = { + fromToken: USDC[chainId as keyof typeof USDC], + toToken: USDT[chainId as keyof typeof USDT], + amount: Amount.fromRawAmount(USDC[chainId as keyof typeof USDC], 1e6), + slippagePercentage: '0.5', +} + +trades[`${chainId}-usdt-to-native`] = { + fromToken: USDT[chainId as keyof typeof USDT], + toToken: Native.onChain(chainId), + amount: Amount.fromRawAmount(USDT[chainId as keyof typeof USDT], 1e6), + slippagePercentage: '0.5', +} + +trades[`${chainId}-wrap`] = { + fromToken: Native.onChain(chainId), + toToken: Native.onChain(chainId).wrapped, + amount: nativeAmount, + slippagePercentage: '0.5', +} + +const main = async () => { + for (const [name, trade] of Object.entries(trades)) { + const result = await getSwapApiResult(trade) + fs.writeFileSync( + `${MOCK_DIRECTORY}/${name}.json`, + JSON.stringify(result, null, 2), + ) + } +} + +main().then(() => process.exit(0)) diff --git a/packages/client/src/pure/tokens/chainId/address.ts b/packages/client/src/pure/tokens/chainId/address.ts index 700fc50267..8626e3cb20 100644 --- a/packages/client/src/pure/tokens/chainId/address.ts +++ b/packages/client/src/pure/tokens/chainId/address.ts @@ -3,7 +3,7 @@ import { TokenApiSchema } from '@sushiswap/tokens-api/lib/schemas/chainId/addres import type { ChainId } from 'sushi/chain' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { TokenApiSchema } export type Token = Awaited> diff --git a/packages/client/src/pure/tokens/chainId/addresses.ts b/packages/client/src/pure/tokens/chainId/addresses.ts index f6d61b7e72..deaca21f5e 100644 --- a/packages/client/src/pure/tokens/chainId/addresses.ts +++ b/packages/client/src/pure/tokens/chainId/addresses.ts @@ -1,8 +1,8 @@ -import { getTokenAddressesByChainId } from '@sushiswap/tokens-api/lib/api' +import type { getTokenAddressesByChainId } from '@sushiswap/tokens-api/lib/api' import { TokenAddressesApiSchema } from '@sushiswap/tokens-api/lib/schemas/chainId/addresses' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { TokenAddressesApiSchema } export type TokenAddress = Awaited< diff --git a/packages/client/src/pure/tokens/chainId/common.ts b/packages/client/src/pure/tokens/chainId/common.ts index 324b1c6156..b05e824961 100644 --- a/packages/client/src/pure/tokens/chainId/common.ts +++ b/packages/client/src/pure/tokens/chainId/common.ts @@ -2,7 +2,7 @@ import type { getCommonTokens as _getCommonTokens } from '@sushiswap/tokens-api/ import { CommonTokensApiSchema } from '@sushiswap/tokens-api/lib/schemas/chainId/common' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { CommonTokensApiSchema } export type CommonToken = Awaited> diff --git a/packages/client/src/pure/tokens/chainId/ids.ts b/packages/client/src/pure/tokens/chainId/ids.ts index ef0cbed415..6c48cb9b46 100644 --- a/packages/client/src/pure/tokens/chainId/ids.ts +++ b/packages/client/src/pure/tokens/chainId/ids.ts @@ -1,8 +1,8 @@ -import { getTokenIdsByChainId } from '@sushiswap/tokens-api/lib/api' +import type { getTokenIdsByChainId } from '@sushiswap/tokens-api/lib/api' import { TokenIdsApiSchema } from '@sushiswap/tokens-api/lib/schemas/chainId/ids' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { TokenIdsApiSchema } export type TokenId = Awaited> diff --git a/packages/client/src/pure/tokens/chainId/popular.ts b/packages/client/src/pure/tokens/chainId/popular.ts index c567dbb47d..eb6bd33124 100644 --- a/packages/client/src/pure/tokens/chainId/popular.ts +++ b/packages/client/src/pure/tokens/chainId/popular.ts @@ -2,7 +2,7 @@ import type { getPopularTokens as _getPopularTokens } from '@sushiswap/tokens-ap import { PopularTokensApiSchema } from '@sushiswap/tokens-api/lib/schemas/chainId/popular' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { PopularTokensApiSchema } export type PopularToken = Awaited> diff --git a/packages/client/src/pure/tokens/index.ts b/packages/client/src/pure/tokens/index.ts index 0a804db25c..38f506a55e 100644 --- a/packages/client/src/pure/tokens/index.ts +++ b/packages/client/src/pure/tokens/index.ts @@ -2,7 +2,7 @@ import type { getTokens as _getTokens } from '@sushiswap/tokens-api/lib/api' import { TokensApiSchema } from '@sushiswap/tokens-api/lib/schemas/index' import { TOKENS_API } from '../../constants.js' -import { type GetApiInputFromOutput } from '../../types.js' +import type { GetApiInputFromOutput } from '../../types.js' export { TokensApiSchema } export type Token = Awaited> diff --git a/packages/client/src/pure/tokens/search/address.ts b/packages/client/src/pure/tokens/search/address.ts index 7600ca9177..f4e30db046 100644 --- a/packages/client/src/pure/tokens/search/address.ts +++ b/packages/client/src/pure/tokens/search/address.ts @@ -1,8 +1,8 @@ -import { getTokensByAddress } from '@sushiswap/tokens-api/lib/api' +import type { getTokensByAddress } from '@sushiswap/tokens-api/lib/api' import { SearchTokenApiSchema } from '@sushiswap/tokens-api/lib/schemas/search/address' import { TOKENS_API } from '../../../constants.js' -import { type GetApiInputFromOutput } from '../../../types.js' +import type { GetApiInputFromOutput } from '../../../types.js' export { SearchTokenApiSchema } export type TokenSearch = Awaited> diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 6edf3b6c73..b156ca9e54 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -10,9 +10,22 @@ ], "license": "MIT", "author": "Matthew Lilley ", - "main": "./dist/index.js", - "source": "./src/index.ts", - "types": "./dist/index.d.ts", + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ] + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ] + } + }, "files": [ "dist/**" ], @@ -33,7 +46,7 @@ }, "devDependencies": { "@sushiswap/jest-config": "workspace:*", - "@tsconfig/esm": "1.0.4", + "@tsconfig/node20": "20.1.4", "@tsconfig/strictest": "2.0.2", "@types/jest": "29.5.5", "@types/react": "18.2.14", diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json index 05d620d80e..cda8b2bf4a 100644 --- a/packages/hooks/tsconfig.json +++ b/packages/hooks/tsconfig.json @@ -1,7 +1,7 @@ { "extends": [ // "@tsconfig/strictest/tsconfig", - "@tsconfig/esm/tsconfig" + "@tsconfig/node20/tsconfig" ], "include": [ "src" diff --git a/packages/react-query/src/hooks/trade/apiAdapter.ts b/packages/react-query/src/hooks/trade/apiAdapter.ts index 3e500f2cf8..7d055ccdb1 100644 --- a/packages/react-query/src/hooks/trade/apiAdapter.ts +++ b/packages/react-query/src/hooks/trade/apiAdapter.ts @@ -145,6 +145,7 @@ export function apiAdapter02To01( tokenOut: res.routeProcessorArgs.tokenOut, routeCode: res.routeProcessorArgs.routeCode, }, + txdata: res.routeProcessorArgs.txdata, } else return { route } } diff --git a/packages/react-query/src/hooks/trade/types.ts b/packages/react-query/src/hooks/trade/types.ts index 23ed42bafb..d8e3bcac0e 100644 --- a/packages/react-query/src/hooks/trade/types.ts +++ b/packages/react-query/src/hooks/trade/types.ts @@ -44,6 +44,7 @@ export interface UseTradeReturn { route: TradeType['route'] value?: bigint | undefined tokenTax: Percent | false | undefined + txdata: string | undefined } export type UseTradeQuerySelect = (data: TradeType) => UseTradeReturn diff --git a/packages/react-query/src/hooks/trade/useTrade.ts b/packages/react-query/src/hooks/trade/useTrade.ts index 44eaeaf18a..ae5b5bb762 100644 --- a/packages/react-query/src/hooks/trade/useTrade.ts +++ b/packages/react-query/src/hooks/trade/useTrade.ts @@ -23,7 +23,7 @@ import { tradeValidator02 } from './validator02' export const TRADE_API_BASE_URL = process.env['API_BASE_URL'] || process.env['NEXT_PUBLIC_API_BASE_URL'] || - 'https://staging.sushi.com/swap' + 'https://api.sushi.com/swap' export function getTradeQueryApiVersion(chainId: ChainId) { if (isRouteProcessor4ChainId(chainId)) { @@ -153,21 +153,23 @@ export const useTrade = (variables: UseTradeParams) => { tokenTax ? new Percent(1).subtract(tokenTax) : 1, ).quotient, ) - const minAmountOut = Amount.fromRawAmount( - toToken, - slippageAmount( - amountOut, - new Percent(Math.floor(+slippagePercentage * 100), 10_000), - )[0], - ) + const minAmountOut = data.args?.amountOutMin + ? Amount.fromRawAmount(toToken, data.args.amountOutMin) + : Amount.fromRawAmount( + toToken, + slippageAmount( + Amount.fromRawAmount(toToken, data.route.amountOutBI), + new Percent(Math.floor(+slippagePercentage * 100), 10_000), + )[0], + ) const isOffset = chainId === ChainId.POLYGON && carbonOffset let writeArgs: UseTradeReturnWriteArgs = data?.args ? ([ data.args.tokenIn as Address, - BigInt(data.args.amountIn), + data.args.amountIn, data.args.tokenOut as Address, - minAmountOut.quotient, + data.args.amountOutMin, data.args.to as Address, data.args.routeCode as Hex, ] as const) @@ -217,6 +219,7 @@ export const useTrade = (variables: UseTradeParams) => { writeArgs, value, tokenTax, + txdata: data.txdata, } } @@ -233,6 +236,7 @@ export const useTrade = (variables: UseTradeParams) => { functionName: 'processRoute', value: undefined, tokenTax: undefined, + txdata: undefined, } }, [ diff --git a/packages/react-query/src/hooks/trade/validator01.ts b/packages/react-query/src/hooks/trade/validator01.ts index 3ef5fc5f7f..c6fee0673b 100644 --- a/packages/react-query/src/hooks/trade/validator01.ts +++ b/packages/react-query/src/hooks/trade/validator01.ts @@ -53,4 +53,5 @@ export const tradeValidator01 = z.object({ routeCode: z.string(), }), ), + txdata: z.optional(z.string()), }) diff --git a/packages/react-query/src/hooks/trade/validator02.ts b/packages/react-query/src/hooks/trade/validator02.ts index ec5b585a36..2e937ef3de 100644 --- a/packages/react-query/src/hooks/trade/validator02.ts +++ b/packages/react-query/src/hooks/trade/validator02.ts @@ -46,6 +46,7 @@ const routeExistValidator = z.object({ to: z.string(), routeCode: z.string(), value: z.string().optional(), + txdata: z.string(), }) .optional(), }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 295f846401..75ff580661 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -831,6 +831,9 @@ importers: tailwindcss: specifier: 3.3.2 version: 3.3.2(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) + tsx: + specifier: ^4.16.5 + version: 4.16.5 typescript: specifier: 5.4.5 version: 5.4.5 @@ -1325,9 +1328,9 @@ importers: '@sushiswap/jest-config': specifier: workspace:* version: link:../../config/jest - '@tsconfig/esm': - specifier: 1.0.4 - version: 1.0.4 + '@tsconfig/node20': + specifier: 20.1.4 + version: 20.1.4 '@tsconfig/strictest': specifier: 2.0.2 version: 2.0.2 @@ -4094,6 +4097,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -4112,6 +4121,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -4130,6 +4145,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -4148,6 +4169,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -4166,6 +4193,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -4184,6 +4217,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -4202,6 +4241,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -4220,6 +4265,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -4238,6 +4289,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -4256,6 +4313,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -4274,6 +4337,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -4292,6 +4361,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -4310,6 +4385,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -4328,6 +4409,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -4346,6 +4433,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -4364,6 +4457,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -4382,6 +4481,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4400,6 +4505,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -4418,6 +4529,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -4436,6 +4553,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -4454,6 +4577,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -4472,6 +4601,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4490,6 +4625,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -12884,6 +13025,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -14043,6 +14189,9 @@ packages: get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + get-uri@6.0.1: resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} engines: {node: '>= 14'} @@ -21130,6 +21279,11 @@ packages: peerDependencies: typescript: 5.4.5 + tsx@4.16.5: + resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} + engines: {node: '>=18.0.0'} + hasBin: true + tsx@4.7.1: resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} engines: {node: '>=18.0.0'} @@ -25913,6 +26067,9 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true @@ -25922,6 +26079,9 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm@0.17.19': optional: true @@ -25931,6 +26091,9 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-x64@0.17.19': optional: true @@ -25940,6 +26103,9 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true @@ -25949,6 +26115,9 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true @@ -25958,6 +26127,9 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true @@ -25967,6 +26139,9 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true @@ -25976,6 +26151,9 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true @@ -25985,6 +26163,9 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true @@ -25994,6 +26175,9 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true @@ -26003,6 +26187,9 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true @@ -26012,6 +26199,9 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true @@ -26021,6 +26211,9 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true @@ -26030,6 +26223,9 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true @@ -26039,6 +26235,9 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true @@ -26048,6 +26247,9 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true @@ -26057,6 +26259,9 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true @@ -26066,6 +26271,9 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true @@ -26075,6 +26283,9 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true @@ -26084,6 +26295,9 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true @@ -26093,6 +26307,9 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true @@ -26102,6 +26319,9 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true @@ -26111,6 +26331,9 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.43.0)': dependencies: eslint: 8.43.0 @@ -38983,6 +39206,32 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + escalade@3.1.1: {} escalade@3.1.2: {} @@ -40882,6 +41131,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.1: dependencies: basic-ftp: 5.0.3 @@ -46189,7 +46442,7 @@ snapshots: postcss-load-config@4.0.1(postcss@8.4.23)(ts-node@10.9.2(@types/node@20.10.0)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 - yaml: 2.3.1 + yaml: 2.4.1 optionalDependencies: postcss: 8.4.23 ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@20.10.0)(typescript@5.4.5) @@ -46197,7 +46450,7 @@ snapshots: postcss-load-config@4.0.1(postcss@8.4.23)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 - yaml: 2.3.1 + yaml: 2.4.1 optionalDependencies: postcss: 8.4.23 ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) @@ -46205,7 +46458,7 @@ snapshots: postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@20.10.0)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 - yaml: 2.3.1 + yaml: 2.4.1 optionalDependencies: postcss: 8.4.31 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@20.10.0)(typescript@5.4.5) @@ -46213,7 +46466,7 @@ snapshots: postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@20.10.0)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 - yaml: 2.3.1 + yaml: 2.4.1 optionalDependencies: postcss: 8.4.31 ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@20.10.0)(typescript@5.4.5) @@ -49594,7 +49847,7 @@ snapshots: fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.19.1 + jiti: 1.21.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -49607,7 +49860,7 @@ snapshots: postcss-nested: 6.0.1(postcss@8.4.23) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - resolve: 1.22.4 + resolve: 1.22.8 sucrase: 3.34.0 transitivePeerDependencies: - ts-node @@ -49622,7 +49875,7 @@ snapshots: fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.19.1 + jiti: 1.21.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -49635,7 +49888,7 @@ snapshots: postcss-nested: 6.0.1(postcss@8.4.23) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - resolve: 1.22.4 + resolve: 1.22.8 sucrase: 3.34.0 transitivePeerDependencies: - ts-node @@ -50264,6 +50517,13 @@ snapshots: tslib: 1.14.1 typescript: 5.4.5 + tsx@4.16.5: + dependencies: + esbuild: 0.21.5 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + tsx@4.7.1: dependencies: esbuild: 0.19.12