diff --git a/api/_cache.ts b/api/_cache.ts index 2380cbc62..d637dc667 100644 --- a/api/_cache.ts +++ b/api/_cache.ts @@ -61,6 +61,13 @@ export class RedisCache implements interfaces.CachingMechanismInterface { throw error; } } + + async del(key: string) { + if (!this.client) { + return; + } + await this.client.del(key); + } } export const redisCache = new RedisCache(); diff --git a/api/_spoke-pool-periphery.ts b/api/_spoke-pool-periphery.ts index 58928c5eb..38c7605ba 100644 --- a/api/_spoke-pool-periphery.ts +++ b/api/_spoke-pool-periphery.ts @@ -222,3 +222,41 @@ export async function getSwapAndDepositTypedData(params: { }, }; } + +export function encodeDepositWithPermitCalldata(args: { + signatureOwner: string; + depositData: SpokePoolV3PeripheryInterface.DepositDataStruct; + deadline: number; + permitSignature: string; + depositDataSignature: string; +}) { + return SpokePoolV3Periphery__factory.createInterface().encodeFunctionData( + "depositWithPermit", + [ + args.signatureOwner, + args.depositData, + args.deadline, + args.permitSignature, + args.depositDataSignature, + ] + ); +} + +export function encodeSwapAndBridgeWithPermitCalldata(args: { + signatureOwner: string; + swapAndDepositData: SpokePoolV3PeripheryInterface.SwapAndDepositDataStruct; + deadline: number; + permitSignature: string; + swapAndDepositDataSignature: string; +}) { + return SpokePoolV3Periphery__factory.createInterface().encodeFunctionData( + "swapAndBridgeWithPermit", + [ + args.signatureOwner, + args.swapAndDepositData, + args.deadline, + args.permitSignature, + args.swapAndDepositDataSignature, + ] + ); +} diff --git a/api/_utils.ts b/api/_utils.ts index c271413f6..238c8687f 100644 --- a/api/_utils.ts +++ b/api/_utils.ts @@ -201,8 +201,8 @@ export const getLogger = (): LoggingUtility => { * Resolves the current vercel endpoint dynamically * @returns A valid URL of the current endpoint in vercel */ -export const resolveVercelEndpoint = () => { - if (process.env.REACT_APP_VERCEL_API_BASE_URL_OVERRIDE) { +export const resolveVercelEndpoint = (omitOverride = false) => { + if (!omitOverride && process.env.REACT_APP_VERCEL_API_BASE_URL_OVERRIDE) { return process.env.REACT_APP_VERCEL_API_BASE_URL_OVERRIDE; } const url = process.env.VERCEL_URL ?? "across.to"; diff --git a/api/relay/_queue.ts b/api/relay/_queue.ts new file mode 100644 index 000000000..aac70b346 --- /dev/null +++ b/api/relay/_queue.ts @@ -0,0 +1,46 @@ +import { Client } from "@upstash/qstash"; + +import { RelayRequest, RelayStrategy, RelayStrategyName } from "./_types"; +import { resolveVercelEndpoint } from "../_utils"; + +const client = new Client({ + token: process.env.QSTASH_TOKEN!, +}); + +export async function pushRelayRequestToQueue({ + request, + strategy, +}: { + request: RelayRequest; + strategy: RelayStrategy; +}) { + const strategyName = strategy.strategyName; + const queue = getRelayRequestQueue(strategyName, request.chainId); + await queue.upsert({ + parallelism: strategy.queueParallelism, + }); + + const baseUrl = resolveVercelEndpoint(true); + const response = await queue.enqueueJSON({ + retries: 3, + contentBasedDeduplication: true, + headers: new Headers({ + "Retry-After": "1", + }), + url: `${baseUrl}/api/relay/jobs/process`, + body: { + request, + strategyName, + }, + }); + return response; +} + +function getRelayRequestQueue( + strategyName: RelayStrategyName, + chainId: number +) { + return client.queue({ + queueName: `relay-request-queue-${chainId}-${strategyName}`, + }); +} diff --git a/api/relay/_strategies/gelato.ts b/api/relay/_strategies/gelato.ts new file mode 100644 index 000000000..bbeca011f --- /dev/null +++ b/api/relay/_strategies/gelato.ts @@ -0,0 +1,92 @@ +import axios from "axios"; +import { RelayRequest, RelayStrategy } from "../_types"; +import { encodeCalldataForRelayRequest } from "../_utils"; + +const GELATO_API_KEY = process.env.GELATO_API_KEY; + +export function getGelatoStrategy(): RelayStrategy { + return { + strategyName: "gelato", + queueParallelism: 2, + relay: async (request: RelayRequest) => { + const encodedCalldata = encodeCalldataForRelayRequest(request); + + const taskId = await relayWithGelatoApi({ + chainId: request.chainId, + target: request.to, + data: encodedCalldata, + }); + + let txHash: string | undefined; + + while (true) { + const taskStatus = await getGelatoTaskStatus(taskId); + + if ( + ["Cancelled", "NotFound", "ExecReverted", "Blacklisted"].includes( + taskStatus.taskState + ) + ) { + throw new Error( + `Can not relay request via Gelato due to task state ${taskStatus.taskState}` + ); + } + + if (taskStatus.transactionHash) { + txHash = taskStatus.transactionHash; + break; + } + + await new Promise((resolve) => setTimeout(resolve, 1_000)); + } + + return txHash; + }, + }; +} + +const gelatoBaseUrl = "https://api.gelato.digital"; + +async function relayWithGelatoApi({ + chainId, + target, + data, +}: { + chainId: number; + target: string; + data: string; +}) { + if (!GELATO_API_KEY) { + throw new Error("Can not call Gelato API: key is not set"); + } + + const response = await axios.post( + `${gelatoBaseUrl}/relays/v2/sponsored-call`, + { + chainId, + target, + data, + sponsorApiKey: GELATO_API_KEY, + } + ); + + return response.data.taskId as string; +} + +async function getGelatoTaskStatus(taskId: string) { + const response = await axios.get<{ + task: { + taskState: + | "CheckPending" + | "ExecPending" + | "ExecSuccess" + | "ExecReverted" + | "WaitingForConfirmation" + | "Blacklisted" + | "Cancelled" + | "NotFound"; + transactionHash?: string; + }; + }>(`${gelatoBaseUrl}/tasks/status/${taskId}`); + return response.data.task; +} diff --git a/api/relay/_strategies/index.ts b/api/relay/_strategies/index.ts new file mode 100644 index 000000000..9b621c0eb --- /dev/null +++ b/api/relay/_strategies/index.ts @@ -0,0 +1,11 @@ +import { RelayStrategy, RelayStrategyName } from "../_types"; +import { getGelatoStrategy } from "./gelato"; +import { getLocalSignersStrategy } from "./local-signers"; + +const gelatoStrategy = getGelatoStrategy(); +const localSignersStrategy = getLocalSignersStrategy(); + +export const strategiesByName = { + [gelatoStrategy.strategyName]: gelatoStrategy, + [localSignersStrategy.strategyName]: localSignersStrategy, +} as Record; diff --git a/api/relay/_strategies/local-signers.ts b/api/relay/_strategies/local-signers.ts new file mode 100644 index 000000000..d895f1b82 --- /dev/null +++ b/api/relay/_strategies/local-signers.ts @@ -0,0 +1,92 @@ +import { Wallet, utils } from "ethers"; + +import { RelayRequest, RelayStrategy } from "../_types"; +import { encodeCalldataForRelayRequest } from "../_utils"; +import { redisCache } from "../../_cache"; +import { getProvider } from "../../_utils"; + +const localSignerPrivateKeys = + process.env.LOCAL_SIGNER_PRIVATE_KEYS!.split(","); +const balanceAlertThreshold = utils.parseEther("0.000001"); // TODO: Refine value + +export function getLocalSignersStrategy(): RelayStrategy { + return { + strategyName: "local-signers", + queueParallelism: 1, // TODO: Should be dynamic based on the number of local signers + relay: async (request: RelayRequest) => { + const encodedCalldata = encodeCalldataForRelayRequest(request); + + if (localSignerPrivateKeys.length === 0) { + throw new Error( + "Can not relay tx via local signers: No local signers found" + ); + } + + for (const signerPrivateKey of localSignerPrivateKeys) { + const provider = getProvider(request.chainId); + const wallet = new Wallet(signerPrivateKey, provider); + try { + await lockSigner(wallet.address, request.chainId); + + const balance = await wallet.getBalance(); + if (balance.lt(balanceAlertThreshold)) { + // TODO: Send PD alert + } + + const txRequest = { + chainId: request.chainId, + to: request.to, + data: encodedCalldata, + from: wallet.address, + }; + const tx = await wallet.sendTransaction(txRequest); + const receipt = await tx.wait(); + return receipt.transactionHash; + } catch (error) { + if (error instanceof SignerLockedError) { + continue; + } + throw error; + } finally { + await unlockSigner(wallet.address, request.chainId); + } + } + + throw new Error( + "Can not relay tx via local signers: All local signers are locked" + ); + }, + }; +} + +async function lockSigner(signerAddress: string, chainId: number) { + const lockKey = getLockKey(signerAddress, chainId); + const lockValue = await redisCache.get(lockKey); + + if (lockValue) { + throw new SignerLockedError(signerAddress, chainId); + } + + await redisCache.set(lockKey, "true", 30); +} + +async function unlockSigner(signerAddress: string, chainId: number) { + const lockKey = getLockKey(signerAddress, chainId); + + const lockValue = await redisCache.get(lockKey); + if (!lockValue) { + return; + } + + await redisCache.del(lockKey); +} + +function getLockKey(signerAddress: string, chainId: number) { + return `signer-lock:${signerAddress}:${chainId}`; +} + +class SignerLockedError extends Error { + constructor(signerAddress: string, chainId: number) { + super(`Signer ${signerAddress} on chain ${chainId} is already locked`); + } +} diff --git a/api/relay/_types.ts b/api/relay/_types.ts new file mode 100644 index 000000000..839934d49 --- /dev/null +++ b/api/relay/_types.ts @@ -0,0 +1,19 @@ +import { validateMethodArgs } from "./_utils"; + +export type RelayStrategyName = "gelato" | "local-signers"; + +export type RelayRequest = { + chainId: number; + to: string; + methodNameAndArgs: ReturnType; + signatures: { + permit: string; + deposit: string; + }; +}; + +export type RelayStrategy = { + strategyName: RelayStrategyName; + queueParallelism: number; + relay: (request: RelayRequest) => Promise; +}; diff --git a/api/relay/_utils.ts b/api/relay/_utils.ts index f46783d63..82e41ab49 100644 --- a/api/relay/_utils.ts +++ b/api/relay/_utils.ts @@ -5,11 +5,17 @@ import { hexString, positiveIntStr, validAddress } from "../_utils"; import { getPermitTypedData } from "../_permit"; import { InvalidParamError } from "../_errors"; import { + encodeDepositWithPermitCalldata, + encodeSwapAndBridgeWithPermitCalldata, getDepositTypedData, getSwapAndDepositTypedData, } from "../_spoke-pool-periphery"; +import { RelayRequest } from "./_types"; +import { redisCache } from "../_cache"; -export const GAS_SPONSOR_ADDRESS = "0x0000000000000000000000000000000000000000"; +export const GAS_SPONSOR_ADDRESS = + process.env.GAS_SPONSOR_ADDRESS ?? + "0x0000000000000000000000000000000000000000"; const SubmissionFeesSchema = type({ amount: positiveIntStr(), @@ -79,21 +85,12 @@ export function validateMethodArgs(methodName: string, args: any) { throw new Error(`Invalid method name: ${methodName}`); } -export async function verifySignatures(params: { - methodNameAndArgs: ReturnType; - signatures: { - permit: string; - deposit: string; - }; - originChainId: number; - entryPointContractAddress: string; -}) { - const { - methodNameAndArgs, - signatures, - originChainId, - entryPointContractAddress, - } = params; +export async function verifySignatures({ + methodNameAndArgs, + signatures, + chainId, + to, +}: RelayRequest) { const { methodName, args } = methodNameAndArgs; let signatureOwner: string; @@ -107,14 +104,14 @@ export async function verifySignatures(params: { signatureOwner = _signatureOwner; getPermitTypedDataPromise = getPermitTypedData({ tokenAddress: depositData.baseDepositData.inputToken, - chainId: originChainId, + chainId, ownerAddress: signatureOwner, - spenderAddress: entryPointContractAddress, + spenderAddress: to, // SpokePoolV3Periphery address value: depositData.inputAmount, deadline: Number(deadline), }); getDepositTypedDataPromise = getDepositTypedData({ - chainId: originChainId, + chainId, depositData, }); } else if (methodName === "swapAndBridgeWithPermit") { @@ -126,14 +123,14 @@ export async function verifySignatures(params: { signatureOwner = _signatureOwner; getPermitTypedDataPromise = getPermitTypedData({ tokenAddress: swapAndDepositData.swapToken, - chainId: originChainId, + chainId, ownerAddress: signatureOwner, - spenderAddress: entryPointContractAddress, + spenderAddress: to, // SpokePoolV3Periphery address value: swapAndDepositData.swapTokenAmount, deadline: Number(deadline), }); getDepositTypedDataPromise = getSwapAndDepositTypedData({ - chainId: originChainId, + chainId, swapAndDepositData, }); } else { @@ -173,3 +170,153 @@ export async function verifySignatures(params: { }); } } + +export function encodeCalldataForRelayRequest(request: RelayRequest) { + let encodedCalldata: string; + + if (request.methodNameAndArgs.methodName === "depositWithPermit") { + encodedCalldata = encodeDepositWithPermitCalldata({ + ...request.methodNameAndArgs.args, + deadline: Number(request.methodNameAndArgs.args.deadline), + depositDataSignature: request.signatures.deposit, + permitSignature: request.signatures.permit, + }); + } else if ( + request.methodNameAndArgs.methodName === "swapAndBridgeWithPermit" + ) { + encodedCalldata = encodeSwapAndBridgeWithPermitCalldata({ + ...request.methodNameAndArgs.args, + deadline: Number(request.methodNameAndArgs.args.deadline), + swapAndDepositDataSignature: request.signatures.deposit, + permitSignature: request.signatures.permit, + }); + } + // TODO: Add cases for `withAuth` and `withPermit2` + else { + throw new Error(`Can not encode calldata for relay request`); + } + + return encodedCalldata; +} + +export function getRelayRequestHash(request: RelayRequest) { + return utils.keccak256( + utils.defaultAbiCoder.encode( + ["bytes", "bytes"], + [request.signatures.permit, request.signatures.deposit] + ) + ); +} + +type CachedRelayRequest = + | { + status: "pending"; + request: RelayRequest; + messageId: string; + } + | { + status: "success"; + request: RelayRequest; + txHash: string; + messageId: string; + } + | { + status: "failure"; + request: RelayRequest; + error: Error; + messageId: string; + } + | { + status: "unknown"; + }; +// TODO: Refine value +const cachedRelayRequestTTL = 5 * 60 * 60 * 24; // 5 days + +export async function getCachedRelayRequest( + requestOrHash: RelayRequest | string +): Promise { + const cachedRelayRequest = await redisCache.get( + getRelayRequestCacheKey(requestOrHash) + ); + + if (!cachedRelayRequest) { + return { + status: "unknown", + }; + } + + return cachedRelayRequest; +} + +export async function setCachedRelayRequestPending(params: { + messageId: string; + request: RelayRequest; +}) { + await redisCache.set( + getRelayRequestCacheKey(params.request), + { + status: "pending", + messageId: params.messageId, + request: params.request, + }, + cachedRelayRequestTTL + ); +} + +export async function setCachedRelayRequestFailure(params: { + request: RelayRequest; + error: Error; +}) { + const cachedRelayRequest = await getCachedRelayRequest(params.request); + + if (!cachedRelayRequest || cachedRelayRequest.status === "unknown") { + throw new Error("Request not found in cache"); + } + + if (cachedRelayRequest.status === "success") { + throw new Error( + "Can not set 'failure' status for request that is already successful" + ); + } + + await redisCache.set( + getRelayRequestCacheKey(params.request), + { + status: "failure", + messageId: cachedRelayRequest.messageId, + request: cachedRelayRequest.request, + error: params.error, + }, + cachedRelayRequestTTL + ); +} + +export async function setCachedRelayRequestSuccess(params: { + request: RelayRequest; + txHash: string; +}) { + const cachedRelayRequest = await getCachedRelayRequest(params.request); + + if (!cachedRelayRequest || cachedRelayRequest.status === "unknown") { + throw new Error("Request not found in cache"); + } + + await redisCache.set( + getRelayRequestCacheKey(params.request), + { + status: "success", + messageId: cachedRelayRequest.messageId, + request: cachedRelayRequest.request, + txHash: params.txHash, + }, + cachedRelayRequestTTL + ); +} + +function getRelayRequestCacheKey(requestOrHash: RelayRequest | string) { + const requestHash = + typeof requestOrHash === "string" + ? requestOrHash + : getRelayRequestHash(requestOrHash); + return `relay-request:${requestHash}`; +} diff --git a/api/relay/index.ts b/api/relay/index.ts index 1716a2acc..1bd44d14f 100644 --- a/api/relay/index.ts +++ b/api/relay/index.ts @@ -5,11 +5,17 @@ import { handleErrorCondition } from "../_errors"; import { getLogger, hexString, validAddress } from "../_utils"; import { allowedMethodNames, + getRelayRequestHash, + setCachedRelayRequestPending, validateMethodArgs, verifySignatures, } from "./_utils"; +import { strategiesByName } from "./_strategies"; +import { CHAIN_IDs } from "../_constants"; +import { pushRelayRequestToQueue } from "./_queue"; +import { RelayRequest } from "./_types"; -const BaseRelayRequestBodySchema = object({ +export const BaseRelayRequestBodySchema = object({ chainId: number(), to: validAddress(), methodName: enums(allowedMethodNames), @@ -20,6 +26,11 @@ const BaseRelayRequestBodySchema = object({ }), }); +const strategies = { + default: strategiesByName.gelato, + [CHAIN_IDs.ARBITRUM]: strategiesByName["local-signers"], +}; + export default async function handler( request: VercelRequest, response: VercelResponse @@ -45,19 +56,35 @@ export default async function handler( ); // Verify signatures - const { signatures } = request.body; + const { signatures, chainId, to } = request.body; await verifySignatures({ methodNameAndArgs, signatures, - originChainId: request.body.chainId, - entryPointContractAddress: request.body.to, + chainId, + to, + }); + + // Push request to queue + const strategy = strategies[chainId] ?? strategies.default; + const relayRequest: RelayRequest = { + chainId, + to, + methodNameAndArgs, + signatures, + }; + const queueResponse = await pushRelayRequestToQueue({ + request: relayRequest, + strategy, }); - // TODO: Execute transaction based on configured strategies + // Store requestId in database + await setCachedRelayRequestPending({ + messageId: queueResponse.messageId, + request: relayRequest, + }); - return response.status(200).json({ - success: true, - // Add relevant response data + response.status(200).json({ + requestHash: getRelayRequestHash(relayRequest), }); } catch (error) { return handleErrorCondition("api/relay", response, logger, error); diff --git a/api/relay/jobs/process.ts b/api/relay/jobs/process.ts new file mode 100644 index 000000000..0d3973bf8 --- /dev/null +++ b/api/relay/jobs/process.ts @@ -0,0 +1,127 @@ +import { VercelRequest, VercelResponse } from "@vercel/node"; +import { assert, enums, number, object, type } from "superstruct"; +import { Receiver } from "@upstash/qstash"; + +import { handleErrorCondition, InvalidParamError } from "../../_errors"; +import { getLogger, hexString, validAddress } from "../../_utils"; +import { + validateMethodArgs, + verifySignatures, + setCachedRelayRequestSuccess, + setCachedRelayRequestFailure, + getCachedRelayRequest, + allowedMethodNames, +} from "../_utils"; +import { RelayRequest, RelayStrategyName } from "../_types"; +import { strategiesByName } from "../_strategies"; + +const messageReceiver = new Receiver({ + currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY!, + nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY!, +}); + +const RelayProcessJobBodySchema = type({ + strategyName: enums(Object.keys(strategiesByName)), + request: type({ + chainId: number(), + to: validAddress(), + methodNameAndArgs: type({ + methodName: enums(allowedMethodNames), + args: object(), + }), + signatures: object({ + permit: hexString(), + deposit: hexString(), + }), + }), +}); + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const logger = getLogger(); + logger.debug({ + at: "Relay/jobs/process", + message: "Request body", + body: req.body, + }); + + try { + if (req.method !== "POST") { + return res.status(405).json({ error: "Method not allowed" }); + } + + // Verify message comes from QSTASH + const isValid = await messageReceiver.verify({ + signature: (req.headers["upstash-signature"] || + req.headers["Upstash-Signature"]) as string, + body: JSON.stringify(req.body), + }); + + if (!isValid) { + return res.status(401).json({ error: "Unauthorized" }); + } + + assert(req.body, RelayProcessJobBodySchema); + const { request, strategyName } = req.body; + + // Validate method-specific request body + const methodNameAndArgs = validateMethodArgs( + request.methodNameAndArgs.methodName, + request.methodNameAndArgs.args + ); + + // Verify user signatures + const { signatures, chainId, to } = request; + await verifySignatures({ + methodNameAndArgs, + signatures, + chainId, + to, + }); + + const strategy = strategiesByName[strategyName as RelayStrategyName]; + const relayRequest: RelayRequest = { + chainId, + to, + methodNameAndArgs, + signatures, + }; + + // Get cached request + const cachedRequest = await getCachedRelayRequest(relayRequest); + + if ( + !cachedRequest || + cachedRequest.status === "unknown" || + cachedRequest.status === "success" + ) { + throw new InvalidParamError({ + param: "request", + message: "Request not found in cache or succeeded already", + }); + } + + const { messageId } = cachedRequest; + + // Handle request via strategy + try { + const txHash = await strategy.relay(relayRequest); + // Store requestId in database + await setCachedRelayRequestSuccess({ + request: relayRequest, + txHash, + }); + return res.status(200).json({ + messageId, + txHash, + }); + } catch (error) { + await setCachedRelayRequestFailure({ + request: relayRequest, + error: error as Error, + }); + throw error; + } + } catch (error) { + return handleErrorCondition("relay/jobs/process", res, logger, error); + } +} diff --git a/api/relay/status.ts b/api/relay/status.ts new file mode 100644 index 000000000..0a029adf4 --- /dev/null +++ b/api/relay/status.ts @@ -0,0 +1,45 @@ +import { VercelResponse } from "@vercel/node"; +import { assert, type, Infer } from "superstruct"; + +import { handleErrorCondition, InputError } from "../_errors"; +import { getLogger, hexString } from "../_utils"; +import { getCachedRelayRequest } from "./_utils"; +import { TypedVercelRequest } from "../_types"; + +const RelayRequestStatusSchema = type({ + requestHash: hexString(), +}); + +type RelayRequestStatusType = Infer; + +export default async function handler( + request: TypedVercelRequest, + response: VercelResponse +) { + const logger = getLogger(); + logger.debug({ + at: "Relay/status", + message: "Request params", + params: request.query, + }); + + try { + assert(request.query, RelayRequestStatusSchema); + + const cachedRelayRequest = await getCachedRelayRequest( + request.query.requestHash + ); + + if (cachedRelayRequest.status === "unknown") { + throw new InputError({ + message: `Request with hash ${request.query.requestHash} is unknown`, + code: "INVALID_PARAM", + param: "requestHash", + }); + } + + response.status(200).json(cachedRelayRequest); + } catch (error) { + return handleErrorCondition("api/relay/status", response, logger, error); + } +} diff --git a/api/swap/approval/_utils.ts b/api/swap/approval/_utils.ts index 15f0715f7..25af6c5e7 100644 --- a/api/swap/approval/_utils.ts +++ b/api/swap/approval/_utils.ts @@ -84,7 +84,10 @@ export async function buildCrossSwapTxForAllowanceHolder( const { baseDepositData } = await extractDepositDataStruct(crossSwapQuotes); - if (depositEntryPoint.name === "SpokePoolPeriphery") { + if ( + depositEntryPoint.name === "SpokePoolPeriphery" && + crossSwapQuotes.crossSwap.isInputNative + ) { const spokePoolPeriphery = getSpokePoolPeriphery( depositEntryPoint.address, originChainId @@ -92,7 +95,6 @@ export async function buildCrossSwapTxForAllowanceHolder( tx = await spokePoolPeriphery.populateTransaction.deposit( baseDepositData.recipient, baseDepositData.inputToken, - // baseDepositData.outputToken, // TODO: allow for output token in periphery contract baseDepositData.inputAmount, baseDepositData.outputAmount, baseDepositData.destinationChainId, @@ -102,13 +104,15 @@ export async function buildCrossSwapTxForAllowanceHolder( baseDepositData.exclusivityDeadline, baseDepositData.message, { - value: crossSwapQuotes.crossSwap.isInputNative - ? baseDepositData.inputAmount - : 0, + value: baseDepositData.inputAmount, } ); toAddress = spokePoolPeriphery.address; - } else if (depositEntryPoint.name === "SpokePool") { + } else if ( + depositEntryPoint.name === "SpokePool" || + (depositEntryPoint.name === "SpokePoolPeriphery" && + !crossSwapQuotes.crossSwap.isInputNative) + ) { const spokePool = getSpokePool(originChainId); tx = await spokePool.populateTransaction.depositV3( baseDepositData.depositor, diff --git a/api/swap/permit/_utils.ts b/api/swap/permit/_utils.ts index d1bb441e1..b6136691b 100644 --- a/api/swap/permit/_utils.ts +++ b/api/swap/permit/_utils.ts @@ -15,7 +15,6 @@ import { extractSwapAndDepositDataStruct, } from "../../_dexes/utils"; import { SpokePoolV3PeripheryInterface } from "../../_typechain/SpokePoolV3Periphery"; -import { stringifyBigNumProps } from "../_utils"; export async function buildPermitTxPayload({ crossSwapQuotes, @@ -137,22 +136,15 @@ export async function buildPermitTxPayload({ ]); return { eip712: { - permit: { - ...permitTypedData.eip712, - message: stringifyBigNumProps(permitTypedData.eip712.message), - }, - deposit: { - ...depositTypedData.eip712, - message: stringifyBigNumProps(depositTypedData.eip712.message), - }, + permit: permitTypedData.eip712, + deposit: depositTypedData.eip712, }, swapTx: { chainId: originChainId, to: entryPointContract.address, methodName: methodNameAndArgsWithoutSignatures.methodName, - argsWithoutSignatures: stringifyBigNumProps( - methodNameAndArgsWithoutSignatures.argsWithoutSignatures - ), + argsWithoutSignatures: + methodNameAndArgsWithoutSignatures.argsWithoutSignatures, }, }; } diff --git a/api/swap/permit/index.ts b/api/swap/permit/index.ts index 3738d340d..579c4106f 100644 --- a/api/swap/permit/index.ts +++ b/api/swap/permit/index.ts @@ -4,7 +4,11 @@ import { assert, Infer, optional, type } from "superstruct"; import { TypedVercelRequest } from "../../_types"; import { getLogger, handleErrorCondition, positiveIntStr } from "../../_utils"; import { getCrossSwapQuotes } from "../../_dexes/cross-swap-service"; -import { handleBaseSwapQueryParams, BaseSwapQueryParams } from "../_utils"; +import { + handleBaseSwapQueryParams, + BaseSwapQueryParams, + stringifyBigNumProps, +} from "../_utils"; import { getSwapRouter02Strategy } from "../../_dexes/uniswap/swap-router-02"; import { InvalidParamError } from "../../_errors"; import { buildPermitTxPayload } from "./_utils"; @@ -96,7 +100,7 @@ const handler = async ( }, }); - const responseJson = crossSwapTxForPermit; + const responseJson = stringifyBigNumProps(crossSwapTxForPermit); logger.debug({ at: "Swap/permit", diff --git a/package.json b/package.json index b0afbcc24..52ba8024c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@uniswap/sdk-core": "^5.9.0", "@uniswap/smart-order-router": "^4.7.8", "@uniswap/v3-sdk": "^3.18.1", + "@upstash/qstash": "^2.7.20", "@vercel/kv": "^2.0.0", "@web3-onboard/coinbase": "^2.4.1", "@web3-onboard/core": "^2.21.2", diff --git a/scripts/generate-routes.ts b/scripts/generate-routes.ts index d60be8cec..c90ae91b0 100644 --- a/scripts/generate-routes.ts +++ b/scripts/generate-routes.ts @@ -126,26 +126,26 @@ const enabledRoutes = { }, }, spokePoolPeripheryAddresses: { - [CHAIN_IDs.ARBITRUM]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.BASE]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.BLAST]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.MAINNET]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.OPTIMISM]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.POLYGON]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.WORLD_CHAIN]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - [CHAIN_IDs.ZK_SYNC]: "0xB007dFe9A6b70e1AB5BD5E97C22e47C5e0c0B8D8", - [CHAIN_IDs.ZORA]: "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", + [CHAIN_IDs.ARBITRUM]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.BASE]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.BLAST]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.MAINNET]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.OPTIMISM]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.POLYGON]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.WORLD_CHAIN]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + [CHAIN_IDs.ZK_SYNC]: "0xA081fbEafed82313d8C656ac6BA6cdd8198C8FaA", + [CHAIN_IDs.ZORA]: "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", }, spokePoolPeripheryProxyAddresses: { - [CHAIN_IDs.ARBITRUM]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.BASE]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.BLAST]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.MAINNET]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.OPTIMISM]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.POLYGON]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.WORLD_CHAIN]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - [CHAIN_IDs.ZK_SYNC]: "0xB007dFe9A6b70e1AB5BD5E97C22e47C5e0c0B8D8", - [CHAIN_IDs.ZORA]: "0xAa074de443aee6725EA5aC45FF2add1dC8366485", + [CHAIN_IDs.ARBITRUM]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.BASE]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.BLAST]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.MAINNET]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.OPTIMISM]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.POLYGON]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.WORLD_CHAIN]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + [CHAIN_IDs.ZK_SYNC]: "0x2604C295565e4cd82CB8aa07c3ab5ed611E34f0E", + [CHAIN_IDs.ZORA]: "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", }, routes: transformChainConfigs(enabledMainnetChainConfigs), }, diff --git a/scripts/tests/swap-permit.ts b/scripts/tests/swap-permit.ts index ecc9a9ea3..ab052e48e 100644 --- a/scripts/tests/swap-permit.ts +++ b/scripts/tests/swap-permit.ts @@ -13,12 +13,6 @@ async function swapWithPermit() { getProvider(swapQuote.swapTx.chainId) ); - console.log("EIP712 Permit:", swapQuote.eip712.permit); - console.log( - "EIP712 Deposit:", - swapQuote.eip712.deposit.message.submissionFees - ); - // sign permit + deposit const permitSig = await wallet._signTypedData( swapQuote.eip712.permit.domain, @@ -40,6 +34,20 @@ async function swapWithPermit() { signatures: { permit: permitSig, deposit: depositSig }, }); console.log("Relay response:", relayResponse.data); + + // track relay + while (true) { + const relayStatusResponse = await axios.get( + `${SWAP_API_BASE_URL}/api/relay/status?requestHash=${relayResponse.data.requestHash}` + ); + console.log("Relay status response:", relayStatusResponse.data); + + if (relayStatusResponse.data.status === "success") { + break; + } + + await new Promise((resolve) => setTimeout(resolve, 1_000)); + } } } diff --git a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json index a4e5abbfc..174e15542 100644 --- a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json +++ b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json @@ -39,26 +39,26 @@ } }, "spokePoolPeripheryAddresses": { - "1": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "10": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "137": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "324": "0xB007dFe9A6b70e1AB5BD5E97C22e47C5e0c0B8D8", - "480": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "8453": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "42161": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "81457": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a", - "7777777": "0xF5E3419d9107dE8da3E16ccb5e305686FAC2Cc1a" + "1": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "10": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "137": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "324": "0xA081fbEafed82313d8C656ac6BA6cdd8198C8FaA", + "480": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "8453": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "42161": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "81457": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3", + "7777777": "0xED7Bf315Ba2E9Db86b766b8AaC48502298dfe7d3" }, "spokePoolPeripheryProxyAddresses": { - "1": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "10": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "137": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "324": "0xB007dFe9A6b70e1AB5BD5E97C22e47C5e0c0B8D8", - "480": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "8453": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "42161": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "81457": "0xAa074de443aee6725EA5aC45FF2add1dC8366485", - "7777777": "0xAa074de443aee6725EA5aC45FF2add1dC8366485" + "1": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "10": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "137": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "324": "0x2604C295565e4cd82CB8aa07c3ab5ed611E34f0E", + "480": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "8453": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "42161": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "81457": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8", + "7777777": "0x2d5E44b66bD40267fb816c9537E026545bEbbAC8" }, "routes": [ { diff --git a/vercel.json b/vercel.json index 00a7f48ec..9ac06f42b 100644 --- a/vercel.json +++ b/vercel.json @@ -20,6 +20,9 @@ }, "api/cron-ping-endpoints.ts": { "maxDuration": 90 + }, + "api/relay/jobs/process.ts": { + "maxDuration": 90 } }, "rewrites": [ diff --git a/yarn.lock b/yarn.lock index 2ce25fdaf..e31430a44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -102,7 +102,6 @@ superstruct "^0.15.4" tslib "^2.6.2" viem "^2.21.15" - viem "^2.21.15" "@adraffy/ens-normalize@1.10.0": version "1.10.0" @@ -119,11 +118,6 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== -"@adraffy/ens-normalize@^1.10.1": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" - integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== - "@amplitude/ampli@^1.34.0": version "1.34.0" resolved "https://registry.yarnpkg.com/@amplitude/ampli/-/ampli-1.34.0.tgz#878bdeddc392ff24d707f8137834f9213098dd8e" @@ -1337,13 +1331,6 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.25.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1472,40 +1459,6 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" -"@coral-xyz/anchor-errors@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" - integrity sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ== - -"@coral-xyz/anchor@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" - integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== - dependencies: - "@coral-xyz/anchor-errors" "^0.30.1" - "@coral-xyz/borsh" "^0.30.1" - "@noble/hashes" "^1.3.1" - "@solana/web3.js" "^1.68.0" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^6.3.0" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - pako "^2.0.3" - snake-case "^3.0.4" - superstruct "^0.15.4" - toml "^3.0.0" - -"@coral-xyz/borsh@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" - integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -3914,13 +3867,6 @@ dependencies: "@noble/hashes" "1.5.0" -"@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@^1.4.2", "@noble/curves@^1.6.0", "@noble/curves@~1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" - integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== - dependencies: - "@noble/hashes" "1.5.0" - "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" @@ -3941,11 +3887,6 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== -"@noble/hashes@1.5.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.5.0", "@noble/hashes@~1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" - integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== - "@noble/hashes@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" @@ -4987,11 +4928,6 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== -"@scure/base@~1.1.7", "@scure/base@~1.1.8": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" - integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== - "@scure/bip32@1.1.5": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" @@ -5028,15 +4964,6 @@ "@noble/hashes" "~1.5.0" "@scure/base" "~1.1.7" -"@scure/bip32@1.5.0", "@scure/bip32@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" - integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== - dependencies: - "@noble/curves" "~1.6.0" - "@noble/hashes" "~1.5.0" - "@scure/base" "~1.1.7" - "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -5069,14 +4996,6 @@ "@noble/hashes" "~1.5.0" "@scure/base" "~1.1.8" -"@scure/bip39@1.4.0", "@scure/bip39@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" - integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== - dependencies: - "@noble/hashes" "~1.5.0" - "@scure/base" "~1.1.8" - "@sentry/browser@7.37.2": version "7.37.2" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.37.2.tgz#355dd28ad12677d63e0b12c5209d12b3f98ac3a4" @@ -6424,13 +6343,6 @@ dependencies: tslib "^2.8.0" -"@swc/helpers@^0.5.11": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" - integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== - dependencies: - tslib "^2.8.0" - "@synthetixio/ethereum-wallet-mock@0.0.1-alpha.7": version "0.0.1-alpha.7" resolved "https://registry.yarnpkg.com/@synthetixio/ethereum-wallet-mock/-/ethereum-wallet-mock-0.0.1-alpha.7.tgz#313abfab9176d9da71ec69c40a96fbcd334f6a42" @@ -6918,13 +6830,6 @@ dependencies: "@types/node" "*" -"@types/connect@^3.4.33": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - "@types/cross-spawn@^6.0.2": version "6.0.4" resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.4.tgz#e658d29e2308a01f48b7b30fd8cdf07aeb2e5a82" @@ -7231,7 +7136,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.0.0", "@types/node@^12.12.54", "@types/node@^12.12.6": "@types/node@^12.0.0", "@types/node@^12.12.54", "@types/node@^12.12.6": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" @@ -7437,11 +7341,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/webpack-env@^1.17.0": version "1.18.0" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb" @@ -7461,20 +7360,6 @@ dependencies: "@types/node" "*" -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@types/ws@^8.2.2": - version "8.5.13" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" - integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== - dependencies: - "@types/node" "*" - "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -7501,13 +7386,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.33": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.24" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" @@ -7984,6 +7862,15 @@ tiny-invariant "^1.1.0" tiny-warning "^1.0.3" +"@upstash/qstash@^2.7.20": + version "2.7.20" + resolved "https://registry.yarnpkg.com/@upstash/qstash/-/qstash-2.7.20.tgz#7027829be8f2087d35ab179ec6c9bd9ee5154a64" + integrity sha512-fdh5df4BuJwSUhXv33g/Eaj7gG+fu3tBoXyGE5hg4zEZX9fwUY/nuc0uDlLWh54L66JfMdESVOjIaiLa1cgL1Q== + dependencies: + crypto-js ">=4.2.0" + jose "^5.2.3" + neverthrow "^7.0.1" + "@upstash/redis@^1.31.3": version "1.34.0" resolved "https://registry.yarnpkg.com/@upstash/redis/-/redis-1.34.0.tgz#f32cd53ebeeafbba7eca10f8597a573d5a2fed0d" @@ -8652,14 +8539,6 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -8697,11 +8576,6 @@ abitype@1.0.6, abitype@^1.0.6: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== -abitype@1.0.6, abitype@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" - integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -8820,13 +8694,6 @@ agentkeepalive@^4.5.0: dependencies: humanize-ms "^1.2.1" -agentkeepalive@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -10224,13 +10091,6 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" @@ -10264,7 +10124,6 @@ binary@~0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" -bindings@^1.3.0, bindings@^1.5.0: bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -10390,15 +10249,6 @@ borsh@^0.7.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -10613,13 +10463,6 @@ bs58@^6.0.0: dependencies: base-x "^5.0.0" -bs58@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" - integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== - dependencies: - base-x "^5.0.0" - bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -10684,11 +10527,6 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.2: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - buffer-reverse@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" @@ -10704,7 +10542,6 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3, buffer@~6.0.3: buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -10884,7 +10721,6 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.3.0: camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -11583,12 +11419,6 @@ commander@^12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -commander@^2.11.0, commander@^2.15.0, commander@^2.19.0, commander@^2.20.3: -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - commander@^2.11.0, commander@^2.15.0, commander@^2.19.0, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -11877,13 +11707,6 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - cross-fetch@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" @@ -11956,12 +11779,7 @@ crypto-hash@^1.3.0: resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== -crypto-hash@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" - integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== - -crypto-js@^4.2.0: +crypto-js@>=4.2.0, crypto-js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== @@ -12289,11 +12107,6 @@ delay@^5.0.0: resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -12510,14 +12323,6 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - dot-prop@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -12977,7 +12782,6 @@ es6-iterator@^2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-promise@4.2.8, es6-promise@^4.0.3, es6-promise@^4.2.8: es6-promise@4.2.8, es6-promise@^4.0.3, es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -12990,13 +12794,6 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" @@ -13978,11 +13775,6 @@ eventemitter3@5.0.1, eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -eventemitter3@5.0.1, eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - eventemitter3@^4.0.0, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -14215,11 +14007,6 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - fake-merkle-patricia-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" @@ -14280,11 +14067,6 @@ fast-stable-stringify@^1.0.0: resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - fast-text-encoding@^1.0.0, fast-text-encoding@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" @@ -15924,13 +15706,6 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - husky@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" @@ -16893,11 +16668,6 @@ isomorphic-ws@^4.0.1: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - isows@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" @@ -16913,11 +16683,6 @@ isows@1.0.6: resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== -isows@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" - integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -17100,24 +16865,6 @@ jayson@^4.1.1: uuid "^8.3.2" ws "^7.5.10" -jayson@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e" - integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - uuid "^8.3.2" - ws "^7.5.10" - jest-changed-files@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" @@ -17536,11 +17283,6 @@ jinx-rust@0.1.6: resolved "https://registry.yarnpkg.com/jinx-rust/-/jinx-rust-0.1.6.tgz#c7bce55d97bfbad76a9b930c01fe6a8629a170d7" integrity sha512-qP+wtQL1PrDDFwtPKhNGtjWOmijCrKdfUHWTV2G/ikxfjrh+cjdvkQTmny9RAsVF0jiui9m+F0INWu4cuRcZeQ== -jinx-rust@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/jinx-rust/-/jinx-rust-0.1.6.tgz#c7bce55d97bfbad76a9b930c01fe6a8629a170d7" - integrity sha512-qP+wtQL1PrDDFwtPKhNGtjWOmijCrKdfUHWTV2G/ikxfjrh+cjdvkQTmny9RAsVF0jiui9m+F0INWu4cuRcZeQ== - joi@17.9.1: version "17.9.1" resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.1.tgz#74899b9fa3646904afa984a11df648eca66c9018" @@ -17557,6 +17299,11 @@ jose@^4.9.3: resolved "https://registry.yarnpkg.com/jose/-/jose-4.9.3.tgz#890abd3f26725fe0f2aa720bc2f7835702b624db" integrity sha512-f8E/z+T3Q0kA9txzH2DKvH/ds2uggcw0m3vVPSB9HrSkrQ7mojjifvS7aR8cw+lQl2Fcmx9npwaHpM/M3GD8UQ== +jose@^5.2.3: + version "5.9.6" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.6.tgz#77f1f901d88ebdc405e57cce08d2a91f47521883" + integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== + joycon@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -17808,7 +17555,6 @@ json-stable-stringify@^1.0.1: jsonify "^0.0.1" object-keys "^1.1.1" -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -17876,11 +17622,6 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - jsonschema@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" @@ -18514,13 +18255,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -19161,7 +18895,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -19438,6 +19171,11 @@ neo-async@^2.5.0, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +neverthrow@^7.0.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/neverthrow/-/neverthrow-7.2.0.tgz#76fa0a6cf1f6d59f0770df461c92b8b270910694" + integrity sha512-iGBUfFB7yPczHHtA8dksKTJ9E8TESNTAx1UQWW6TzMF280vo9jdPYpLUXrMN1BCkPdHFdNG3fxOt2CUad8KhAw== + next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" @@ -19463,14 +19201,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -19522,7 +19252,6 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.9, node-fetch@^2.7.0: node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.9, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -19957,19 +19686,6 @@ ox@0.1.2: abitype "^1.0.6" eventemitter3 "5.0.1" -ox@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.1.2.tgz#0f791be2ccabeaf4928e6d423498fe1c8094e560" - integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== - 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" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -20074,11 +19790,6 @@ pako@^2.0.3: resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== -pako@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -20674,20 +20385,11 @@ prettier-plugin-rust@^0.1.9: jinx-rust "0.1.6" prettier "^2.7.1" -prettier-plugin-rust@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/prettier-plugin-rust/-/prettier-plugin-rust-0.1.9.tgz#1a93b035743fa02a006b4980a1035a260ea9e501" - integrity sha512-n1DTTJQaHMdnoG/+nKUvBm3EKsMVWsYES2UPCiOPiZdBrmuAO/pX++m7L3+Hz3uuhtddpH0HRKHB2F3jbtJBOQ== - dependencies: - jinx-rust "0.1.6" - prettier "^2.7.1" - prettier@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== -prettier@^2.7.1, prettier@^2.8.0: prettier@^2.7.1, prettier@^2.8.0: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" @@ -22095,22 +21797,6 @@ rpc-websockets@^9.0.2: bufferutil "^4.0.1" utf-8-validate "^5.0.2" -rpc-websockets@^9.0.2: - version "9.0.4" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.4.tgz#9d8ee82533b5d1e13d9ded729e3e38d0d8fa083f" - integrity sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ== - dependencies: - "@swc/helpers" "^0.5.11" - "@types/uuid" "^8.3.4" - "@types/ws" "^8.2.2" - buffer "^6.0.3" - eventemitter3 "^5.0.1" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - run-async@^2.4.0, run-async@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -22667,14 +22353,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -23088,7 +22766,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -23123,6 +22801,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -23197,7 +22884,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -23225,6 +22912,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -23340,11 +23034,6 @@ superstruct@^2.0.2: resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== -superstruct@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" - integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== - supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -23596,11 +23285,6 @@ text-encoding-utf-8@^1.0.2: resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -23657,7 +23341,6 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -23818,11 +23501,6 @@ toml@^3.0.0: resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - tough-cookie@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" @@ -24000,11 +23678,6 @@ tslib@^2.8.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -25722,14 +25395,6 @@ webauthn-p256@0.0.10: "@noble/curves" "^1.4.0" "@noble/hashes" "^1.4.0" -webauthn-p256@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" - integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== - dependencies: - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.4.0" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -25960,7 +25625,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -25995,6 +25660,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -26056,11 +25730,6 @@ ws@8.18.0, ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -ws@8.18.0, ws@^8.5.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -26094,11 +25763,6 @@ ws@^7.5.10: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^7.5.10: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - ws@^8.11.0, ws@^8.13.0, ws@^8.2.3: version "8.17.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea"