From 0a3efc0c45ce4d0a55e9bedd8f6bdf640b823bd6 Mon Sep 17 00:00:00 2001 From: Kacper Szarkiewicz Date: Thu, 2 Apr 2026 11:38:35 +0200 Subject: [PATCH 1/9] replace axios with native fetch wrapper in frontend --- .../src/services/api/alfredpay.service.ts | 102 ++------------ apps/frontend/src/services/api/api-client.ts | 131 +++++++++--------- apps/frontend/src/services/api/auth.api.ts | 55 ++------ .../src/services/api/monerium.service.ts | 31 +---- 4 files changed, 104 insertions(+), 215 deletions(-) diff --git a/apps/frontend/src/services/api/alfredpay.service.ts b/apps/frontend/src/services/api/alfredpay.service.ts index f0af68376..3b56c2a4e 100644 --- a/apps/frontend/src/services/api/alfredpay.service.ts +++ b/apps/frontend/src/services/api/alfredpay.service.ts @@ -14,120 +14,46 @@ import { import { apiClient } from "./api-client"; export const AlfredpayService = { - /** - * Register a new fiat account. - */ async addFiatAccount(payload: AlfredpayAddFiatAccountRequest): Promise { - const response = await apiClient.post("/alfredpay/fiatAccounts", payload); - return response.data; + return apiClient.post("/alfredpay/fiatAccounts", payload); }, async createBusinessCustomer(country: string): Promise { - const response = await apiClient.post("/alfredpay/createBusinessCustomer", { - country - }); - return response.data; + return apiClient.post("/alfredpay/createBusinessCustomer", { country }); }, - /** - * Create a new Alfredpay individual customer. - */ async createIndividualCustomer(country: string): Promise { - const request: AlfredpayCreateCustomerRequest = { - country - }; - const response = await apiClient.post("/alfredpay/createIndividualCustomer", request); - return response.data; + const request: AlfredpayCreateCustomerRequest = { country }; + return apiClient.post("/alfredpay/createIndividualCustomer", request); }, - - /** - * Delete a registered fiat account. - */ async deleteFiatAccount(fiatAccountId: string, country: string): Promise { await apiClient.delete(`/alfredpay/fiatAccounts/${fiatAccountId}`, { params: { country } }); }, - /** - * Check Alfredpay status for a user in a specific country. - */ async getAlfredpayStatus(country: string): Promise { - const response = await apiClient.get("/alfredpay/alfredpayStatus", { - params: { country } - }); - return response.data; + return apiClient.get("/alfredpay/alfredpayStatus", { params: { country } }); }, - - /** - * Get dynamic form requirements for a country + payment method combo. - */ async getFiatAccountRequirements(country: string, paymentMethod: string): Promise { - const response = await apiClient.get("/alfredpay/fiatAccountRequirements", { + return apiClient.get("/alfredpay/fiatAccountRequirements", { params: { country, paymentMethod } }); - return response.data; }, - async getKybRedirectLink(country: string): Promise { - const response = await apiClient.get("/alfredpay/getKybRedirectLink", { - params: { country } - }); - return response.data; + return apiClient.get("/alfredpay/getKybRedirectLink", { params: { country } }); }, - - /** - * Get the KYC redirect link for a user. - */ async getKycRedirectLink(country: string): Promise { - const response = await apiClient.get("/alfredpay/getKycRedirectLink", { - params: { country } - }); - return response.data; + return apiClient.get("/alfredpay/getKycRedirectLink", { params: { country } }); }, - - /** - * Get the status of a specific KYC submission. - */ async getKycStatus(country: string, type?: AlfredpayCustomerType): Promise { - const response = await apiClient.get("/alfredpay/getKycStatus", { - params: { country, type } - }); - return response.data; + return apiClient.get("/alfredpay/getKycStatus", { params: { country, type } }); }, - - /** - * List all registered fiat accounts for the current user in a given country. - */ - async listFiatAccounts(country: string): Promise { - const response = await apiClient.get("/alfredpay/fiatAccounts", { - params: { country } - }); - return response.data; + async listFiatAccounts(country: string, signal?: AbortSignal): Promise { + return apiClient.get("/alfredpay/fiatAccounts", { params: { country }, signal }); }, - - /** - * Notify that the KYC redirect process is finished. - */ async notifyKycRedirectFinished(country: string, type?: AlfredpayCustomerType): Promise<{ success: boolean }> { - const response = await apiClient.post<{ success: boolean }>("/alfredpay/kycRedirectFinished", { - country, - type - }); - return response.data; + return apiClient.post<{ success: boolean }>("/alfredpay/kycRedirectFinished", { country, type }); }, - - /** - * Notify that the KYC redirect link has been opened. - */ async notifyKycRedirectOpened(country: string, type?: AlfredpayCustomerType): Promise<{ success: boolean }> { - const response = await apiClient.post<{ success: boolean }>("/alfredpay/kycRedirectOpened", { - country, - type - }); - return response.data; + return apiClient.post<{ success: boolean }>("/alfredpay/kycRedirectOpened", { country, type }); }, - async retryKyc(country: string, type?: AlfredpayCustomerType): Promise { - const response = await apiClient.post("/alfredpay/retryKyc", { - country, - type - }); - return response.data; + return apiClient.post("/alfredpay/retryKyc", { country, type }); } }; diff --git a/apps/frontend/src/services/api/api-client.ts b/apps/frontend/src/services/api/api-client.ts index 025fcfd29..fa10e6039 100644 --- a/apps/frontend/src/services/api/api-client.ts +++ b/apps/frontend/src/services/api/api-client.ts @@ -1,83 +1,90 @@ -import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios"; import { SIGNING_SERVICE_URL } from "../../constants/constants"; import { AuthService } from "../auth"; -// TODO: CONSIDER REACT TANSTACK QUERY +export class ApiError extends Error { + status: number; + data: { error?: string; message?: string; details?: string }; -/** - * Base API client for making requests to the backend - */ -export const apiClient: AxiosInstance = axios.create({ - baseURL: `${SIGNING_SERVICE_URL}/v1`, - headers: { - "Content-Type": "application/json" - }, - timeout: 30000 -}); + constructor(status: number, data: Record, message: string) { + super(message); + this.status = status; + this.data = data; + } +} + +export function isApiError(error: unknown): error is ApiError { + return error instanceof ApiError; +} -// Add request interceptor for common headers and auth token -apiClient.interceptors.request.use( - config => { - // Add Authorization header if user is authenticated - const tokens = AuthService.getTokens(); - if (tokens?.accessToken) { - config.headers.Authorization = `Bearer ${tokens.accessToken}`; +async function apiFetch( + method: string, + path: string, + options: { + data?: unknown; + params?: Record; + headers?: Record; + signal?: AbortSignal; + } = {} +): Promise { + const tokens = AuthService.getTokens(); + + const url = new URL(`${SIGNING_SERVICE_URL}/v1${path}`); + if (options.params) { + for (const [key, value] of Object.entries(options.params)) { + if (value !== undefined) url.searchParams.set(key, String(value)); } - return config; - }, - error => { - return Promise.reject(error); } -); -// Add response interceptor for error handling -apiClient.interceptors.response.use( - response => { - return response; - }, - (error: AxiosError) => { - console.error("API Error:", error.response?.data || error.message); - return Promise.reject(error); + const isFormData = options.data instanceof FormData; + + const response = await fetch(url.toString(), { + body: isFormData ? (options.data as FormData) : options.data !== undefined ? JSON.stringify(options.data) : undefined, + headers: { + ...(tokens?.accessToken ? { Authorization: `Bearer ${tokens.accessToken}` } : {}), + ...(!isFormData ? { "Content-Type": "application/json" } : {}), + ...options.headers + }, + method, + signal: options.signal ?? AbortSignal.timeout(30000) + }); + + if (!response.ok) { + const errorData = (await response.json().catch(() => ({}))) as { error?: string; message?: string }; + console.error("API Error:", errorData); + throw new ApiError(response.status, errorData, errorData.error ?? errorData.message ?? response.statusText); } -); -/** - * Helper function to handle API errors - * @param error The error object - * @param defaultMessage Default error message - * @returns Formatted error message - */ + if (response.status === 204) return undefined as T; + return response.json() as Promise; +} + export const handleApiError = (error: unknown, defaultMessage = "An error occurred"): string => { - if (axios.isAxiosError(error)) { - const responseData = error.response?.data as { error?: string; message?: string; details?: string } | undefined; - return responseData?.error || responseData?.message || error.message || defaultMessage; + if (isApiError(error)) { + return error.data?.error ?? error.data?.message ?? error.message ?? defaultMessage; } return error instanceof Error ? error.message : defaultMessage; }; -/** - * Generic API request function with error handling - * @param method The HTTP method - * @param url The endpoint URL - * @param data The request data - * @param config Additional axios config - * @returns The response data - */ export async function apiRequest( method: "get" | "post" | "put" | "delete", url: string, data?: unknown, - config?: AxiosRequestConfig -): Promise { - try { - const response = await apiClient.request({ - data, - method, - url, - ...config - }); - return response.data; - } catch (error) { - throw new Error(handleApiError(error)); + config?: { + params?: Record; + headers?: Record; + signal?: AbortSignal; } +): Promise { + return apiFetch(method, url, { data, ...config }); } + +type Params = Record; + +export const apiClient = { + delete: (url: string, config?: { params?: Params }) => apiFetch("DELETE", url, { params: config?.params }), + get: (url: string, config?: { params?: Params; signal?: AbortSignal }) => + apiFetch("GET", url, { params: config?.params, signal: config?.signal }), + post: (url: string, data?: unknown, config?: { headers?: Record; params?: Params }) => + apiFetch("POST", url, { data, headers: config?.headers, params: config?.params }), + put: (url: string, data?: unknown) => apiFetch("PUT", url, { data }) +}; diff --git a/apps/frontend/src/services/api/auth.api.ts b/apps/frontend/src/services/api/auth.api.ts index dddee6b1e..7424d8c09 100644 --- a/apps/frontend/src/services/api/auth.api.ts +++ b/apps/frontend/src/services/api/auth.api.ts @@ -13,70 +13,43 @@ export interface VerifyOTPResponse { } export class AuthAPI { - /** - * Check if email exists - */ static async checkEmail(email: string): Promise { - const response = await apiClient.get("/auth/check-email", { - params: { email } - }); - return response.data; + return apiClient.get("/auth/check-email", { params: { email } }); } - /** - * Request OTP - */ static async requestOTP(email: string, locale?: string): Promise { - await apiClient.post("/auth/request-otp", { - email, - locale - }); + await apiClient.post("/auth/request-otp", { email, locale }); } - /** - * Verify OTP - */ static async verifyOTP(email: string, token: string): Promise { - const response = await apiClient.post<{ success: boolean; access_token: string; refresh_token: string; user_id: string }>( + const data = await apiClient.post<{ success: boolean; access_token: string; refresh_token: string; user_id: string }>( "/auth/verify-otp", - { - email, - token - } + { email, token } ); return { - accessToken: response.data.access_token, - refreshToken: response.data.refresh_token, - success: response.data.success, - userId: response.data.user_id + accessToken: data.access_token, + refreshToken: data.refresh_token, + success: data.success, + userId: data.user_id }; } - /** - * Refresh token - */ static async refreshToken(refreshToken: string): Promise { - const response = await apiClient.post<{ success: boolean; access_token: string; refresh_token: string }>("/auth/refresh", { + const data = await apiClient.post<{ success: boolean; access_token: string; refresh_token: string }>("/auth/refresh", { refresh_token: refreshToken }); return { - accessToken: response.data.access_token, - refreshToken: response.data.refresh_token, - success: response.data.success, + accessToken: data.access_token, + refreshToken: data.refresh_token, + success: data.success, userId: "" // Refresh doesn't return user_id, but interface requires it }; } - /** - * Verify access token - */ static async verifyToken(accessToken: string): Promise<{ valid: boolean; userId?: string }> { - const response = await apiClient.post<{ valid: boolean; user_id?: string }>("/auth/verify", { + const data = await apiClient.post<{ valid: boolean; user_id?: string }>("/auth/verify", { access_token: accessToken }); - return { - userId: response.data.user_id, - valid: response.data.valid - }; + return { userId: data.user_id, valid: data.valid }; } } diff --git a/apps/frontend/src/services/api/monerium.service.ts b/apps/frontend/src/services/api/monerium.service.ts index bd93acee1..fcd922c6c 100644 --- a/apps/frontend/src/services/api/monerium.service.ts +++ b/apps/frontend/src/services/api/monerium.service.ts @@ -1,31 +1,23 @@ -import axios from "axios"; import { MONERIUM_MINT_NETWORK } from "../monerium/moneriumAuth"; -import { apiClient } from "./api-client"; +import { apiClient, isApiError } from "./api-client"; export interface MoneriumUserStatus { isNewUser: boolean; } export const MoneriumService = { - /** - * Check if a user exists in Monerium from our backend. - */ async checkUserStatus(address: string): Promise { try { console.log("Checking Monerium user status for address:", address); await apiClient.get("/monerium/address-exists", { params: { address, network: MONERIUM_MINT_NETWORK } }); - return { - isNewUser: false - }; + return { isNewUser: false }; } catch (error: unknown) { - if (axios.isAxiosError(error)) { - if (error.response && error.response.status === 404) { + if (isApiError(error)) { + if (error.status === 404) { console.log("Monerium user not found"); - return { - isNewUser: true - }; + return { isNewUser: true }; } throw new Error(`Error checking Monerium user status: ${error.message}`); } @@ -33,24 +25,15 @@ export const MoneriumService = { } }, - /** - * Create signature for Monerium offrampm, 10 minutes from now. - */ async createRampMessage(amount: string, iban: string): Promise { const date = new Date(Date.now() + 1000 * 60 * 10).toISOString(); return `Send EUR ${amount} to ${iban} at ${date}`; }, - /** - * Validate Monerium auth tokens - */ async validateAuthTokens(authCode: string, codeVerifier: string): Promise { try { - const response = await apiClient.post("/monerium/validate-auth", { - authCode, - codeVerifier - }); - return response.data.valid; + const data = await apiClient.post<{ valid: boolean }>("/monerium/validate-auth", { authCode, codeVerifier }); + return data.valid; } catch (error) { console.error("Error validating Monerium auth tokens:", error); return false; From 1aa743d7bd457978f89af859445e58f6f6e20e8a Mon Sep 17 00:00:00 2001 From: Kacper Szarkiewicz Date: Thu, 2 Apr 2026 11:40:53 +0200 Subject: [PATCH 2/9] replace axios with native fetch in shared package --- .../shared/src/services/squidrouter/route.ts | 120 +++++++++++------- .../shared/src/tokens/evm/dynamicEvmTokens.ts | 11 +- 2 files changed, 77 insertions(+), 54 deletions(-) diff --git a/packages/shared/src/services/squidrouter/route.ts b/packages/shared/src/services/squidrouter/route.ts index e8861568c..d22111f7e 100644 --- a/packages/shared/src/services/squidrouter/route.ts +++ b/packages/shared/src/services/squidrouter/route.ts @@ -1,4 +1,3 @@ -import axios, { AxiosError } from "axios"; import PQueue from "p-queue"; import logger from "../../logger"; import { squidRouterConfigBase } from "./config"; @@ -112,16 +111,34 @@ export interface GetRouteOptions { // This prevents hitting SquidRouter API rate limits for the same user when multiple getRoute() calls happen in quick succession. const routeQueues = new Map(); +class HttpError extends Error { + status: number; + data: unknown; + + constructor(status: number, data: unknown) { + super(`HTTP ${status}`); + this.status = status; + this.data = data; + } +} + +async function squidFetch(url: string, options: RequestInit): Promise<{ data: T; headers: Headers }> { + const response = await fetch(url, options); + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new HttpError(response.status, errorData); + } + const data = (await response.json()) as T; + return { data, headers: response.headers }; +} + /** * Get a route from Squidrouter. * * When useCache is true, returns a stripped-down SquidrouterCachedRouteResult without transactionRequest. * When useCache is false or not specified (default), returns the full SquidrouterRouteResult. */ -export async function getRoute( - params: RouteParams, - options: { useCache: true } -): Promise; +export async function getRoute(params: RouteParams, options: { useCache: true }): Promise; export async function getRoute(params: RouteParams, options?: { useCache?: false }): Promise; export async function getRoute( params: RouteParams, @@ -148,7 +165,8 @@ export async function getRoute( } try { - const result = (await queue.add(() => getRouteInternal(params))) as SquidrouterRouteResult; + const result = await queue.add(() => getRouteInternal(params)); + if (!result) throw new Error("Route fetch returned no result"); if (useCache) { const cacheKey = generateRouteCacheKey(params); @@ -167,47 +185,54 @@ export async function getRoute( } async function getRouteInternal(params: RouteParams): Promise { - // This is the integrator ID for the Squidrouter API const { integratorId } = squidRouterConfigBase; const url = `${SQUIDROUTER_BASE_URL}/route`; + let fetchResult: Awaited>>; try { - const result = await axios.post(url, params, { + fetchResult = await squidFetch<{ route: SquidrouterRoute }>(url, { + body: JSON.stringify(params), headers: { "Content-Type": "application/json", "x-integrator-id": integratorId - } + }, + method: "POST" }); - - const requestId = result.headers["x-request-id"]; // Retrieve request ID from response headers - - if (!result.data || !result.data.route) { - logger.current.error(`Invalid API response structure. Request ID: ${requestId}`); - throw new Error("Invalid response from Squid Router API"); - } - - // FIXME remove this check once squidRouter works as expected again. - // Check if slippage of received route is reasonable. - const route = result.data.route; - if (route.estimate?.aggregateSlippage !== undefined) { - const slippage = route.estimate.aggregateSlippage; - if (slippage > 2.5) { - logger.current.warn(`Received route with high slippage: ${slippage}%. Request ID: ${requestId}`); - // FIXME: temporarily disabled because we are facing issues with squidrouter routes failing the swap to USDT - // throw new Error(`The slippage of the route is too high: ${slippage}%. Please try again later.`); - } - } - - return { data: { route }, requestId }; } catch (error) { - if (error instanceof AxiosError && error.response) { - logger.current.error(`Error fetching route from Squidrouter API: ${JSON.stringify(error.response?.data)}}`); - throw new Error(`Failed to fetch route: ${error.response?.data?.message || "Unknown error"}`); + if (error instanceof HttpError) { + logger.current.error(`Error fetching route from Squidrouter API: ${JSON.stringify(error.data)}`); + const message = + typeof error.data === "object" && error.data !== null && "message" in error.data + ? String((error.data as { message: unknown }).message) + : "Unknown error"; + error.message = `Failed to fetch route: ${message}`; } else { logger.current.error(`Error with parameters: ${JSON.stringify(params)}`); - throw error; + } + throw error; + } + + const { data, headers } = fetchResult; + const requestId = headers.get("x-request-id"); + + if (!data || !data.route) { + logger.current.error(`Invalid API response structure. Request ID: ${requestId}`); + throw new Error("Invalid response from Squid Router API"); + } + + // FIXME remove this check once squidRouter works as expected again. + // Check if slippage of received route is reasonable. + const route = data.route; + if (route.estimate?.aggregateSlippage !== undefined) { + const slippage = route.estimate.aggregateSlippage; + if (slippage > 2.5) { + logger.current.warn(`Received route with high slippage: ${slippage}%. Request ID: ${requestId}`); + // FIXME: temporarily disabled because we are facing issues with squidrouter routes failing the swap to USDT + // throw new Error(`The slippage of the route is too high: ${slippage}%. Please try again later.`); } } + + return { data: { route }, requestId: requestId ?? "" }; } // Function to get the status of the transaction using Squid API @@ -225,24 +250,23 @@ export async function getStatus( logger.current.debug( `Fetching status for transaction ID: ${transactionId} with integrator ID: ${integratorId} from Squidrouter API.` ); + + const url = new URL(`${SQUIDROUTER_BASE_URL}/status`); + if (fromChainId) url.searchParams.set("fromChainId", fromChainId); + if (toChainId) url.searchParams.set("toChainId", toChainId); + url.searchParams.set("transactionId", transactionId); + if (quoteId) url.searchParams.set("quoteId", quoteId); + try { - const result = await axios.get(`${SQUIDROUTER_BASE_URL}/status`, { - headers: { - "x-integrator-id": integratorId - }, - params: { - fromChainId, - quoteId, - toChainId, - transactionId - } + const { data } = await squidFetch(url.toString(), { + headers: { "x-integrator-id": integratorId } }); - return result.data; + return data; } catch (error) { - if (error instanceof AxiosError && error.response) { - logger.current.error("API error:", error.response.data); + if (error instanceof HttpError) { + logger.current.error("API error:", error.data); } - logger.current.error(`Couldn't get status from squidRouter for transactionID ${transactionId}.}`); + logger.current.error(`Couldn't get status from squidRouter for transactionID ${transactionId}.`); throw error; } } diff --git a/packages/shared/src/tokens/evm/dynamicEvmTokens.ts b/packages/shared/src/tokens/evm/dynamicEvmTokens.ts index 039cdbb1b..5211c72e2 100644 --- a/packages/shared/src/tokens/evm/dynamicEvmTokens.ts +++ b/packages/shared/src/tokens/evm/dynamicEvmTokens.ts @@ -1,4 +1,3 @@ -import axios from "axios"; import { EvmNetworks, getNetworkId, isNetworkEVM, Networks } from "../../helpers/networks"; import logger from "../../logger"; import { squidRouterConfigBase } from "../../services/squidrouter/config"; @@ -245,12 +244,12 @@ function buildPriceLookup(tokensByNetwork: Record { - const result = await axios.get(SQUID_ROUTER_API_URL, { - headers: { - "x-integrator-id": squidRouterConfigBase.integratorId - } + const response = await fetch(SQUID_ROUTER_API_URL, { + headers: { "x-integrator-id": squidRouterConfigBase.integratorId } }); - return result.data.tokens; + if (!response.ok) throw new Error(`Failed to fetch SquidRouter tokens: ${response.status}`); + const data = await response.json(); + return data.tokens; } function buildFallbackFromStaticConfig(): Record>> { From ff17113c53f56fa9505ecf8f982790f9fba36d50 Mon Sep 17 00:00:00 2001 From: Kacper Szarkiewicz Date: Thu, 2 Apr 2026 11:41:54 +0200 Subject: [PATCH 3/9] thread AbortSignal from TanStack Query into service calls --- apps/frontend/src/hooks/alfredpay/useFiatAccounts.ts | 2 +- apps/frontend/src/hooks/useRampHistory.ts | 4 ++-- .../FeeComparisonTable/hooks/useFeeComparisonData.ts | 5 +++-- apps/frontend/src/services/api/price.service.ts | 6 ++++-- apps/frontend/src/services/api/ramp.service.ts | 9 +++++++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/hooks/alfredpay/useFiatAccounts.ts b/apps/frontend/src/hooks/alfredpay/useFiatAccounts.ts index eec131449..2b56d4ecd 100644 --- a/apps/frontend/src/hooks/alfredpay/useFiatAccounts.ts +++ b/apps/frontend/src/hooks/alfredpay/useFiatAccounts.ts @@ -18,7 +18,7 @@ export function useFiatAccounts(country: string, options?: { enabled?: boolean } const enabled = (options?.enabled ?? true) && !!country; return useQuery({ enabled, - queryFn: () => AlfredpayService.listFiatAccounts(country), + queryFn: ({ signal }) => AlfredpayService.listFiatAccounts(country, signal), queryKey: [cacheKeys.fiatAccounts, country], ...(inactiveOptions["5m"] as FiatAccountsQueryPartialOptions) }); diff --git a/apps/frontend/src/hooks/useRampHistory.ts b/apps/frontend/src/hooks/useRampHistory.ts index 018967c80..4cfc46bcb 100644 --- a/apps/frontend/src/hooks/useRampHistory.ts +++ b/apps/frontend/src/hooks/useRampHistory.ts @@ -30,12 +30,12 @@ export function useRampHistory(walletAddress?: string) { return useQuery({ enabled: addresses.length > 0, - queryFn: async () => { + queryFn: async ({ signal }) => { const allTransactions: Transaction[] = []; for (const address of addresses) { try { - const response = await RampService.getRampHistory(address, 100); + const response = await RampService.getRampHistory(address, 100, undefined, signal); const transactions = response.transactions.map(formatTransaction); allTransactions.push(...transactions); } catch (error) { diff --git a/apps/frontend/src/sections/individuals/FeeComparison/FeeComparisonTable/hooks/useFeeComparisonData.ts b/apps/frontend/src/sections/individuals/FeeComparison/FeeComparisonTable/hooks/useFeeComparisonData.ts index 195d8dc8e..8cf92d30c 100644 --- a/apps/frontend/src/sections/individuals/FeeComparison/FeeComparisonTable/hooks/useFeeComparisonData.ts +++ b/apps/frontend/src/sections/individuals/FeeComparison/FeeComparisonTable/hooks/useFeeComparisonData.ts @@ -27,13 +27,14 @@ export function useFeeComparisonData( ) { // Fetch prices from all providers (including vortex) const { data: allPricesResponse, isLoading: isLoadingPrices } = useQuery({ - queryFn: () => { + queryFn: ({ signal }) => { return PriceService.getAllPricesBundled( sourceAssetSymbol.toLowerCase() as Currency, targetAssetSymbol.toLowerCase() as Currency, amount, direction, - network + network, + signal ); }, queryKey: [cacheKeys.allPrices, amount, sourceAssetSymbol, targetAssetSymbol, network, direction], diff --git a/apps/frontend/src/services/api/price.service.ts b/apps/frontend/src/services/api/price.service.ts index 13c482841..a4eab539d 100644 --- a/apps/frontend/src/services/api/price.service.ts +++ b/apps/frontend/src/services/api/price.service.ts @@ -118,7 +118,8 @@ export class PriceService { targetCurrency: Currency, amount: string, direction: RampDirection, - network?: string + network?: string, + signal?: AbortSignal ): Promise { return apiRequest("get", `${this.BASE_PATH}/all`, undefined, { params: { @@ -127,7 +128,8 @@ export class PriceService { network, sourceCurrency, targetCurrency - } + }, + signal }); } diff --git a/apps/frontend/src/services/api/ramp.service.ts b/apps/frontend/src/services/api/ramp.service.ts index bdc8feefc..7d31672db 100644 --- a/apps/frontend/src/services/api/ramp.service.ts +++ b/apps/frontend/src/services/api/ramp.service.ts @@ -137,7 +137,12 @@ export class RampService { * @param offset The offset for pagination * @returns The transaction history */ - static async getRampHistory(walletAddress: string, limit?: number, offset?: number): Promise { + static async getRampHistory( + walletAddress: string, + limit?: number, + offset?: number, + signal?: AbortSignal + ): Promise { const queryParams = new URLSearchParams(); if (limit) queryParams.append("limit", limit.toString()); if (offset) queryParams.append("offset", offset.toString()); @@ -145,6 +150,6 @@ export class RampService { const queryString = queryParams.toString(); const url = `${this.BASE_PATH}/history/${walletAddress}${queryString ? `?${queryString}` : ""}`; - return apiRequest("get", url); + return apiRequest("get", url, undefined, { signal }); } } From b8c48e75a5f81bdfeacbc6e137c8ee73e2637ed7 Mon Sep 17 00:00:00 2001 From: Kacper Szarkiewicz Date: Thu, 2 Apr 2026 11:42:35 +0200 Subject: [PATCH 4/9] remove axios dependency --- apps/api/package.json | 2 +- apps/frontend/package.json | 2 +- bun.lock | 4 ---- package.json | 2 +- packages/shared/package.json | 2 +- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 43e2381dd..ead6396d5 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -14,7 +14,7 @@ "@supabase/supabase-js": "catalog:", "@vortexfi/shared": "workspace:*", "@wagmi/core": "catalog:", - "axios": "catalog:", + "bcrypt": "catalog:", "big.js": "catalog:", "body-parser": "^1.17.0", diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 5681d7f1c..871be846c 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -43,7 +43,7 @@ "@walletconnect/universal-provider": "^2.21.10", "@walletconnect/utils": "catalog:", "@xstate/react": "^6.0.0", - "axios": "catalog:", + "big.js": "catalog:", "bn.js": "^5.2.1", "buffer": "^6.0.3", diff --git a/bun.lock b/bun.lock index 09dcae887..173815272 100644 --- a/bun.lock +++ b/bun.lock @@ -33,7 +33,6 @@ "@supabase/supabase-js": "catalog:", "@vortexfi/shared": "workspace:*", "@wagmi/core": "catalog:", - "axios": "catalog:", "bcrypt": "catalog:", "big.js": "catalog:", "body-parser": "^1.17.0", @@ -145,7 +144,6 @@ "@walletconnect/universal-provider": "^2.21.10", "@walletconnect/utils": "catalog:", "@xstate/react": "^6.0.0", - "axios": "catalog:", "big.js": "catalog:", "bn.js": "^5.2.1", "buffer": "^6.0.3", @@ -290,7 +288,6 @@ "@scure/bip39": "catalog:", "@types/node-forge": "^1.3.14", "@wagmi/core": "catalog:", - "axios": "catalog:", "big.js": "catalog:", "node-forge": "^1.3.1", "p-queue": "^9.1.0", @@ -366,7 +363,6 @@ "@wagmi/core": "^2.22.1", "@walletconnect/types": "^2.23.0", "@walletconnect/utils": "^2.23.0", - "axios": "1.9.0", "bcrypt": "5.1.1", "big.js": "^7.0.1", "clsx": "^1.2.1", diff --git a/package.json b/package.json index e8fa11f86..a5218db25 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@wagmi/core": "^2.22.1", "@walletconnect/types": "^2.23.0", "@walletconnect/utils": "^2.23.0", - "axios": "1.9.0", + "bcrypt": "5.1.1", "big.js": "^7.0.1", "clsx": "^1.2.1", diff --git a/packages/shared/package.json b/packages/shared/package.json index 9dd8dcf41..fc25fb9ba 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -13,7 +13,7 @@ "@scure/bip39": "catalog:", "@types/node-forge": "^1.3.14", "@wagmi/core": "catalog:", - "axios": "catalog:", + "big.js": "catalog:", "node-forge": "^1.3.1", "p-queue": "^9.1.0", From cbeeae1a771894c16d7eb61e9e3190cd9818dac0 Mon Sep 17 00:00:00 2001 From: Kacper Szarkiewicz Date: Thu, 2 Apr 2026 14:15:36 +0200 Subject: [PATCH 5/9] address PR comments --- apps/frontend/src/hooks/useRampHistory.ts | 1 + apps/frontend/src/services/api/api-client.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/hooks/useRampHistory.ts b/apps/frontend/src/hooks/useRampHistory.ts index 4cfc46bcb..2c0255b9e 100644 --- a/apps/frontend/src/hooks/useRampHistory.ts +++ b/apps/frontend/src/hooks/useRampHistory.ts @@ -39,6 +39,7 @@ export function useRampHistory(walletAddress?: string) { const transactions = response.transactions.map(formatTransaction); allTransactions.push(...transactions); } catch (error) { + if (error instanceof DOMException && error.name === "AbortError") throw error; console.warn(`Failed to fetch wallet history for ${address}:`, error); } } diff --git a/apps/frontend/src/services/api/api-client.ts b/apps/frontend/src/services/api/api-client.ts index fa10e6039..3c8508538 100644 --- a/apps/frontend/src/services/api/api-client.ts +++ b/apps/frontend/src/services/api/api-client.ts @@ -5,7 +5,7 @@ export class ApiError extends Error { status: number; data: { error?: string; message?: string; details?: string }; - constructor(status: number, data: Record, message: string) { + constructor(status: number, data: { error?: string; message?: string; details?: string }, message: string) { super(message); this.status = status; this.data = data; @@ -45,7 +45,7 @@ async function apiFetch( ...options.headers }, method, - signal: options.signal ?? AbortSignal.timeout(30000) + signal: options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(30000)]) : AbortSignal.timeout(30000) }); if (!response.ok) { From 91ea08e4102ddd197cd526c4e601c3c797fa432b Mon Sep 17 00:00:00 2001 From: Marcel Ebert Date: Mon, 13 Apr 2026 10:57:18 +0200 Subject: [PATCH 6/9] Update package.json to require Node.js version 18 or higher --- apps/api/package.json | 2 +- apps/rebalancer/package.json | 3 +++ package.json | 3 +++ packages/sdk/package.json | 3 +++ packages/shared/package.json | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/api/package.json b/apps/api/package.json index ead6396d5..28ccbb945 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -80,7 +80,7 @@ "typescript": "catalog:" }, "engines": { - "node": ">=12" + "node": ">=18" }, "license": "MIT", "name": "vortex-backend", diff --git a/apps/rebalancer/package.json b/apps/rebalancer/package.json index bc19634f4..64b3f1389 100644 --- a/apps/rebalancer/package.json +++ b/apps/rebalancer/package.json @@ -20,6 +20,9 @@ "@types/bun": "^1.3.1", "typescript": "catalog:" }, + "engines": { + "node": ">=18" + }, "module": "index.ts", "name": "vortex-rebalancer", "peerDependencies": {}, diff --git a/package.json b/package.json index a5218db25..7cd85b36d 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,9 @@ "concurrently": "catalog:", "typescript": "catalog:" }, + "engines": { + "node": ">=18" + }, "lint-staged": { "*": [ "biome check --write --no-errors-on-unmatched --formatter-enabled=true --linter-enabled=false" diff --git a/packages/sdk/package.json b/packages/sdk/package.json index cf4b44413..8b01fbd82 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -6,6 +6,9 @@ "@types/bun": "^1.3.1", "typescript": "^5.0.0" }, + "engines": { + "node": ">=18" + }, "exports": { ".": { "import": "./dist/index.js", diff --git a/packages/shared/package.json b/packages/shared/package.json index fc25fb9ba..6d8323863 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -30,6 +30,9 @@ "tsup": "catalog:", "typescript": "catalog:" }, + "engines": { + "node": ">=18" + }, "exports": { ".": { "browser": "./src/index.ts", From e5099748edd6b8ed0d5fa78d1aae5fa24be259ba Mon Sep 17 00:00:00 2001 From: Marcel Ebert Date: Mon, 13 Apr 2026 10:57:26 +0200 Subject: [PATCH 7/9] Rename variable --- .../FiatAccountRegistration/RegisterFiatAccountScreen.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/pages/alfredpay/FiatAccountRegistration/RegisterFiatAccountScreen.tsx b/apps/frontend/src/pages/alfredpay/FiatAccountRegistration/RegisterFiatAccountScreen.tsx index 1557e1938..a19888b37 100644 --- a/apps/frontend/src/pages/alfredpay/FiatAccountRegistration/RegisterFiatAccountScreen.tsx +++ b/apps/frontend/src/pages/alfredpay/FiatAccountRegistration/RegisterFiatAccountScreen.tsx @@ -112,14 +112,14 @@ export function RegisterFiatAccountScreen({ country, accountType, onSuccess }: R toast.success(t("components.fiatAccountRegistration.registeredSuccess")); onSuccess(); } catch (err: unknown) { - const axiosErr = err as { + const apiErr = err as { response?: { status?: number; data?: { error?: string; message?: string; fields?: { field: string; message: string }[] }; }; }; - const status = axiosErr?.response?.status; - const body = axiosErr?.response?.data; + const status = apiErr?.response?.status; + const body = apiErr?.response?.data; if (status === 409) { toast.error(t("components.fiatAccountRegistration.alreadyRegistered")); From f7dee52eba8e454cefd79418615736f0969d7ea7 Mon Sep 17 00:00:00 2001 From: Marcel Ebert Date: Mon, 13 Apr 2026 11:21:28 +0200 Subject: [PATCH 8/9] Override axios peer dependencies to 1.15.0 --- bun.lock | 11 +++++------ package.json | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bun.lock b/bun.lock index 173815272..5004f0173 100644 --- a/bun.lock +++ b/bun.lock @@ -329,6 +329,7 @@ "@polkadot/types-known": "^16.4.6", "@polkadot/util": "^13.5.6", "@polkadot/util-crypto": "^13.5.6", + "axios": "^1.15.0", "big.js": "^7.0.1", "viem": "^2.37.9", "wagmi": "^2.17.5", @@ -2315,7 +2316,7 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axios": ["axios@1.9.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg=="], + "axios": ["axios@1.15.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="], "axios-retry": ["axios-retry@4.5.0", "", { "dependencies": { "is-retry-allowed": "^2.2.0" }, "peerDependencies": { "axios": "0.x || 1.x" } }, "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ=="], @@ -3855,7 +3856,7 @@ "proxy-compare": ["proxy-compare@3.0.1", "", {}, "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q=="], - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], "pstree.remy": ["pstree.remy@1.1.8", "", {}, "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="], @@ -4633,8 +4634,6 @@ "@coinbase/cdp-sdk/abitype": ["abitype@1.0.6", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A=="], - "@coinbase/cdp-sdk/axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], - "@coinbase/cdp-sdk/jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], "@coinbase/wallet-sdk/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], @@ -4865,6 +4864,8 @@ "@sentry/bundler-plugin-core/unplugin": ["unplugin@1.0.1", "", { "dependencies": { "acorn": "^8.8.1", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.5.0" } }, "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA=="], + "@sentry/cli/proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "@sentry/hub/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "@sentry/minimal/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -5123,8 +5124,6 @@ "eth-gas-reporter/@solidity-parser/parser": ["@solidity-parser/parser@0.14.5", "", { "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg=="], - "eth-gas-reporter/axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], - "eth-gas-reporter/ethers": ["ethers@5.8.0", "", { "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.8.0", "@ethersproject/address": "5.8.0", "@ethersproject/base64": "5.8.0", "@ethersproject/basex": "5.8.0", "@ethersproject/bignumber": "5.8.0", "@ethersproject/bytes": "5.8.0", "@ethersproject/constants": "5.8.0", "@ethersproject/contracts": "5.8.0", "@ethersproject/hash": "5.8.0", "@ethersproject/hdnode": "5.8.0", "@ethersproject/json-wallets": "5.8.0", "@ethersproject/keccak256": "5.8.0", "@ethersproject/logger": "5.8.0", "@ethersproject/networks": "5.8.0", "@ethersproject/pbkdf2": "5.8.0", "@ethersproject/properties": "5.8.0", "@ethersproject/providers": "5.8.0", "@ethersproject/random": "5.8.0", "@ethersproject/rlp": "5.8.0", "@ethersproject/sha2": "5.8.0", "@ethersproject/signing-key": "5.8.0", "@ethersproject/solidity": "5.8.0", "@ethersproject/strings": "5.8.0", "@ethersproject/transactions": "5.8.0", "@ethersproject/units": "5.8.0", "@ethersproject/wallet": "5.8.0", "@ethersproject/web": "5.8.0", "@ethersproject/wordlists": "5.8.0" } }, "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg=="], "eth-json-rpc-filters/pify": ["pify@5.0.0", "", {}, "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="], diff --git a/package.json b/package.json index 7cd85b36d..1c466158c 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "@polkadot/types-known": "^16.4.6", "@polkadot/util": "^13.5.6", "@polkadot/util-crypto": "^13.5.6", + "axios": "^1.15.0", "big.js": "^7.0.1", "viem": "^2.37.9", "wagmi": "^2.17.5" From f263e0d6e94aaeb5224c04742475a8abe272ac96 Mon Sep 17 00:00:00 2001 From: Marcel Ebert Date: Mon, 13 Apr 2026 11:23:37 +0200 Subject: [PATCH 9/9] Amend merge --- bun.lock | 63 +++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/bun.lock b/bun.lock index 5004f0173..df8b56619 100644 --- a/bun.lock +++ b/bun.lock @@ -149,6 +149,7 @@ "buffer": "^6.0.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cobe": "catalog:", "crypto-js": "^4.2.0", "i18next": "^24.2.3", "input-otp": "^1.4.2", @@ -313,6 +314,7 @@ }, }, "overrides": { + "@fastify/busboy": "3.2.0", "@polkadot/api": "^16.4.6", "@polkadot/api-augment": "^16.4.6", "@polkadot/api-base": "^16.4.6", @@ -329,8 +331,16 @@ "@polkadot/types-known": "^16.4.6", "@polkadot/util": "^13.5.6", "@polkadot/util-crypto": "^13.5.6", + "adm-zip": "0.5.2", "axios": "^1.15.0", "big.js": "^7.0.1", + "handlebars": "4.7.9", + "lodash": "4.18.0", + "node-forge": "1.4.0", + "path-to-regexp": "8.4.0", + "tar": "7.5.11", + "tmp": "0.2.4", + "undici": "6.24.0", "viem": "^2.37.9", "wagmi": "^2.17.5", }, @@ -367,6 +377,7 @@ "bcrypt": "5.1.1", "big.js": "^7.0.1", "clsx": "^1.2.1", + "cobe": "^2.0.1", "concurrently": "^9.1.2", "prettier": "^2.8.4", "stellar-sdk": "^13.1.0", @@ -812,7 +823,7 @@ "@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], - "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + "@fastify/busboy": ["@fastify/busboy@3.2.0", "", {}, "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA=="], "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], @@ -936,6 +947,8 @@ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@joshwooding/vite-plugin-react-docgen-typescript": ["@joshwooding/vite-plugin-react-docgen-typescript@0.6.1", "", { "dependencies": { "glob": "^10.0.0", "magic-string": "^0.30.0", "react-docgen-typescript": "^2.2.2" }, "peerDependencies": { "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["typescript"] }, "sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -2214,7 +2227,7 @@ "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], - "adm-zip": ["adm-zip@0.4.16", "", {}, "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg=="], + "adm-zip": ["adm-zip@0.5.2", "", {}, "sha512-lUI3ZSNsfQXNYNzGjt68MdxzCs0eW29lgL74y/Y2h4nARgHmH3poFWuK3LonvFbNHFt4dTb2X/QQ4c1ZUWWsJw=="], "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], @@ -2496,7 +2509,7 @@ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], @@ -2524,6 +2537,8 @@ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "cobe": ["cobe@2.0.1", "", {}, "sha512-aaa6vcIlaC8C1SF50LDH0Anybo/EAXnrxqe+bwvr4+YUtZydqjeBjTTD7ziCCkbRrRGSns3I3F6cZsf3W+L+ag=="], + "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -2988,8 +3003,6 @@ "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - "fs-readdir-recursive": ["fs-readdir-recursive@1.1.0", "", {}, "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="], "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], @@ -3078,7 +3091,7 @@ "h3": ["h3@1.15.10", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg=="], - "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + "handlebars": ["handlebars@4.7.9", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ=="], "hardhat": ["hardhat@2.28.6", "", { "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", "@nomicfoundation/edr": "0.12.0-next.23", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", "enquirer": "^2.3.0", "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", "keccak": "^3.0.2", "lodash": "^4.17.11", "micro-eth-signer": "^0.14.0", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, "peerDependencies": { "ts-node": "*", "typescript": "*" }, "optionalPeers": ["ts-node", "typescript"], "bin": { "hardhat": "internal/cli/bootstrap.js" } }, "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q=="], @@ -3424,7 +3437,7 @@ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash": ["lodash@4.18.0", "", {}, "sha512-l1mfj2atMqndAHI3ls7XqPxEjV2J9ZkcNyHpoZA3r2T1LLwDB69jgkMWh71YKwhBbK0G2f4WSn05ahmQXVxupA=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], @@ -3538,9 +3551,9 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], "mipd": ["mipd@0.0.7", "", { "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg=="], @@ -3614,7 +3627,7 @@ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], + "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], @@ -3692,8 +3705,6 @@ "os-browserify": ["os-browserify@0.3.0", "", {}, "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="], - "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], "ox": ["ox@0.14.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-zSQ/cfBdolj7U4++NAvH7sI+VG0T3pEohITCgcQj8KlawvTDY4vGVhDT64Atsm0d6adWfIYHDpu88iUBMMp+AQ=="], @@ -3754,7 +3765,7 @@ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + "path-to-regexp": ["path-to-regexp@8.4.0", "", {}, "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg=="], "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], @@ -4244,7 +4255,7 @@ "tapable": ["tapable@2.3.2", "", {}, "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="], - "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + "tar": ["tar@7.5.11", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ=="], "tar-stream": ["tar-stream@3.1.8", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ=="], @@ -4294,7 +4305,7 @@ "title-case": ["title-case@3.0.3", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA=="], - "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + "tmp": ["tmp@0.2.4", "", {}, "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ=="], "to-buffer": ["to-buffer@1.2.2", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw=="], @@ -4398,7 +4409,7 @@ "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], - "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "undici": ["undici@6.24.0", "", {}, "sha512-lVLNosgqo5EkGqh5XUDhGfsMSoO8K0BAN0TyJLvwNRSl4xWGZlCVYsAIpa/OpA3TvmnM01GWcoKmc3ZWo5wKKA=="], "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -4588,7 +4599,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], @@ -4804,8 +4815,6 @@ "@nomicfoundation/hardhat-verify/cbor": ["cbor@8.1.0", "", { "dependencies": { "nofilter": "^3.1.0" } }, "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg=="], - "@nomicfoundation/ignition-core/lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - "@paraspell/sdk-core/@scure/base": ["@scure/base@2.0.0", "", {}, "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w=="], "@polkadot/rpc-provider/@polkadot/x-global": ["@polkadot/x-global@14.0.3", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-MzMEynJ7HMTy/plLmdyP8rv14RS/6s29HZodUG9aCOscBnEiEDxVEax/ztRJqxhhQuHeYdx0LYDwVbdQDTkqNw=="], @@ -5014,8 +5023,6 @@ "@walletconnect/window-metadata/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "@whatwg-node/node-fetch/@fastify/busboy": ["@fastify/busboy@3.2.0", "", {}, "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA=="], - "@xhmikosr/downloader/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], "accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], @@ -5162,8 +5169,6 @@ "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], @@ -5244,8 +5249,6 @@ "miller-rabin/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="], - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "mocha/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "mocha/diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], @@ -5294,8 +5297,6 @@ "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "path-scurry/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "porto/ox": ["ox@0.9.17", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.0.9", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg=="], "porto/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], @@ -5540,8 +5541,6 @@ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "@joshwooding/vite-plugin-react-docgen-typescript/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/rpc-errors": ["@metamask/rpc-errors@6.4.0", "", { "dependencies": { "@metamask/utils": "^9.0.0", "fast-safe-stringify": "^2.0.6" } }, "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg=="], "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/utils": ["@metamask/utils@8.5.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ=="], @@ -5700,8 +5699,6 @@ "@walletconnect/utils/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "babel-plugin-transform-vite-meta-glob/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "borsh/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], @@ -5804,8 +5801,6 @@ "jayson/@types/ws/@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], - "js-beautify/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "js-beautify/nopt/abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], "log-update/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -6102,6 +6097,8 @@ "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/ox": ["ox@0.9.3", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.0.9", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg=="], + "@rushstack/node-core-library/semver/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "@sentry/bundler-plugin-core/unplugin/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@sentry/bundler-plugin-core/unplugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],