diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6ebae6b8e..443bcdc07 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,24 @@ updates: directory: "/" schedule: interval: "daily" + groups: + actions-deps: + patterns: + - "*" - package-ecosystem: "npm" directory: "/" schedule: interval: "daily" + groups: + dev-deps: + dependency-type: "development" + prod-deps: + dependency-type: "production" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] + # Packages that need manual upgrades or should be pinned to a specific version + - dependency-name: "@across-protocol/sdk" + - dependency-name: "@across-protocol/contracts" + - dependency-name: "@across-protocol/constants" + - dependency-name: "@balancer-labs/sdk" diff --git a/api/_constants.ts b/api/_constants.ts index 2106b4db1..b209fcd55 100644 --- a/api/_constants.ts +++ b/api/_constants.ts @@ -209,4 +209,4 @@ export const DEFAULT_LITE_CHAIN_USD_MAX_BALANCE = "250000"; export const DEFAULT_LITE_CHAIN_USD_MAX_DEPOSIT = "25000"; -export const DEFAULT_FILL_DEADLINE_BUFFER_SECONDS = 2.5 * 60 * 60; // 2.5 hours +export const DEFAULT_FILL_DEADLINE_BUFFER_SECONDS = 3.25 * 60 * 60; // 3.25 hours diff --git a/api/available-routes.ts b/api/available-routes.ts index 45e692eb5..f39c701ba 100644 --- a/api/available-routes.ts +++ b/api/available-routes.ts @@ -78,7 +78,9 @@ const handler = async ( route.fromTokenSymbol.toUpperCase()) && (!destinationTokenSymbol || destinationTokenSymbol.toUpperCase() === - route.toTokenSymbol.toUpperCase()), + route.toTokenSymbol.toUpperCase()) && + (route as { externalProjectId?: string }).externalProjectId === + undefined, // Create a mapping of enabled routes to a route with the destination token resolved. (route) => ({ originChainId: route.fromChain, diff --git a/jest.config.cjs b/jest.config.cjs index fb92748fb..74b784c72 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -1,6 +1,7 @@ /** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ module.exports = { + setupFiles: ["/setup.jest.ts"], preset: "ts-jest", testEnvironment: "node", moduleDirectories: ["node_modules", ""], diff --git a/package.json b/package.json index 0bf57fadf..14b5e64cc 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,9 @@ "react-router-dom": "v5", "react-tooltip": "^5.18.0", "superstruct": "^0.15.4", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "viem": "2.x", + "wagmi": "^2.14.9" }, "scripts": { "start": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && vite", @@ -132,7 +134,7 @@ "@types/react-dom": "v18", "@types/react-router-dom": "5.3.3", "@vercel/node": "^5.0.2", - "@vitejs/plugin-react": "^4.0.1", + "@vitejs/plugin-react": "^4.3.4", "axios-mock-adapter": "^1.21.2", "chalk": "^5.3.0", "chromatic": "^11.25.1", @@ -148,7 +150,7 @@ "jest-transform-stub": "^2.0.0", "lint-staged": "^13.0.3", "patch-package": "^7.0.0", - "prettier": "3.3.2", + "prettier": "^3.4.2", "rollup-plugin-visualizer": "^5.12.0", "storybook": "^7.5.3", "ts-jest": "^29.1.1", diff --git a/scripts/extern-configs/hyperliquid/assets/grayscale-logo.svg b/scripts/extern-configs/hyperliquid/assets/grayscale-logo.svg new file mode 100644 index 000000000..8ff58c997 --- /dev/null +++ b/scripts/extern-configs/hyperliquid/assets/grayscale-logo.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/scripts/extern-configs/hyperliquid/assets/logo.svg b/scripts/extern-configs/hyperliquid/assets/logo.svg new file mode 100644 index 000000000..f93fce225 --- /dev/null +++ b/scripts/extern-configs/hyperliquid/assets/logo.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/scripts/extern-configs/hyperliquid/index.ts b/scripts/extern-configs/hyperliquid/index.ts new file mode 100644 index 000000000..eea4eb13c --- /dev/null +++ b/scripts/extern-configs/hyperliquid/index.ts @@ -0,0 +1,13 @@ +import { CHAIN_IDs } from "@across-protocol/constants"; +import { ExternalProjectConfig } from "../types"; + +export default { + name: "Hyperliquid", + projectId: "hyperliquid", + explorer: "https://arbiscan.io", + logoPath: "./assets/logo.svg", + grayscaleLogoPath: "./assets/grayscale-logo.svg", + publicRpcUrl: "https://arbitrum.publicnode.com", + intermediaryChain: CHAIN_IDs.ARBITRUM, + tokens: ["USDC", "USDC.e"], +} as ExternalProjectConfig; diff --git a/scripts/extern-configs/index.ts b/scripts/extern-configs/index.ts new file mode 100644 index 000000000..a249a0c83 --- /dev/null +++ b/scripts/extern-configs/index.ts @@ -0,0 +1 @@ +export { default as HYPERLIQUID } from "./hyperliquid"; diff --git a/scripts/extern-configs/types.ts b/scripts/extern-configs/types.ts new file mode 100644 index 000000000..ceb2fa88e --- /dev/null +++ b/scripts/extern-configs/types.ts @@ -0,0 +1,13 @@ +// Destination only projects that are supported through a message bridge +// at a known supported intermediary chain +export type ExternalProjectConfig = { + projectId: string; + name: string; + fullName?: string; + explorer: string; + publicRpcUrl: string; + logoPath: string; + grayscaleLogoPath: string; + intermediaryChain: number; + tokens: string[]; +}; diff --git a/scripts/generate-routes.ts b/scripts/generate-routes.ts index 29f28acbd..68b44d7f3 100644 --- a/scripts/generate-routes.ts +++ b/scripts/generate-routes.ts @@ -6,6 +6,8 @@ import { writeFileSync } from "fs"; import * as prettier from "prettier"; import path from "path"; import * as chainConfigs from "./chain-configs"; +import * as externConfigs from "./extern-configs"; +import assert from "assert"; function getTokenSymbolForLogo(tokenSymbol: string): string { switch (tokenSymbol) { @@ -29,6 +31,8 @@ type ToToken = ToChain["tokens"][number]; type SwapToken = ToChain["swapTokens"][number]; type ValidTokenSymbol = string; +const enabledMainnetExternalProjects = [externConfigs.HYPERLIQUID]; + const enabledMainnetChainConfigs = [ chainConfigs.MAINNET, chainConfigs.OPTIMISM, @@ -109,7 +113,10 @@ const enabledRoutes = { // [CHAIN_IDs.BASE]: "0xbcfbCE9D92A516e3e7b0762AE218B4194adE34b4", }, }, - routes: transformChainConfigs(enabledMainnetChainConfigs), + routes: transformChainConfigs( + enabledMainnetChainConfigs, + enabledMainnetExternalProjects + ), }, [CHAIN_IDs.SEPOLIA]: { hubPoolChain: CHAIN_IDs.SEPOLIA, @@ -136,18 +143,21 @@ const enabledRoutes = { "0x17496824Ba574A4e9De80110A91207c4c63e552a", // Mocked }, }, - routes: transformChainConfigs(enabledSepoliaChainConfigs), + routes: transformChainConfigs(enabledSepoliaChainConfigs, []), }, } as const; function transformChainConfigs( - enabledChainConfigs: typeof enabledMainnetChainConfigs + enabledChainConfigs: typeof enabledMainnetChainConfigs, + enabledExternalProjects: typeof enabledMainnetExternalProjects ) { const transformedChainConfigs: { fromChain: number; fromSpokeAddress: string; + externalProjectId?: string; toChains: { chainId: number; + externalProjectId?: string; tokens: ( | string | { @@ -276,6 +286,7 @@ function transformChainConfigs( ]; } + // Handle WGRASS -> GRASS if ( tokenSymbol === "WGRASS" && toChainConfig.tokens.includes("GRASS") @@ -342,6 +353,47 @@ function transformChainConfigs( toChains.push(toChain); } + for (const externalProject of enabledExternalProjects) { + if (externalProject.intermediaryChain === fromChainId) { + continue; + } + const associatedChain = enabledChainConfigs.find( + (config) => config.chainId === externalProject.intermediaryChain + ); + assert(associatedChain, "Associated chain not found"); + + let associatedRoutes = processTokenRoutes( + chainConfig, + { ...associatedChain, enableCCTP: false }, + externalProject.tokens + ); + + const externalProjectId = externalProject.projectId; + + // Handle USDC swap tokens + const usdcSwapTokens = []; + + const toChain = { + chainId: externalProject.intermediaryChain, + externalProjectId, + tokens: associatedRoutes, + swapTokens: usdcSwapTokens.filter( + ({ acrossInputTokenSymbol, acrossOutputTokenSymbol }) => + associatedRoutes.some((token) => + typeof token === "string" + ? token === acrossInputTokenSymbol + : token.inputTokenSymbol === acrossInputTokenSymbol + ) && + associatedRoutes.some((token) => + typeof token === "string" + ? token === acrossOutputTokenSymbol + : token.outputTokenSymbol === acrossOutputTokenSymbol + ) + ), + }; + toChains.push(toChain); + } + transformedChainConfigs.push({ fromChain: fromChainId, fromSpokeAddress, @@ -352,6 +404,126 @@ function transformChainConfigs( return transformedChainConfigs; } +function processTokenRoutes( + fromConfig: typeof chainConfigs.MAINNET, + toConfig: typeof chainConfigs.MAINNET, + tokensToProcess?: string[] +) { + const toChainId = toConfig.chainId; + const tokens = tokensToProcess ?? fromConfig.tokens; + return tokens.flatMap((token) => { + const tokenSymbol = typeof token === "string" ? token : token.symbol; + + // If the fromConfig does not support the token, return an empty array + if (!fromConfig.tokens.includes(tokenSymbol)) { + return []; + } + + // Handle native USDC -> bridged USDC routes + if (tokenSymbol === "USDC") { + if (toConfig.enableCCTP) { + return [ + "USDC", + { + inputTokenSymbol: "USDC", + outputTokenSymbol: getBridgedUsdcSymbol(toChainId), + }, + ]; + } else if ( + toConfig.tokens.find( + (token) => typeof token === "string" && sdkUtils.isBridgedUsdc(token) + ) + ) { + return [ + { + inputTokenSymbol: "USDC", + outputTokenSymbol: getBridgedUsdcSymbol(toChainId), + }, + ]; + } + } + + // Handle bridged USDC -> native/bridged USDC routes + if (sdkUtils.isBridgedUsdc(tokenSymbol)) { + if (toConfig.enableCCTP) { + return [ + { + inputTokenSymbol: tokenSymbol, + outputTokenSymbol: "USDC", + }, + { + inputTokenSymbol: tokenSymbol, + outputTokenSymbol: getBridgedUsdcSymbol(toChainId), + }, + ]; + } else if (toConfig.tokens.includes("USDC")) { + return [ + { + inputTokenSymbol: tokenSymbol, + outputTokenSymbol: "USDC", + }, + ]; + } else if ( + toConfig.tokens.find( + (token) => typeof token === "string" && sdkUtils.isBridgedUsdc(token) + ) + ) { + return [ + { + inputTokenSymbol: tokenSymbol, + outputTokenSymbol: getBridgedUsdcSymbol(toChainId), + }, + ]; + } + } + + // Handle USDB -> DAI + if (tokenSymbol === "USDB" && toConfig.tokens.includes("DAI")) { + return [ + { + inputTokenSymbol: "USDB", + outputTokenSymbol: "DAI", + }, + ]; + } + if (tokenSymbol === "DAI" && toConfig.tokens.includes("USDB")) { + return [ + { + inputTokenSymbol: "DAI", + outputTokenSymbol: "USDB", + }, + ]; + } + + // Handle WETH Polygon & other non-eth chains + if ( + tokenSymbol === "WETH" && + !toConfig.tokens.includes("ETH") && + fromConfig.tokens.includes("ETH") + ) { + return ["WETH", "ETH"]; + } + + const chainIds = typeof token === "string" ? [toChainId] : token.chainIds; + + const toToken = toConfig.tokens.find((token) => + typeof token === "string" + ? token === tokenSymbol + : token.symbol === tokenSymbol + ); + if ( + !toToken || + (typeof toToken === "object" && + !toToken.chainIds.includes(fromConfig.chainId)) || + !chainIds.includes(toChainId) + ) { + return []; + } + + return tokenSymbol; + }); +} + async function generateRoutes(hubPoolChainId = 1) { const config = enabledRoutes[hubPoolChainId]; @@ -563,6 +735,11 @@ function transformToRoute( throw new Error("Mismatching L1 addresses"); } + const fromChain = Object.values(chainConfigs).find( + (config) => config.chainId === route.fromChain + )!; + const isNative = inputTokenSymbol === fromChain.nativeToken; + return { fromChain: route.fromChain, toChain: toChain.chainId, @@ -571,8 +748,9 @@ function transformToRoute( fromSpokeAddress: utils.getAddress(route.fromSpokeAddress), fromTokenSymbol: inputTokenSymbol, toTokenSymbol: outputTokenSymbol, - isNative: inputTokenSymbol === TOKEN_SYMBOLS_MAP.ETH.symbol, + isNative, l1TokenAddress: inputToken.l1TokenAddress, + externalProjectId: toChain.externalProjectId, }; } diff --git a/scripts/generate-ui-assets.ts b/scripts/generate-ui-assets.ts index 6a44ccfb3..bd65d3dfb 100644 --- a/scripts/generate-ui-assets.ts +++ b/scripts/generate-ui-assets.ts @@ -3,17 +3,22 @@ import * as prettier from "prettier"; import { camelCase, capitalize } from "lodash-es"; import * as chainConfigs from "./chain-configs"; +import * as externConfigs from "./extern-configs"; const chainsConstantsFileTargetDir = process.cwd() + "/src/constants/chains"; const chainsConstantsFilePath = chainsConstantsFileTargetDir + "/configs.ts"; const chainAssetsTargetDir = process.cwd() + "/src/assets/chain-logos"; +const externAssetsTargetDir = process.cwd() + "/src/assets/extern-logos"; async function generateUiAssets() { const chainsFileImports: string[] = [ "// This file is auto-generated by scripts/generate-ui-assets.ts", + 'import { defineChain } from "viem";', ]; const chainsFileContent: string[] = []; const chainVarNames: string[] = []; + const chainViemVarNames: string[] = []; + const externVarNames: string[] = []; for (const [chainKey, chainConfig] of Object.entries(chainConfigs)) { const { chainId, logoPath, grayscaleLogoPath, name, fullName } = @@ -64,14 +69,106 @@ async function generateUiAssets() { pollingInterval: ${(chainConfig.blockTimeSeconds || 15) * 1000}, }; `); + chainsFileContent.push(` + export const ${chainVarName}_viem = defineChain({ + id: ${chainVarName}.chainId, + name: ${chainVarName}.name, + nativeCurrency: { + name: ${chainVarName}.nativeCurrencySymbol, + symbol: ${chainVarName}.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + ${chainVarName}.rpcUrl, + ${chainVarName}.customRpcUrl ? ${chainVarName}.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: ${chainVarName}.name + " Explorer", + url: ${chainVarName}.explorerUrl, + }, + }, + }); + `); chainVarNames.push(chainVarName); + chainViemVarNames.push(chainVarName + "_viem"); + } + + // Process external project configs + for (const [projectKey, projectConfig] of Object.entries(externConfigs)) { + if (projectKey === "types") continue; // Skip the types file + + const { projectId, logoPath, grayscaleLogoPath, name, fullName } = + projectConfig; + + // Copy logos into assets directory + const assetFileNameBase = projectKey.toLowerCase().replace("_", "-"); + const projectLogoTargetFileName = assetFileNameBase + ".svg"; + const projectGrayscaleLogoTargetFileName = + assetFileNameBase + "-grayscale.svg"; + const projectConfigSrcDir = + process.cwd() + "/scripts/extern-configs/" + assetFileNameBase + "/"; + + copyFileSync( + projectConfigSrcDir + logoPath, + externAssetsTargetDir + "/" + projectLogoTargetFileName + ); + copyFileSync( + projectConfigSrcDir + grayscaleLogoPath, + externAssetsTargetDir + "/" + projectGrayscaleLogoTargetFileName + ); + + // Generate external project constants + const projectVarName = camelCase(name); + const projectLogoVarName = camelCase(name + "Logo"); + const projectGrayscaleLogoVarName = camelCase(name + "GrayscaleLogo"); + const projectLogoSvgVarName = projectLogoVarName + "Svg"; + const projectGrayscaleLogoSvgVarName = projectGrayscaleLogoVarName + "Svg"; + + chainsFileImports.push(` + import ${projectLogoVarName} from "assets/extern-logos/${projectLogoTargetFileName}"; + import ${projectGrayscaleLogoVarName} from "assets/extern-logos/${projectGrayscaleLogoTargetFileName}"; + import {ReactComponent as ${projectLogoSvgVarName}} from "assets/extern-logos/${projectLogoTargetFileName}"; + import {ReactComponent as ${projectGrayscaleLogoSvgVarName}} from "assets/extern-logos/${projectGrayscaleLogoTargetFileName}"; + `); + + chainsFileContent.push(` + export const ${projectVarName} = { + name: "${name}", + fullName: "${fullName || capitalize(name)}", + projectId: "${projectId}", + logoURI: ${projectLogoVarName}, + grayscaleLogoURI: ${projectGrayscaleLogoVarName}, + logoSvg: ${projectLogoSvgVarName}, + grayscaleLogoSvg: ${projectGrayscaleLogoSvgVarName}, + explorerUrl: "${projectConfig.explorer}", + rpcUrl: "${projectConfig.publicRpcUrl}", + intermediaryChain: ${projectConfig.intermediaryChain}, + }; + `); + externVarNames.push(projectVarName); } + chainsFileContent.push(` export const chainConfigs = [${chainVarNames.join(", ")}].reduce((acc, chain) => { acc[chain.chainId] = chain; return acc; }, {} as Record); `); + chainsFileContent.push(` + export const chains_viem = [${chainViemVarNames.join(", ")}] as const; + `); + + chainsFileContent.push(` + export const externConfigs = [${externVarNames.join(", ")}].reduce((acc, extern) => { + acc[extern.projectId] = extern; + return acc; + }, {} as Record); + `); // Write chains file const chainsFileContentStr = diff --git a/setup.jest.ts b/setup.jest.ts new file mode 100644 index 000000000..bb5df495c --- /dev/null +++ b/setup.jest.ts @@ -0,0 +1,4 @@ +import { TextEncoder, TextDecoder } from "util"; +global.TextEncoder = TextEncoder; +// @ts-expect-error - The types are incompatible but the implementation works correctly +global.TextDecoder = TextDecoder; diff --git a/src/Routes.tsx b/src/Routes.tsx index 4755bd8d4..06663fb54 100644 --- a/src/Routes.tsx +++ b/src/Routes.tsx @@ -188,14 +188,24 @@ const Routes: React.FC = () => { search: location.search, }} /> - {Object.entries(chainEndpointToId).map(([chainName, chainId]) => ( - } - /> - ))} + {Object.entries(chainEndpointToId).flatMap( + ([chainName, { chainId, associatedProjectIds }]) => [ + } + />, + associatedProjectIds.map((projectId) => ( + } + /> + )), + ] + )} } diff --git a/src/ampli/index.ts b/src/ampli/index.ts index fa531a64b..df5300159 100644 --- a/src/ampli/index.ts +++ b/src/ampli/index.ts @@ -203,7 +203,7 @@ export interface ConnectWalletButtonClickedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -219,7 +219,9 @@ export interface ConnectWalletButtonClickedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; /** * | Rule | Value | * |---|---| @@ -246,7 +248,7 @@ export interface CtaButtonClickedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -262,7 +264,9 @@ export interface CtaButtonClickedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; /** * | Rule | Value | * |---|---| @@ -320,7 +324,7 @@ export interface DisconnectWalletButtonClickedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -336,7 +340,9 @@ export interface DisconnectWalletButtonClickedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; /** * | Rule | Value | * |---|---| @@ -385,7 +391,7 @@ export interface EarnByAddingLiquidityClickedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -401,7 +407,9 @@ export interface EarnByAddingLiquidityClickedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; /** * | Rule | Value | * |---|---| @@ -558,7 +566,7 @@ export interface PageViewedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -574,7 +582,9 @@ export interface PageViewedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; path: string; /** * Address of referee, null if no referral used @@ -616,7 +626,7 @@ export interface QuickSwapButtonClickedProperties { /** * | Rule | Value | * |---|---| - * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage | + * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page, marketingHomePage, marketingBridgePage, marketingAcrossPlusPage, marketingSettlementPage, depositStatusPage, marketingBlogSpecificPage, marketingBlogHomePage | */ page: | "splashPage" @@ -632,7 +642,9 @@ export interface QuickSwapButtonClickedProperties { | "marketingBridgePage" | "marketingAcrossPlusPage" | "marketingSettlementPage" - | "depositStatusPage"; + | "depositStatusPage" + | "marketingBlogSpecificPage" + | "marketingBlogHomePage"; /** * | Rule | Value | * |---|---| @@ -671,6 +683,12 @@ export interface ToChainSelectedProperties { * Whether or not this event is the default value loaded when an event is rendered. */ default?: boolean; + /** + * | Rule | Value | + * |---|---| + * | Enum Values | hyper-liquid | + */ + externalProjectId?: "hyper-liquid"; /** * Id of the toChain */ @@ -1117,6 +1135,12 @@ export interface TransferSignedProperties { * | Type | number | */ expectedFillTimeInMinutesUpperBound?: number; + /** + * | Rule | Value | + * |---|---| + * | Enum Values | hyper-liquid | + */ + externalProjectId?: "hyper-liquid"; /** * From amount in the bridge token, in decimals */ @@ -1294,6 +1318,12 @@ export interface TransferSubmittedProperties { * | Type | number | */ expectedFillTimeInMinutesUpperBound?: number; + /** + * | Rule | Value | + * |---|---| + * | Enum Values | hyper-liquid | + */ + externalProjectId?: "hyper-liquid"; /** * From amount in the bridge token, in decimals */ diff --git a/src/assets/extern-logos/hyperliquid-grayscale.svg b/src/assets/extern-logos/hyperliquid-grayscale.svg new file mode 100644 index 000000000..8ff58c997 --- /dev/null +++ b/src/assets/extern-logos/hyperliquid-grayscale.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/assets/extern-logos/hyperliquid.svg b/src/assets/extern-logos/hyperliquid.svg new file mode 100644 index 000000000..f93fce225 --- /dev/null +++ b/src/assets/extern-logos/hyperliquid.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/components/DepositsTable/cells/RouteCell.tsx b/src/components/DepositsTable/cells/RouteCell.tsx index 5819b0391..4dd747547 100644 --- a/src/components/DepositsTable/cells/RouteCell.tsx +++ b/src/components/DepositsTable/cells/RouteCell.tsx @@ -3,9 +3,10 @@ import styled from "@emotion/styled"; import { Text } from "components/Text"; import { IconPair } from "components/IconPair"; import { Deposit } from "hooks/useDeposits"; -import { getChainInfo } from "utils"; +import { ChainInfo, getChainInfo, isHyperLiquidBoundDeposit } from "utils"; import { BaseCell } from "./BaseCell"; +import { externConfigs } from "constants/chains/configs"; type Props = { deposit: Deposit; @@ -13,8 +14,13 @@ type Props = { }; export function RouteCell({ deposit, width }: Props) { + const isHyperLiquidDeposit = isHyperLiquidBoundDeposit(deposit); + const sourceChain = getChainInfo(deposit.sourceChainId); - const destinationChain = getChainInfo(deposit.destinationChainId); + const destinationChain: Pick = + isHyperLiquidDeposit + ? externConfigs["hyperliquid"] + : getChainInfo(deposit.destinationChainId); return ( diff --git a/src/components/GlobalStyles/GlobalStyles.tsx b/src/components/GlobalStyles/GlobalStyles.tsx index 91704b274..bf4d75d9d 100644 --- a/src/components/GlobalStyles/GlobalStyles.tsx +++ b/src/components/GlobalStyles/GlobalStyles.tsx @@ -9,9 +9,9 @@ export const typography = css` font-weight: 400; font-display: fallback; src: url("/fonts/Barlow-Regular.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, - U+2215, U+FEFF, U+FFFD; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, + U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: "Barlow"; @@ -19,9 +19,9 @@ export const typography = css` font-weight: 500; font-display: fallback; src: url("/fonts/Barlow-Medium.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, - U+2215, U+FEFF, U+FFFD; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, + U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: "Barlow"; @@ -29,9 +29,9 @@ export const typography = css` font-weight: 700; font-display: fallback; src: url("/fonts/Barlow-Bold.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, - U+2215, U+FEFF, U+FFFD; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, + U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } `; const variables = css` diff --git a/src/components/Selector/Selector.tsx b/src/components/Selector/Selector.tsx index fa8a9c25c..55d617d0a 100644 --- a/src/components/Selector/Selector.tsx +++ b/src/components/Selector/Selector.tsx @@ -85,7 +85,11 @@ const Selector = ({ 6}> {elements.map((element, idx) => ( { if (element.disabled && !allowSelectDisabled) { return; diff --git a/src/components/Selector/useSelector.ts b/src/components/Selector/useSelector.ts index 7099c3fe8..6f5596245 100644 --- a/src/components/Selector/useSelector.ts +++ b/src/components/Selector/useSelector.ts @@ -1,14 +1,15 @@ import useCurrentBreakpoint from "hooks/useCurrentBreakpoint"; import { useState } from "react"; import { SelectorElementType } from "./Selector"; +import { isEqual } from "lodash-es"; export function useSelector( elements: SelectorElementType[], selectedValue: ValueType ) { const [displayModal, setDisplayModal] = useState(false); - const selectedIndex = elements.findIndex( - (element) => element.value === selectedValue + const selectedIndex = elements.findIndex((element) => + isEqual(element.value, selectedValue) ); const { isMobile } = useCurrentBreakpoint(); diff --git a/src/constants/chains/configs.ts b/src/constants/chains/configs.ts index 42fae087a..3f739934a 100644 --- a/src/constants/chains/configs.ts +++ b/src/constants/chains/configs.ts @@ -1,4 +1,5 @@ // This file is auto-generated by scripts/generate-ui-assets.ts +import { defineChain } from "viem"; import alephZeroLogo from "assets/chain-logos/aleph-zero.svg"; import alephZeroGrayscaleLogo from "assets/chain-logos/aleph-zero-grayscale.svg"; @@ -130,6 +131,11 @@ import zoraGrayscaleLogo from "assets/chain-logos/zora-grayscale.svg"; import { ReactComponent as zoraLogoSvg } from "assets/chain-logos/zora.svg"; import { ReactComponent as zoraGrayscaleLogoSvg } from "assets/chain-logos/zora-grayscale.svg"; +import hyperliquidLogo from "assets/extern-logos/hyperliquid.svg"; +import hyperliquidGrayscaleLogo from "assets/extern-logos/hyperliquid-grayscale.svg"; +import { ReactComponent as hyperliquidLogoSvg } from "assets/extern-logos/hyperliquid.svg"; +import { ReactComponent as hyperliquidGrayscaleLogoSvg } from "assets/extern-logos/hyperliquid-grayscale.svg"; + export const alephZero = { name: "Aleph Zero", fullName: "Aleph Zero", @@ -147,6 +153,30 @@ export const alephZero = { pollingInterval: 6000, }; +export const alephZero_viem = defineChain({ + id: alephZero.chainId, + name: alephZero.name, + nativeCurrency: { + name: alephZero.nativeCurrencySymbol, + symbol: alephZero.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + alephZero.rpcUrl, + alephZero.customRpcUrl ? alephZero.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: alephZero.name + " Explorer", + url: alephZero.explorerUrl, + }, + }, +}); + export const arbitrum = { name: "Arbitrum", fullName: "Arbitrum One", @@ -164,6 +194,30 @@ export const arbitrum = { pollingInterval: 1000, }; +export const arbitrum_viem = defineChain({ + id: arbitrum.chainId, + name: arbitrum.name, + nativeCurrency: { + name: arbitrum.nativeCurrencySymbol, + symbol: arbitrum.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + arbitrum.rpcUrl, + arbitrum.customRpcUrl ? arbitrum.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: arbitrum.name + " Explorer", + url: arbitrum.explorerUrl, + }, + }, +}); + export const arbitrumSepolia = { name: "Arbitrum Sepolia", fullName: "Arbitrum sepolia", @@ -181,6 +235,30 @@ export const arbitrumSepolia = { pollingInterval: 15000, }; +export const arbitrumSepolia_viem = defineChain({ + id: arbitrumSepolia.chainId, + name: arbitrumSepolia.name, + nativeCurrency: { + name: arbitrumSepolia.nativeCurrencySymbol, + symbol: arbitrumSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + arbitrumSepolia.rpcUrl, + arbitrumSepolia.customRpcUrl ? arbitrumSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: arbitrumSepolia.name + " Explorer", + url: arbitrumSepolia.explorerUrl, + }, + }, +}); + export const base = { name: "Base", fullName: "Base", @@ -197,6 +275,27 @@ export const base = { pollingInterval: 2000, }; +export const base_viem = defineChain({ + id: base.chainId, + name: base.name, + nativeCurrency: { + name: base.nativeCurrencySymbol, + symbol: base.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [base.rpcUrl, base.customRpcUrl ? base.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: base.name + " Explorer", + url: base.explorerUrl, + }, + }, +}); + export const baseSepolia = { name: "Base Sepolia", fullName: "Base sepolia", @@ -214,6 +313,30 @@ export const baseSepolia = { pollingInterval: 15000, }; +export const baseSepolia_viem = defineChain({ + id: baseSepolia.chainId, + name: baseSepolia.name, + nativeCurrency: { + name: baseSepolia.nativeCurrencySymbol, + symbol: baseSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + baseSepolia.rpcUrl, + baseSepolia.customRpcUrl ? baseSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: baseSepolia.name + " Explorer", + url: baseSepolia.explorerUrl, + }, + }, +}); + export const blast = { name: "Blast", fullName: "Blast", @@ -231,6 +354,27 @@ export const blast = { pollingInterval: 2000, }; +export const blast_viem = defineChain({ + id: blast.chainId, + name: blast.name, + nativeCurrency: { + name: blast.nativeCurrencySymbol, + symbol: blast.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [blast.rpcUrl, blast.customRpcUrl ? blast.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: blast.name + " Explorer", + url: blast.explorerUrl, + }, + }, +}); + export const blastSepolia = { name: "Blast Sepolia", fullName: "Blast sepolia", @@ -248,6 +392,30 @@ export const blastSepolia = { pollingInterval: 2000, }; +export const blastSepolia_viem = defineChain({ + id: blastSepolia.chainId, + name: blastSepolia.name, + nativeCurrency: { + name: blastSepolia.nativeCurrencySymbol, + symbol: blastSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + blastSepolia.rpcUrl, + blastSepolia.customRpcUrl ? blastSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: blastSepolia.name + " Explorer", + url: blastSepolia.explorerUrl, + }, + }, +}); + export const ink = { name: "Ink", fullName: "Ink", @@ -264,6 +432,27 @@ export const ink = { pollingInterval: 1000, }; +export const ink_viem = defineChain({ + id: ink.chainId, + name: ink.name, + nativeCurrency: { + name: ink.nativeCurrencySymbol, + symbol: ink.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ink.rpcUrl, ink.customRpcUrl ? ink.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: ink.name + " Explorer", + url: ink.explorerUrl, + }, + }, +}); + export const lensSepolia = { name: "Lens Sepolia", fullName: "Lens sepolia", @@ -281,6 +470,30 @@ export const lensSepolia = { pollingInterval: 1000, }; +export const lensSepolia_viem = defineChain({ + id: lensSepolia.chainId, + name: lensSepolia.name, + nativeCurrency: { + name: lensSepolia.nativeCurrencySymbol, + symbol: lensSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + lensSepolia.rpcUrl, + lensSepolia.customRpcUrl ? lensSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: lensSepolia.name + " Explorer", + url: lensSepolia.explorerUrl, + }, + }, +}); + export const linea = { name: "Linea", fullName: "Linea", @@ -298,6 +511,27 @@ export const linea = { pollingInterval: 2000, }; +export const linea_viem = defineChain({ + id: linea.chainId, + name: linea.name, + nativeCurrency: { + name: linea.nativeCurrencySymbol, + symbol: linea.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [linea.rpcUrl, linea.customRpcUrl ? linea.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: linea.name + " Explorer", + url: linea.explorerUrl, + }, + }, +}); + export const lisk = { name: "Lisk", fullName: "Lisk", @@ -314,6 +548,27 @@ export const lisk = { pollingInterval: 2000, }; +export const lisk_viem = defineChain({ + id: lisk.chainId, + name: lisk.name, + nativeCurrency: { + name: lisk.nativeCurrencySymbol, + symbol: lisk.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [lisk.rpcUrl, lisk.customRpcUrl ? lisk.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: lisk.name + " Explorer", + url: lisk.explorerUrl, + }, + }, +}); + export const liskSepolia = { name: "Lisk Sepolia", fullName: "Lisk sepolia", @@ -331,6 +586,30 @@ export const liskSepolia = { pollingInterval: 15000, }; +export const liskSepolia_viem = defineChain({ + id: liskSepolia.chainId, + name: liskSepolia.name, + nativeCurrency: { + name: liskSepolia.nativeCurrencySymbol, + symbol: liskSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + liskSepolia.rpcUrl, + liskSepolia.customRpcUrl ? liskSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: liskSepolia.name + " Explorer", + url: liskSepolia.explorerUrl, + }, + }, +}); + export const ethereum = { name: "Ethereum", fullName: "Ethereum Mainnet", @@ -348,6 +627,30 @@ export const ethereum = { pollingInterval: 12000, }; +export const ethereum_viem = defineChain({ + id: ethereum.chainId, + name: ethereum.name, + nativeCurrency: { + name: ethereum.nativeCurrencySymbol, + symbol: ethereum.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + ethereum.rpcUrl, + ethereum.customRpcUrl ? ethereum.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: ethereum.name + " Explorer", + url: ethereum.explorerUrl, + }, + }, +}); + export const mode = { name: "Mode", fullName: "Mode", @@ -364,6 +667,27 @@ export const mode = { pollingInterval: 2000, }; +export const mode_viem = defineChain({ + id: mode.chainId, + name: mode.name, + nativeCurrency: { + name: mode.nativeCurrencySymbol, + symbol: mode.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [mode.rpcUrl, mode.customRpcUrl ? mode.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: mode.name + " Explorer", + url: mode.explorerUrl, + }, + }, +}); + export const modeSepolia = { name: "Mode Sepolia", fullName: "Mode sepolia", @@ -381,6 +705,30 @@ export const modeSepolia = { pollingInterval: 15000, }; +export const modeSepolia_viem = defineChain({ + id: modeSepolia.chainId, + name: modeSepolia.name, + nativeCurrency: { + name: modeSepolia.nativeCurrencySymbol, + symbol: modeSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + modeSepolia.rpcUrl, + modeSepolia.customRpcUrl ? modeSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: modeSepolia.name + " Explorer", + url: modeSepolia.explorerUrl, + }, + }, +}); + export const optimism = { name: "Optimism", fullName: "Optimism", @@ -398,6 +746,30 @@ export const optimism = { pollingInterval: 2000, }; +export const optimism_viem = defineChain({ + id: optimism.chainId, + name: optimism.name, + nativeCurrency: { + name: optimism.nativeCurrencySymbol, + symbol: optimism.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + optimism.rpcUrl, + optimism.customRpcUrl ? optimism.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: optimism.name + " Explorer", + url: optimism.explorerUrl, + }, + }, +}); + export const optimismSepolia = { name: "Optimism Sepolia", fullName: "Optimism sepolia", @@ -415,6 +787,30 @@ export const optimismSepolia = { pollingInterval: 15000, }; +export const optimismSepolia_viem = defineChain({ + id: optimismSepolia.chainId, + name: optimismSepolia.name, + nativeCurrency: { + name: optimismSepolia.nativeCurrencySymbol, + symbol: optimismSepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + optimismSepolia.rpcUrl, + optimismSepolia.customRpcUrl ? optimismSepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: optimismSepolia.name + " Explorer", + url: optimismSepolia.explorerUrl, + }, + }, +}); + export const polygon = { name: "Polygon", fullName: "Polygon Network", @@ -432,6 +828,30 @@ export const polygon = { pollingInterval: 5000, }; +export const polygon_viem = defineChain({ + id: polygon.chainId, + name: polygon.name, + nativeCurrency: { + name: polygon.nativeCurrencySymbol, + symbol: polygon.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + polygon.rpcUrl, + polygon.customRpcUrl ? polygon.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: polygon.name + " Explorer", + url: polygon.explorerUrl, + }, + }, +}); + export const polygonAmoy = { name: "Polygon Amoy", fullName: "Polygon Amoy", @@ -449,6 +869,30 @@ export const polygonAmoy = { pollingInterval: 15000, }; +export const polygonAmoy_viem = defineChain({ + id: polygonAmoy.chainId, + name: polygonAmoy.name, + nativeCurrency: { + name: polygonAmoy.nativeCurrencySymbol, + symbol: polygonAmoy.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + polygonAmoy.rpcUrl, + polygonAmoy.customRpcUrl ? polygonAmoy.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: polygonAmoy.name + " Explorer", + url: polygonAmoy.explorerUrl, + }, + }, +}); + export const redstone = { name: "Redstone", fullName: "Redstone", @@ -466,6 +910,30 @@ export const redstone = { pollingInterval: 2000, }; +export const redstone_viem = defineChain({ + id: redstone.chainId, + name: redstone.name, + nativeCurrency: { + name: redstone.nativeCurrencySymbol, + symbol: redstone.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + redstone.rpcUrl, + redstone.customRpcUrl ? redstone.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: redstone.name + " Explorer", + url: redstone.explorerUrl, + }, + }, +}); + export const scroll = { name: "Scroll", fullName: "Scroll", @@ -483,6 +951,30 @@ export const scroll = { pollingInterval: 3000, }; +export const scroll_viem = defineChain({ + id: scroll.chainId, + name: scroll.name, + nativeCurrency: { + name: scroll.nativeCurrencySymbol, + symbol: scroll.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + scroll.rpcUrl, + scroll.customRpcUrl ? scroll.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: scroll.name + " Explorer", + url: scroll.explorerUrl, + }, + }, +}); + export const sepolia = { name: "Sepolia", fullName: "Sepolia", @@ -500,9 +992,33 @@ export const sepolia = { pollingInterval: 15000, }; +export const sepolia_viem = defineChain({ + id: sepolia.chainId, + name: sepolia.name, + nativeCurrency: { + name: sepolia.nativeCurrencySymbol, + symbol: sepolia.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + sepolia.rpcUrl, + sepolia.customRpcUrl ? sepolia.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: sepolia.name + " Explorer", + url: sepolia.explorerUrl, + }, + }, +}); + export const soneium = { - name: "soneium", - fullName: "soneium", + name: "Soneium", + fullName: "Soneium", chainId: 1868, logoURI: soneiumLogo, grayscaleLogoURI: soneiumGrayscaleLogo, @@ -517,6 +1033,30 @@ export const soneium = { pollingInterval: 2000, }; +export const soneium_viem = defineChain({ + id: soneium.chainId, + name: soneium.name, + nativeCurrency: { + name: soneium.nativeCurrencySymbol, + symbol: soneium.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + soneium.rpcUrl, + soneium.customRpcUrl ? soneium.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: soneium.name + " Explorer", + url: soneium.explorerUrl, + }, + }, +}); + export const worldChain = { name: "World Chain", fullName: "World Chain", @@ -534,6 +1074,30 @@ export const worldChain = { pollingInterval: 2000, }; +export const worldChain_viem = defineChain({ + id: worldChain.chainId, + name: worldChain.name, + nativeCurrency: { + name: worldChain.nativeCurrencySymbol, + symbol: worldChain.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + worldChain.rpcUrl, + worldChain.customRpcUrl ? worldChain.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: worldChain.name + " Explorer", + url: worldChain.explorerUrl, + }, + }, +}); + export const zkSync = { name: "zkSync", fullName: "zkSync Era", @@ -551,6 +1115,30 @@ export const zkSync = { pollingInterval: 2000, }; +export const zkSync_viem = defineChain({ + id: zkSync.chainId, + name: zkSync.name, + nativeCurrency: { + name: zkSync.nativeCurrencySymbol, + symbol: zkSync.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [ + zkSync.rpcUrl, + zkSync.customRpcUrl ? zkSync.customRpcUrl : [], + ].flat(), + }, + }, + blockExplorers: { + default: { + name: zkSync.name + " Explorer", + url: zkSync.explorerUrl, + }, + }, +}); + export const zora = { name: "Zora", fullName: "Zora", @@ -567,6 +1155,40 @@ export const zora = { pollingInterval: 2000, }; +export const zora_viem = defineChain({ + id: zora.chainId, + name: zora.name, + nativeCurrency: { + name: zora.nativeCurrencySymbol, + symbol: zora.nativeCurrencySymbol, + decimals: 18, + }, + rpcUrls: { + default: { + http: [zora.rpcUrl, zora.customRpcUrl ? zora.customRpcUrl : []].flat(), + }, + }, + blockExplorers: { + default: { + name: zora.name + " Explorer", + url: zora.explorerUrl, + }, + }, +}); + +export const hyperliquid = { + name: "Hyperliquid", + fullName: "Hyperliquid", + projectId: "hyperliquid", + logoURI: hyperliquidLogo, + grayscaleLogoURI: hyperliquidGrayscaleLogo, + logoSvg: hyperliquidLogoSvg, + grayscaleLogoSvg: hyperliquidGrayscaleLogoSvg, + explorerUrl: "https://arbiscan.io", + rpcUrl: "https://arbitrum.publicnode.com", + intermediaryChain: 42161, +}; + export const chainConfigs = [ alephZero, arbitrum, @@ -601,3 +1223,40 @@ export const chainConfigs = [ }, {} as Record ); + +export const chains_viem = [ + alephZero_viem, + arbitrum_viem, + arbitrumSepolia_viem, + base_viem, + baseSepolia_viem, + blast_viem, + blastSepolia_viem, + ink_viem, + lensSepolia_viem, + linea_viem, + lisk_viem, + liskSepolia_viem, + ethereum_viem, + mode_viem, + modeSepolia_viem, + optimism_viem, + optimismSepolia_viem, + polygon_viem, + polygonAmoy_viem, + redstone_viem, + scroll_viem, + sepolia_viem, + soneium_viem, + worldChain_viem, + zkSync_viem, + zora_viem, +] as const; + +export const externConfigs = [hyperliquid].reduce( + (acc, extern) => { + acc[extern.projectId] = extern; + return acc; + }, + {} as Record +); diff --git a/src/data/routes_11155111_0x14224e63716afAcE30C9a417E0542281869f7d9e.json b/src/data/routes_11155111_0x14224e63716afAcE30C9a417E0542281869f7d9e.json index ccdb4e69f..4637fedb7 100644 --- a/src/data/routes_11155111_0x14224e63716afAcE30C9a417E0542281869f7d9e.json +++ b/src/data/routes_11155111_0x14224e63716afAcE30C9a417E0542281869f7d9e.json @@ -1518,7 +1518,7 @@ "fromSpokeAddress": "0x6A0a7f39530923911832Dd60667CE5da5449967B", "fromTokenSymbol": "GRASS", "toTokenSymbol": "GRASS", - "isNative": false, + "isNative": true, "l1TokenAddress": "0x2Be68B15c693D3b5747F9F0D49D30A2E81BAA2Df" }, { diff --git a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json index 60e6f6aca..5ceacc128 100644 --- a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json +++ b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json @@ -1011,6 +1011,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 1, + "toChain": 42161, + "fromTokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5", + "fromTokenSymbol": "USDC", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 10, "toChain": 1, @@ -1979,6 +1991,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 10, + "toChain": 42161, + "fromTokenAddress": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x6f26Bf09B1C792e3228e5467807a900A503c0281", + "fromTokenSymbol": "USDC", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 137, "toChain": 1, @@ -2760,6 +2784,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 137, + "toChain": 42161, + "fromTokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096", + "fromTokenSymbol": "USDC", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 42161, "toChain": 1, @@ -4421,6 +4457,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 324, + "toChain": 42161, + "fromTokenAddress": "0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0xE0B015E54d54fc84a6cB9B666099c46adE9335FF", + "fromTokenSymbol": "USDC.e", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 8453, "toChain": 1, @@ -5114,6 +5162,18 @@ "isNative": true, "l1TokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" }, + { + "fromChain": 8453, + "toChain": 42161, + "fromTokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "fromTokenSymbol": "USDC", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 59144, "toChain": 1, @@ -5906,6 +5966,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 59144, + "toChain": 42161, + "fromTokenAddress": "0x176211869cA2b568f2A7D4EE941E073a821EE1ff", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75", + "fromTokenSymbol": "USDC.e", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 34443, "toChain": 1, @@ -6621,6 +6693,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 34443, + "toChain": 42161, + "fromTokenAddress": "0xd988097fb8612cc24eeC14542bC03424c656005f", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "fromTokenSymbol": "USDC.e", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 81457, "toChain": 1, @@ -8502,6 +8586,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 534352, + "toChain": 42161, + "fromTokenAddress": "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "fromTokenSymbol": "USDC", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 690, "toChain": 1, @@ -10064,6 +10160,18 @@ "isNative": false, "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, + { + "fromChain": 480, + "toChain": 42161, + "fromTokenAddress": "0x79A02482A880bCE3F13e09Da970dC34db4CD24d1", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "fromTokenSymbol": "USDC.e", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" + }, { "fromChain": 41455, "toChain": 1, @@ -11196,6 +11304,18 @@ "toTokenSymbol": "ETH", "isNative": true, "l1TokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + }, + { + "fromChain": 1868, + "toChain": 42161, + "fromTokenAddress": "0xbA9986D2381edf1DA03B0B9c1f8b00dc4AacC369", + "toTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "fromSpokeAddress": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "fromTokenSymbol": "USDC.e", + "toTokenSymbol": "USDC", + "isNative": false, + "l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "externalProjectId": "hyperliquid" } ], "swapRoutes": [ diff --git a/src/hooks/useAvailableRemainingRewards.ts b/src/hooks/useAvailableRemainingRewards.ts new file mode 100644 index 000000000..5afe5b0ba --- /dev/null +++ b/src/hooks/useAvailableRemainingRewards.ts @@ -0,0 +1,41 @@ +import { useQuery } from "@tanstack/react-query"; +import axios from "axios"; +import { BigNumber } from "ethers"; +import { + rewardProgramTypes, + defaultRefetchInterval, + rewardsApiUrl, + getToken, + parseUnits, + isDefined, +} from "utils"; + +export function useAvailableRemainingRewards(program?: rewardProgramTypes) { + const { data } = useQuery({ + queryKey: [program] as [rewardProgramTypes], + enabled: isDefined(program), + refetchInterval: defaultRefetchInterval, + queryFn: ({ queryKey: key }) => + key[0] === "op-rebates" + ? resolveCurrentDispensedOpRewards() + : Promise.resolve(undefined), + }); + return { + ...data, + areRewardTokensAvailable: (program && data?.areTokensAvailable) ?? false, + }; +} + +async function resolveCurrentDispensedOpRewards() { + const { data } = await axios.get<{ + totalTokenAmount: string; + }>(`${rewardsApiUrl}/rewards/op-rebates/stats`); + const opToken = getToken("OP"); + const existingTokens = BigNumber.from(data.totalTokenAmount); + const tokenCeiling = parseUnits("750000", opToken.decimals); // 750K tokens + + return { + totalTokensDispensed: existingTokens, + areTokensAvailable: existingTokens.lt(tokenCeiling), + }; +} diff --git a/src/hooks/useBridgeFees.ts b/src/hooks/useBridgeFees.ts index d80615bc4..f3188f046 100644 --- a/src/hooks/useBridgeFees.ts +++ b/src/hooks/useBridgeFees.ts @@ -1,6 +1,11 @@ import { useQuery } from "@tanstack/react-query"; import { BigNumber, ethers } from "ethers"; -import { bridgeFeesQueryKey, getBridgeFees, ChainId } from "utils"; +import { + bridgeFeesQueryKey, + getBridgeFees, + ChainId, + getBridgeFeesWithExternalProjectId, +} from "utils"; import { AxiosError } from "axios"; /** @@ -10,6 +15,8 @@ import { AxiosError } from "axios"; * @param toChainId The chain Id of the receiving chain, its timestamp will be used to calculate the fees. * @param inputTokenSymbol - The input token symbol to check bridge fees for. * @param outputTokenSymbol - The output token symbol to check bridge fees for. + * @param externalProjectId - The external project id to check bridge fees for. + * @param recipientAddress - The recipient address to check bridge fees for. * @returns The bridge fees for the given amount and token symbol and the UseQueryResult object. */ export function useBridgeFees( @@ -18,6 +25,7 @@ export function useBridgeFees( toChainId: ChainId, inputTokenSymbol: string, outputTokenSymbol: string, + externalProjectId?: string, recipientAddress?: string ) { const queryKey = bridgeFeesQueryKey( @@ -25,7 +33,9 @@ export function useBridgeFees( inputTokenSymbol, outputTokenSymbol, fromChainId, - toChainId + toChainId, + externalProjectId, + recipientAddress ); const { data: fees, ...delegated } = useQuery({ queryKey, @@ -37,16 +47,22 @@ export function useBridgeFees( amountToQuery, fromChainIdToQuery, toChainIdToQuery, + externalProjectIdToQuery, + recipientAddressToQuery, ] = queryKey; - return getBridgeFees({ + const feeArgs = { amount: BigNumber.from(amountToQuery), inputTokenSymbol: inputTokenSymbolToQuery, outputTokenSymbol: outputTokenSymbolToQuery, toChainId: toChainIdToQuery, fromChainId: fromChainIdToQuery, - recipientAddress, - }); + recipientAddress: recipientAddressToQuery, + }; + + return externalProjectIdToQuery + ? getBridgeFeesWithExternalProjectId(externalProjectIdToQuery, feeArgs) + : getBridgeFees(feeArgs); }, enabled: Boolean(amount.gt(0)), refetchInterval: 5000, diff --git a/src/utils/amplitude.ts b/src/utils/amplitude.ts index d82646920..17a0735b3 100644 --- a/src/utils/amplitude.ts +++ b/src/utils/amplitude.ts @@ -64,6 +64,8 @@ export const pageLookup: Record< ), }; +export type ExternalProjectId = "hyper-liquid"; + export function getPageValue() { // Resolve the sanitized pathname const path = getSanitizedPathname(); @@ -144,16 +146,27 @@ export function trackFromChainChanged(chainId: ChainId, isDefault?: boolean) { }); } -export function trackToChainChanged(chainId: ChainId, isDefault?: boolean) { +export function trackToChainChanged( + chainId: ChainId, + externalProjectId?: ExternalProjectId, + isDefault?: boolean +) { if (Number.isNaN(chainId)) return Promise.resolve(); const chain = getChainInfo(chainId); return ampli.toChainSelected({ toChainId: chain.chainId.toString(), chainName: chain.name, + externalProjectId, default: isDefault, }); } +export function externalProjectNameToId( + projectName?: string +): ExternalProjectId | undefined { + return projectName === "hyperliquid" ? "hyper-liquid" : undefined; +} + export function trackQuickSwap( section: QuickSwapButtonClickedProperties["section"] ) { @@ -341,7 +354,8 @@ export function generateTransferQuote( export function generateTransferSubmitted( quote: TransferQuoteReceivedProperties, referralProgramAddress: string, - initialQuoteTime: number + initialQuoteTime: number, + externalProjectId?: string ): TransferSubmittedProperties { const { fromAddress, toAddress } = getConfig().getFromToAddressesBySymbol( quote.tokenSymbol, @@ -357,6 +371,7 @@ export function generateTransferSubmitted( ), transferTimestamp: String(Date.now()), toTokenAddress: toAddress, + externalProjectId: externalProjectNameToId(externalProjectId), }; } @@ -365,7 +380,8 @@ export function generateTransferSigned( quote: TransferQuoteReceivedProperties, referralProgramAddress: string, initialSubmissionTime: number, - txHash: string + txHash: string, + externalProjectId?: string ): TransferSignedProperties { const { fromAddress, toAddress } = getConfig().getFromToAddressesBySymbol( quote.tokenSymbol, @@ -381,6 +397,7 @@ export function generateTransferSigned( ), toTokenAddress: toAddress, transactionHash: txHash, + externalProjectId: externalProjectNameToId(externalProjectId), }; } diff --git a/src/utils/bridge.ts b/src/utils/bridge.ts index 0f4387321..b8c700de9 100644 --- a/src/utils/bridge.ts +++ b/src/utils/bridge.ts @@ -1,17 +1,25 @@ -import { ethers, BigNumber } from "ethers"; +import { ethers, BigNumber, utils } from "ethers"; import { + acrossPlusMulticallHandler, ChainId, fixedPointAdjustment, + getToken, + hyperLiquidBridge2Address, referrerDelimiterHex, } from "./constants"; import { DOMAIN_CALLDATA_DELIMITER, tagAddress, tagHex } from "./format"; import { getProvider } from "./providers"; -import { getConfig, isContractDeployedToAddress } from "utils"; +import { + generateHyperLiquidPayload, + getConfig, + isContractDeployedToAddress, +} from "utils"; import getApiEndpoint from "./serverless-api"; import { BridgeLimitInterface } from "./serverless-api/types"; import { DepositNetworkMismatchProperties } from "ampli"; import { SwapQuoteApiResponse } from "./serverless-api/prod/swap-quote"; import { SpokePool, SpokePoolVerifier } from "./typechain"; +import { CHAIN_IDs } from "@across-protocol/constants"; export type Fee = { total: ethers.BigNumber; @@ -41,12 +49,75 @@ type GetBridgeFeesArgs = { fromChainId: ChainId; toChainId: ChainId; recipientAddress?: string; + message?: string; }; export type GetBridgeFeesResult = BridgeFees & { isAmountTooLow: boolean; }; +export async function getBridgeFeesWithExternalProjectId( + externalProjectId: string, + args: GetBridgeFeesArgs +) { + let message = undefined; + let recipientAddress = args.recipientAddress; + + if (externalProjectId === "hyperliquid") { + const arbitrumProvider = getProvider(CHAIN_IDs.ARBITRUM); + const wallet = ethers.Wallet.createRandom(); + const signer = new ethers.Wallet(wallet.privateKey, arbitrumProvider); + const recipient = await signer.getAddress(); + + // Build the payload + const hyperLiquidPayload = await generateHyperLiquidPayload( + signer, + recipient, + args.amount + ); + // Create a txn calldata for transfering amount to recipient + const erc20Interface = new utils.Interface([ + "function transfer(address to, uint256 amount) returns (bool)", + ]); + + const transferCalldata = erc20Interface.encodeFunctionData("transfer", [ + recipient, + args.amount, + ]); + + // Encode Instructions struct directly + message = utils.defaultAbiCoder.encode( + [ + "tuple(tuple(address target, bytes callData, uint256 value)[] calls, address fallbackRecipient)", + ], + [ + { + calls: [ + { + target: getToken("USDC").addresses![CHAIN_IDs.ARBITRUM], + callData: transferCalldata, + value: 0, + }, + { + target: hyperLiquidBridge2Address, + callData: hyperLiquidPayload, + value: 0, + }, + ], + fallbackRecipient: recipient, + }, + ] + ); + recipientAddress = acrossPlusMulticallHandler[args.toChainId]; + } + + return getBridgeFees({ + ...args, + recipientAddress, + message, + }); +} + /** * * @param amount - amount to bridge @@ -63,6 +134,7 @@ export async function getBridgeFees({ fromChainId, toChainId, recipientAddress, + message, }: GetBridgeFeesArgs): Promise { const timeBeforeRequests = Date.now(); const { @@ -84,7 +156,8 @@ export async function getBridgeFees({ getConfig().getTokenInfoBySymbol(toChainId, outputTokenSymbol).address, toChainId, fromChainId, - recipientAddress + recipientAddress, + message ); const timeAfterRequests = Date.now(); diff --git a/src/utils/config.ts b/src/utils/config.ts index ba1b0449c..d45f85044 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -342,7 +342,10 @@ export class ConfigClient { address: token.addresses?.[chainId || constants.hubPoolChainId] || token.mainnetAddress!, - isNative: token.symbol === "ETH", + isNative: chainId + ? constants.chainInfoTable[chainId].nativeCurrencySymbol === + token.symbol + : token.symbol === "ETH", }; }); } diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 8bd6729e2..6488ee896 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -32,6 +32,7 @@ import { similarTokensMap, } from "../constants/tokens"; import { ExternalLPTokenList, externalLPsForStaking } from "../constants/pools"; +import { externConfigs } from "../constants/chains/configs"; export type { TokenInfo, @@ -233,7 +234,16 @@ export function getChainInfo(chainId: number): ChainInfo { export const chainEndpointToId = Object.fromEntries( chainInfoList.map((chain) => { - return [chain.name.toLowerCase().replaceAll(" ", ""), chain.chainId]; + const projects = Object.values(externConfigs).filter( + ({ intermediaryChain }) => intermediaryChain === chain.chainId + ); + return [ + chain.name.toLowerCase().replaceAll(" ", ""), + { + chainId: chain.chainId, + associatedProjectIds: projects.map(({ projectId }) => projectId), + }, + ]; }, []) ); @@ -296,6 +306,7 @@ const RouteSS = superstruct.object({ toTokenSymbol: superstruct.string(), isNative: superstruct.boolean(), l1TokenAddress: superstruct.string(), + externalProjectId: superstruct.optional(superstruct.string()), }); const RoutesSS = superstruct.array(RouteSS); const SwapRouteSS = superstruct.assign( @@ -552,3 +563,10 @@ export const defaultSwapSlippage = Number( export const indexerApiBaseUrl = process.env.REACT_APP_INDEXER_BASE_URL || undefined; + +export const hyperLiquidBridge2Address = + "0x2Df1c51E09aECF9cacB7bc98cB1742757f163dF7"; + +export const acrossPlusMulticallHandler: Record = { + [CHAIN_IDs.ARBITRUM]: "0x924a9f036260DdD5808007E1AA95f08eD08aA569", +}; diff --git a/src/utils/hyperliquid.ts b/src/utils/hyperliquid.ts new file mode 100644 index 000000000..9f3cedf61 --- /dev/null +++ b/src/utils/hyperliquid.ts @@ -0,0 +1,108 @@ +import { Deposit } from "hooks/useDeposits"; +import { CHAIN_IDs } from "@across-protocol/constants"; +import { BigNumber, Contract, providers, Signer, utils } from "ethers"; +import { compareAddressesSimple } from "./sdk"; +import { getToken, hyperLiquidBridge2Address } from "./constants"; + +export function isHyperLiquidBoundDeposit(deposit: Deposit) { + if (deposit.destinationChainId !== CHAIN_IDs.ARBITRUM || !deposit.message) { + return false; + } + + try { + // Try to decode the message as Instructions struct + const decoded = utils.defaultAbiCoder.decode( + [ + "tuple(tuple(address target, bytes callData, uint256 value)[] calls, address fallbackRecipient)", + ], + deposit.message + ); + + // Check if it has exactly 2 calls + if (decoded[0].calls.length !== 2) { + return false; + } + + // Check if second call is to HyperLiquid Bridge2 contract + return compareAddressesSimple( + decoded[0].calls[1].target, + hyperLiquidBridge2Address + ); + } catch { + return false; + } +} + +/** + * Creates a payload that will be ingested by Bridge2/batchedDepositWithPermit of a single deposit + */ +export async function generateHyperLiquidPayload( + signer: Signer, + recipient: string, + amount: BigNumber +) { + const source = await signer.getAddress(); + + if (!compareAddressesSimple(source, recipient)) { + throw new Error("Source and recipient must be the same"); + } + + const timestamp = Date.now(); + const deadline = Math.floor(timestamp / 1000) + 3600; + + // Create USDC contract interface + const usdcInterface = new utils.Interface([ + "function nonces(address owner) view returns (uint256)", + "function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)", + ]); + + const usdcContract = new Contract( + getToken("USDC").addresses![CHAIN_IDs.ARBITRUM], + usdcInterface, + signer + ); + + // USDC permit signature with verified domain parameters + const usdcDomain = { + name: "USD Coin", + version: "2", + chainId: CHAIN_IDs.ARBITRUM, + verifyingContract: getToken("USDC").addresses![CHAIN_IDs.ARBITRUM]!, + }; + + const permitTypes = { + Permit: [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ], + }; + + const permitValue = { + owner: source, + spender: hyperLiquidBridge2Address, + value: amount, + nonce: await usdcContract.nonces(source), + deadline, + }; + + const permitSignature = await ( + signer as providers.JsonRpcSigner + )._signTypedData(usdcDomain, permitTypes, permitValue); + const { r, s, v } = utils.splitSignature(permitSignature); + + const deposit = { + user: source, + usd: amount, + deadline, + signature: { r: BigNumber.from(r), s: BigNumber.from(s), v }, + }; + + const iface = new utils.Interface([ + "function batchedDepositWithPermit(tuple(address user, uint64 usd, uint64 deadline, tuple(uint256 r, uint256 s, uint8 v) signature)[] deposits)", + ]); + + return iface.encodeFunctionData("batchedDepositWithPermit", [[deposit]]); +} diff --git a/src/utils/index.ts b/src/utils/index.ts index 271e0c6c3..9031b1b66 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -22,3 +22,4 @@ export * from "./types"; export * from "./network"; export * from "./url"; export * from "./sdk"; +export * from "./hyperliquid"; diff --git a/src/utils/query-keys.ts b/src/utils/query-keys.ts index d9a873b4e..af1655493 100644 --- a/src/utils/query-keys.ts +++ b/src/utils/query-keys.ts @@ -31,6 +31,8 @@ export function balanceQueryKey( * @param amount The amount to check bridge fees for. * @param fromChainId The origin chain of this bridge action * @param toChainId The destination chain of this bridge action + * @param externalProjectId The external project id to check bridge fees for. + * @param recipientAddress The recipient address to check bridge fees for. * @returns An array of query keys for @tanstack/react-query `useQuery` hook. */ export function bridgeFeesQueryKey( @@ -38,7 +40,9 @@ export function bridgeFeesQueryKey( inputToken: string, outputToken: string, fromChainId: ChainId, - toChainId: ChainId + toChainId: ChainId, + externalProjectId?: string, + recipientAddress?: string ) { return [ "bridgeFees", @@ -47,6 +51,8 @@ export function bridgeFeesQueryKey( amount.toString(), fromChainId, toChainId, + externalProjectId, + recipientAddress, ] as const; } diff --git a/src/utils/sdk.ts b/src/utils/sdk.ts index 955b346b3..945add20c 100644 --- a/src/utils/sdk.ts +++ b/src/utils/sdk.ts @@ -12,6 +12,7 @@ export { mapAsync } from "@across-protocol/sdk/dist/esm/utils/ArrayUtils"; export { getCurrentTime } from "@across-protocol/sdk/dist/esm/utils/TimeUtils"; export { isBridgedUsdc } from "@across-protocol/sdk/dist/esm/utils/TokenUtils"; export { BRIDGED_USDC_SYMBOLS } from "@across-protocol/sdk/dist/esm/constants"; +export { compareAddressesSimple } from "@across-protocol/sdk/dist/esm/utils/AddressUtils"; export { getNativeTokenSymbol, chainIsLens, diff --git a/src/utils/serverless-api/mocked/suggested-fees.mocked.ts b/src/utils/serverless-api/mocked/suggested-fees.mocked.ts index b02d76bfe..36b5bd238 100644 --- a/src/utils/serverless-api/mocked/suggested-fees.mocked.ts +++ b/src/utils/serverless-api/mocked/suggested-fees.mocked.ts @@ -17,7 +17,8 @@ export async function suggestedFeesMockedApiCall( _outputToken: string, _toChainid: ChainId, _fromChainid: ChainId, - _recipientAddress?: string + _recipientAddress?: string, + _message?: string ): Promise { const token = getTokenByAddress(_inputToken); const decimals = token?.decimals ?? 18; diff --git a/src/utils/serverless-api/prod/suggested-fees.prod.ts b/src/utils/serverless-api/prod/suggested-fees.prod.ts index f4f7fa4b5..a58f2156e 100644 --- a/src/utils/serverless-api/prod/suggested-fees.prod.ts +++ b/src/utils/serverless-api/prod/suggested-fees.prod.ts @@ -17,7 +17,8 @@ export async function suggestedFeesApiCall( outputToken: string, toChainid: ChainId, fromChainid: ChainId, - recipientAddress?: string + recipientAddress?: string, + message?: string ): Promise { const response = await axios.get(`${vercelApiBaseUrl}/api/suggested-fees`, { params: { @@ -28,6 +29,7 @@ export async function suggestedFeesApiCall( recipient: recipientAddress, amount: amount.toString(), skipAmountLimit: true, + message, }, }); const result = response.data; diff --git a/src/utils/serverless-api/types.ts b/src/utils/serverless-api/types.ts index c85d4b2d5..ae3e398b3 100644 --- a/src/utils/serverless-api/types.ts +++ b/src/utils/serverless-api/types.ts @@ -67,7 +67,8 @@ export type SuggestedApiFeeType = ( outputToken: string, toChainid: ChainId, fromChainid: ChainId, - recipientAddress?: string + recipientAddress?: string, + message?: string ) => Promise; export type RetrieveLinkedWalletType = ( diff --git a/src/utils/url.ts b/src/utils/url.ts index 12fe07011..8f5653d89 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -3,17 +3,20 @@ export function getBridgeUrlWithQueryParams({ toChainId, inputTokenSymbol, outputTokenSymbol, + externalProjectId, }: { fromChainId: number; toChainId: number; inputTokenSymbol: string; outputTokenSymbol?: string; + externalProjectId?: string; }) { const cleanParams = Object.entries({ from: fromChainId.toString(), to: toChainId.toString(), inputToken: inputTokenSymbol, outputToken: outputTokenSymbol, + externalProjectId, }).reduce((acc, [key, value]) => { if (value) { return { ...acc, [key]: value }; diff --git a/src/views/Bridge/Bridge.tsx b/src/views/Bridge/Bridge.tsx index c6f3baa23..ebb325945 100644 --- a/src/views/Bridge/Bridge.tsx +++ b/src/views/Bridge/Bridge.tsx @@ -40,7 +40,6 @@ const Bridge = () => { handleSetNewSlippage, isQuoteLoading, } = useBridge(); - return ( <> {toAccount && ( diff --git a/src/views/Bridge/components/BridgeForm.tsx b/src/views/Bridge/components/BridgeForm.tsx index f944570e6..419c77054 100644 --- a/src/views/Bridge/components/BridgeForm.tsx +++ b/src/views/Bridge/components/BridgeForm.tsx @@ -47,8 +47,8 @@ export type BridgeFormProps = { onClickMaxBalance: VoidHandler; onSelectInputToken: (token: string) => void; onSelectOutputToken: (token: string) => void; - onSelectFromChain: (chainId: number) => void; - onSelectToChain: (chainId: number) => void; + onSelectFromChain: (chainId: number, externalProjectId?: string) => void; + onSelectToChain: (chainId: number, externalProjectId?: string) => void; onClickQuickSwap: VoidHandler; onClickChainSwitch: VoidHandler; onClickActionButton: VoidHandler; @@ -219,7 +219,7 @@ const BridgeForm = ({ /> - {toAccount && ( + {toAccount && selectedRoute.externalProjectId !== "hyperliquid" && ( void; + onSelectChain: (chainId: number, externalProjectId?: string) => void; }; export function ChainSelector({ @@ -33,51 +34,29 @@ export function ChainSelector({ }: Props) { const isFrom = fromOrTo === "from"; const { fromChain, toChain, fromTokenSymbol, toTokenSymbol } = selectedRoute; + const selectedChain = getChainInfo(isFrom ? fromChain : toChain); const tokenInfo = getToken(isFrom ? fromTokenSymbol : toTokenSymbol); - const allChains = getSupportedChains(fromOrTo); + + // Get supported chains and filter based on external projects + const availableChains = filterAvailableChains(fromOrTo, selectedRoute); const { account, isConnected } = useConnection(); const { balances } = useBalanceBySymbolPerChain({ tokenSymbol: tokenInfo.symbol, - chainIds: allChains.map((c) => c.chainId), + chainIds: availableChains.map((c) => c.chainId), account, }); - const sortOrder = useMemo(() => { - const chains = allChains.map((c) => ({ - ...c, - balance: balances?.[c.chainId] ?? BigNumber.from(0), - disabled: false, - })); - if (!balances || !isConnected || !isFrom) { - return chains; - } else { - return chains - .map((c) => ({ - ...c, - disabled: c.balance.eq(0), - })) - .sort((a, b) => { - const aBalance = a.balance; - const bBalance = b.balance; - if (aBalance === undefined && bBalance === undefined) { - return 0; - } else if (aBalance === undefined) { - return 1; - } else if (bBalance === undefined) { - return -1; - } else { - return aBalance.lt(bBalance) ? 1 : -1; - } - }); - } - }, [allChains, balances, isConnected, isFrom]); + const sortedChains = useMemo( + () => sortChains(availableChains, balances, isConnected, isFrom), + [availableChains, balances, isConnected, isFrom] + ); return ( - - elements={sortOrder.map((chain) => ({ - value: chain.chainId, + + elements={sortedChains.map((chain) => ({ + value: { chainId: chain.chainId, externalProjectId: chain.projectId }, element: , suffix: isConnected && isFrom ? ( @@ -98,8 +77,13 @@ export function ChainSelector({ /> ) : undefined } - selectedValue={isFrom ? fromChain : toChain} - setSelectedValue={onSelectChain} + selectedValue={{ + chainId: isFrom ? fromChain : toChain, + externalProjectId: isFrom ? undefined : selectedRoute.externalProjectId, + }} + setSelectedValue={(val) => + onSelectChain(val.chainId, val.externalProjectId) + } title={ @@ -121,7 +105,7 @@ function ChainInfoElement({ chain, superText, }: { - chain: ChainInfo; + chain: Pick; superText?: string; }) { return ( @@ -141,6 +125,53 @@ function ChainInfoElement({ ); } +/** + * Filters supported chains based on external project constraints + */ +function filterAvailableChains(fromOrTo: "from" | "to", selectedRoute: Route) { + const isFrom = fromOrTo === "from"; + let chains = getSupportedChains(fromOrTo); + const { externalProjectId, fromChain } = selectedRoute; + + if (externalProjectId && isFrom) { + const { intermediaryChain } = externConfigs[externalProjectId]; + chains = chains.filter((r) => r.chainId !== intermediaryChain); + } + + if (!isFrom) { + chains = chains.filter(({ projectId }) => { + if (!projectId) return true; + const { intermediaryChain } = externConfigs[projectId]; + return fromChain !== intermediaryChain; + }); + } + + return chains; +} + +/** + * Sorts chains based on balance and availability + */ +function sortChains( + chains: ReturnType, + balances: Record, + isConnected: boolean, + isFrom: boolean +) { + return chains + .map((c) => ({ + ...c, + balance: balances?.[c.chainId] ?? BigNumber.from(0), + disabled: !isConnected || !isFrom ? false : balances?.[c.chainId]?.eq(0), + })) + .sort((a, b) => { + if (!isConnected || !isFrom) return 0; + if (a.balance === undefined) return 1; + if (b.balance === undefined) return -1; + return a.balance.lt(b.balance) ? 1 : -1; + }); +} + export default ChainSelector; const ChainIconTextWrapper = styled.div` diff --git a/src/views/Bridge/components/RewardsProgramCTA.tsx b/src/views/Bridge/components/RewardsProgramCTA.tsx index cd83e0d23..b84798fe6 100644 --- a/src/views/Bridge/components/RewardsProgramCTA.tsx +++ b/src/views/Bridge/components/RewardsProgramCTA.tsx @@ -8,6 +8,7 @@ import { } from "utils"; import { PrimaryButton, Text } from "components"; import { useHistory } from "react-router-dom"; +import { useAvailableRemainingRewards } from "hooks/useAvailableRemainingRewards"; type ReferralCTAProps = { program: rewardProgramTypes; @@ -16,10 +17,11 @@ type ReferralCTAProps = { const RewardsProgramCTA = ({ program, toChain }: ReferralCTAProps) => { const { push: navigate } = useHistory(); + const { areTokensAvailable } = useAvailableRemainingRewards(program); const rewardProgram = rewardPrograms[program]; - if (!rewardProgram) { + if (!rewardProgram || !areTokensAvailable) { return null; } diff --git a/src/views/Bridge/components/TokenSelector.tsx b/src/views/Bridge/components/TokenSelector.tsx index 5052912a8..7f0f3f622 100644 --- a/src/views/Bridge/components/TokenSelector.tsx +++ b/src/views/Bridge/components/TokenSelector.tsx @@ -39,7 +39,14 @@ export function TokenSelector({ receiveTokenSymbol, }: Props) { const isInputTokenSelector = inputOrOutputToken === "input"; - const { fromChain, toChain, fromTokenSymbol, toTokenSymbol } = selectedRoute; + const { + fromChain, + toChain, + fromTokenSymbol, + toTokenSymbol, + externalProjectId, + } = selectedRoute; + const selectedToken = getToken( isInputTokenSelector ? selectedRoute.type === "swap" @@ -59,8 +66,13 @@ export function TokenSelector({ } > = useMemo(() => { const availableTokens = isInputTokenSelector - ? getAvailableInputTokens(fromChain, toChain) - : getAvailableOutputTokens(fromChain, toChain, fromTokenSymbol); + ? getAvailableInputTokens(fromChain, toChain, externalProjectId) + : getAvailableOutputTokens( + fromChain, + toChain, + fromTokenSymbol, + externalProjectId + ); const orderedAvailableTokens = tokenList.filter((orderedToken) => availableTokens.find( (availableToken) => availableToken.symbol === orderedToken.symbol @@ -79,7 +91,13 @@ export function TokenSelector({ .map((t) => ({ ...t, disabled: true })) : []), ]; - }, [fromChain, toChain, fromTokenSymbol, isInputTokenSelector]); + }, [ + fromChain, + toChain, + fromTokenSymbol, + isInputTokenSelector, + externalProjectId, + ]); const { balances } = useBalancesBySymbols({ tokenSymbols: orderedTokens.filter((t) => !t.disabled).map((t) => t.symbol), diff --git a/src/views/Bridge/hooks/useBridge.ts b/src/views/Bridge/hooks/useBridge.ts index fe4c4e4ce..f03e4d23f 100644 --- a/src/views/Bridge/hooks/useBridge.ts +++ b/src/views/Bridge/hooks/useBridge.ts @@ -61,6 +61,7 @@ export function useBridge() { const { error: amountValidationError, warn: amountValidationWarning } = validateBridgeAmount( + selectedRoute, parsedAmount, quotedFees, maxBalance, diff --git a/src/views/Bridge/hooks/useBridgeAction.ts b/src/views/Bridge/hooks/useBridgeAction.ts index 35c4bb143..e578c095f 100644 --- a/src/views/Bridge/hooks/useBridgeAction.ts +++ b/src/views/Bridge/hooks/useBridgeAction.ts @@ -3,7 +3,7 @@ import { TransferQuoteReceivedProperties, ampli, } from "ampli"; -import { BigNumber, constants, providers } from "ethers"; +import { BigNumber, constants, providers, utils } from "ethers"; import { useConnection, useApprove, @@ -23,12 +23,19 @@ import { sendSpokePoolVerifierDepositTx, sendDepositV3Tx, sendSwapAndBridgeTx, + getToken, + acrossPlusMulticallHandler, + hyperLiquidBridge2Address, + externalProjectNameToId, + generateHyperLiquidPayload, + fixedPointAdjustment, } from "utils"; import { TransferQuote } from "./useTransferQuote"; import { SelectedRoute } from "../utils"; import useReferrer from "hooks/useReferrer"; import { SwapQuoteApiResponse } from "utils/serverless-api/prod/swap-quote"; import { BridgeLimitInterface } from "utils/serverless-api/types"; +import { CHAIN_IDs } from "@across-protocol/constants"; const config = getConfig(); @@ -61,6 +68,10 @@ export function useBridgeAction( const { isWrongNetworkHandler, isWrongNetwork } = useIsWrongNetwork( selectedRoute.fromChain ); + + const { isWrongNetworkHandler: isWrongNetworkHandlerHyperLiquid } = + useIsWrongNetwork(CHAIN_IDs.ARBITRUM); + const approveHandler = useApprove(selectedRoute.fromChain); const { addToAmpliQueue } = useAmplitude(); @@ -98,6 +109,73 @@ export function useBridgeAction( throw new Error("Missing required data for bridge action"); } + const externalProjectIsHyperLiquid = + frozenRoute.externalProjectId === "hyperliquid"; + + let externalPayload: string | undefined; + + if (externalProjectIsHyperLiquid) { + await isWrongNetworkHandlerHyperLiquid(); + + // External Project Inclusion Considerations: + // + // HyperLiquid: + // We need to set up our crosschain message to the hyperliquid bridge with + // the following considerations: + // 1. Our recipient address is the default multicall handler + // 2. The recipient and the signer must be the same address + // 3. We will first transfer funds to the true recipient EoA + // 4. We must construct a payload to send to HL's Bridge2 contract + // 5. The user must sign this signature + + // Subtract the relayer fee pct just like we do for our output token amount + const amount = frozenDepositArgs.amount.sub( + frozenDepositArgs.amount + .mul(frozenDepositArgs.relayerFeePct) + .div(fixedPointAdjustment) + ); + + // Build the payload + const hyperLiquidPayload = await generateHyperLiquidPayload( + signer, + frozenDepositArgs.toAddress, + amount + ); + // Create a txn calldata for transfering amount to recipient + const erc20Interface = new utils.Interface([ + "function transfer(address to, uint256 amount) returns (bool)", + ]); + + const transferCalldata = erc20Interface.encodeFunctionData("transfer", [ + frozenDepositArgs.toAddress, + amount, + ]); + + // Encode Instructions struct directly + externalPayload = utils.defaultAbiCoder.encode( + [ + "tuple(tuple(address target, bytes callData, uint256 value)[] calls, address fallbackRecipient)", + ], + [ + { + calls: [ + { + target: getToken("USDC").addresses![CHAIN_IDs.ARBITRUM], + callData: transferCalldata, + value: 0, + }, + { + target: hyperLiquidBridge2Address, + callData: hyperLiquidPayload, + value: 0, + }, + ], + fallbackRecipient: frozenDepositArgs.toAddress, + }, + ] + ); + } + await isWrongNetworkHandler(); // If swap route then we need to approve the swap token for the `SwapAndBridge` @@ -129,6 +207,7 @@ export function useBridgeAction( allowedContractAddress: config.getSpokePoolAddress( frozenRoute.fromChain ), + enforceCorrectNetwork: frozenRoute.externalProjectId !== undefined, }); } @@ -138,7 +217,10 @@ export function useBridgeAction( generateTransferSubmitted( frozenQuoteForAnalytics, referrer, - frozenInitialQuoteTime + frozenInitialQuoteTime, + externalProjectIsHyperLiquid + ? externalProjectNameToId(frozenRoute.externalProjectId) + : undefined ) ); }); @@ -193,6 +275,10 @@ export function useBridgeAction( inputTokenAddress: frozenRoute.fromTokenAddress, outputTokenAddress: frozenRoute.toTokenAddress, fillDeadline: frozenFeeQuote.fillDeadline, + message: externalPayload, + toAddress: externalProjectIsHyperLiquid + ? acrossPlusMulticallHandler[frozenRoute.toChain] + : frozenDepositArgs.toAddress, }, spokePool, networkMismatchHandler @@ -205,7 +291,10 @@ export function useBridgeAction( frozenQuoteForAnalytics, referrer, timeSubmitted, - tx.hash + tx.hash, + externalProjectIsHyperLiquid + ? externalProjectNameToId(frozenRoute.externalProjectId) + : undefined ) ); }); @@ -237,6 +326,9 @@ export function useBridgeAction( : frozenRoute.fromTokenSymbol, outputTokenSymbol: frozenRoute.toTokenSymbol, referrer, + ...(externalProjectIsHyperLiquid + ? { externalProjectId: frozenRoute.externalProjectId } + : {}), }); if (existingIntegrator) { statusPageSearchParams.set("integrator", existingIntegrator); @@ -283,6 +375,7 @@ type DepositArgs = { exclusiveRelayer: string; exclusivityDeadline: number; integratorId: string; + externalProjectId?: string; }; function getDepositArgs( selectedRoute: SelectedRoute, @@ -317,6 +410,7 @@ function getDepositArgs( exclusiveRelayer: quotedFees.exclusiveRelayer, exclusivityDeadline: quotedFees.exclusivityDeadline, integratorId, + externalProjectId: selectedRoute.externalProjectId, }; } diff --git a/src/views/Bridge/hooks/useEstimatedRewards.ts b/src/views/Bridge/hooks/useEstimatedRewards.ts index 95c2c531a..b22d723ce 100644 --- a/src/views/Bridge/hooks/useEstimatedRewards.ts +++ b/src/views/Bridge/hooks/useEstimatedRewards.ts @@ -1,4 +1,5 @@ import { BigNumber, utils as ethersUtils } from "ethers"; +import { useAvailableRemainingRewards } from "hooks/useAvailableRemainingRewards"; import { useTokenConversion } from "hooks/useTokenConversion"; import { DateTime } from "luxon"; import { useMemo } from "react"; @@ -66,8 +67,12 @@ export function useEstimatedRewards( yesterdaysDate ); + const { areRewardTokensAvailable } = + useAvailableRemainingRewards(rewardProgramName); + const depositReward = useMemo(() => { if ( + !areRewardTokensAvailable || availableRewardPercentage === undefined || rewardToken === undefined || bridgeFee === undefined || @@ -103,6 +108,7 @@ export function useEstimatedRewards( rewardAsRewardToken: totalRewardInRewardToken, }; }, [ + areRewardTokensAvailable, availableRewardPercentage, bridgeFee, convertL1ToBaseCurrency, diff --git a/src/views/Bridge/hooks/useSelectRoute.ts b/src/views/Bridge/hooks/useSelectRoute.ts index 29693b944..0c6f66aaf 100644 --- a/src/views/Bridge/hooks/useSelectRoute.ts +++ b/src/views/Bridge/hooks/useSelectRoute.ts @@ -6,6 +6,7 @@ import { trackTokenChanged, trackQuickSwap, similarTokensMap, + externalProjectNameToId, } from "utils"; import { useAmplitude, useConnection } from "hooks"; @@ -43,7 +44,11 @@ export function useSelectRoute() { addToAmpliQueue(() => { trackTokenChanged(selectedRoute.fromTokenSymbol, true); trackFromChainChanged(selectedRoute.fromChain, true); - trackToChainChanged(selectedRoute.toChain, true); + trackToChainChanged( + selectedRoute.toChain, + externalProjectNameToId(selectedRoute.externalProjectId), + true + ); }); setIsDefaultRouteTracked(true); }, [selectedRoute, addToAmpliQueue, isDefaultRouteTracked]); @@ -118,7 +123,7 @@ export function useSelectRoute() { ); const handleSelectFromChain = useCallback( - (fromChainId: number) => { + (fromChainId: number, _externalProjectId?: string) => { const isSwap = selectedRoute.type === "swap"; const filterBy = { inputTokenSymbol: isSwap ? undefined : selectedRoute.fromTokenSymbol, @@ -129,11 +134,14 @@ export function useSelectRoute() { ), fromChain: fromChainId, toChain: selectedRoute.toChain, + externalProjectId: selectedRoute.externalProjectId, }; + const similarTokenSymbols = similarTokensMap[ isSwap ? selectedRoute.swapTokenSymbol : selectedRoute.fromTokenSymbol ] || []; + const findNextBestRouteBySimilarToken = ( priorityFilterKeys: PriorityFilterKey[] ) => { @@ -147,7 +155,24 @@ export function useSelectRoute() { } } }; + const route = + // First try with external project ID if it exists + (filterBy.externalProjectId && + (findNextBestRoute( + [ + "fromChain", + "toChain", + "externalProjectId", + isSwap ? "swapTokenSymbol" : "inputTokenSymbol", + ], + filterBy + ) || + findNextBestRoute( + ["fromChain", "toChain", "externalProjectId"], + filterBy + ))) || + // Then try without external project ID constraints findNextBestRoute( [ "fromChain", @@ -165,6 +190,7 @@ export function useSelectRoute() { findNextBestRoute(["fromChain", "toChain"], { ...filterBy, outputTokenSymbol: undefined, + externalProjectId: undefined, }) || findNextBestRoute(["fromChain"], { fromChain: fromChainId, @@ -185,7 +211,7 @@ export function useSelectRoute() { ); const handleSelectToChain = useCallback( - (toChainId: number) => { + (toChainId: number, externalProjectId?: string) => { const isSwap = selectedRoute.type === "swap"; const filterBy = { inputTokenSymbol: isSwap ? undefined : selectedRoute.fromTokenSymbol, @@ -196,34 +222,82 @@ export function useSelectRoute() { ), fromChain: selectedRoute.fromChain, toChain: toChainId, + externalProjectId, }; - const route = - findNextBestRoute( - [ - "fromChain", - "toChain", - isSwap ? "swapTokenSymbol" : "inputTokenSymbol", - ], - filterBy - ) || - findNextBestRoute(["fromChain", "toChain"], filterBy) || - findNextBestRoute(["fromChain", "toChain"], { - ...filterBy, - outputTokenSymbol: undefined, - }) || - findNextBestRoute(["fromChain"], { - toChain: toChainId, - }) || - findNextBestRoute( - ["toChain", isSwap ? "swapTokenSymbol" : "inputTokenSymbol"], - filterBy - ) || - initialRoute; + + // Try to find route with exact match first + let route = externalProjectId + ? findNextBestRoute(["fromChain", "toChain", "externalProjectId"], { + toChain: toChainId, + externalProjectId, + fromChain: selectedRoute.fromChain, + }) || + findNextBestRoute(["toChain", "externalProjectId"], { + toChain: toChainId, + externalProjectId, + }) + : findNextBestRoute( + [ + "fromChain", + "toChain", + isSwap ? "swapTokenSymbol" : "inputTokenSymbol", + ], + filterBy + ); + + // If no route found, fall back to previous logic + if (!route) { + route = + findNextBestRoute( + [ + "fromChain", + "toChain", + "externalProjectId", + isSwap ? "swapTokenSymbol" : "inputTokenSymbol", + ], + filterBy + ) || + findNextBestRoute( + ["fromChain", "toChain", "externalProjectId"], + filterBy + ) || + (externalProjectId && + findNextBestRoute(["fromChain", "toChain", "externalProjectId"], { + fromChain: selectedRoute.fromChain, + toChain: toChainId, + externalProjectId, + })) || + (externalProjectId === undefined && + (findNextBestRoute( + [ + "fromChain", + "toChain", + isSwap ? "swapTokenSymbol" : "inputTokenSymbol", + ], + { ...filterBy, externalProjectId: undefined } + ) || + findNextBestRoute(["fromChain", "toChain"], { + ...filterBy, + outputTokenSymbol: undefined, + externalProjectId: undefined, + }))) || + findNextBestRoute(["fromChain"], { + toChain: toChainId, + }) || + findNextBestRoute( + ["toChain", isSwap ? "swapTokenSymbol" : "inputTokenSymbol"], + filterBy + ) || + initialRoute; + } setSelectedRoute(route); addToAmpliQueue(() => { - trackToChainChanged(route.toChain); + trackToChainChanged( + route.toChain, + externalProjectNameToId(route.externalProjectId) + ); }); }, [selectedRoute, addToAmpliQueue] @@ -258,7 +332,10 @@ export function useSelectRoute() { addToAmpliQueue(() => { trackFromChainChanged(route.fromChain); - trackToChainChanged(route.toChain); + trackToChainChanged( + route.toChain, + externalProjectNameToId(route.externalProjectId) + ); trackQuickSwap("bridgeForm"); }); } diff --git a/src/views/Bridge/hooks/useTransferQuote.ts b/src/views/Bridge/hooks/useTransferQuote.ts index 50c71a707..f91697e66 100644 --- a/src/views/Bridge/hooks/useTransferQuote.ts +++ b/src/views/Bridge/hooks/useTransferQuote.ts @@ -51,6 +51,7 @@ export function useTransferQuote( selectedRoute.toChain, selectedRoute.fromTokenSymbol, selectedRoute.toTokenSymbol, + selectedRoute.externalProjectId, toAddress ); const limitsQuery = useBridgeLimits( diff --git a/src/views/Bridge/utils.ts b/src/views/Bridge/utils.ts index 494a2ff99..480d8b9c7 100644 --- a/src/views/Bridge/utils.ts +++ b/src/views/Bridge/utils.ts @@ -1,3 +1,4 @@ +import { externConfigs } from "constants/chains/configs"; import { BigNumber } from "ethers"; import { Route, @@ -12,7 +13,9 @@ import { nonEthChains, GetBridgeFeesResult, chainEndpointToId, + parseUnits, chainIsLens, + isDefined, } from "utils"; import { SwapQuoteApiResponse } from "utils/serverless-api/prod/swap-quote"; @@ -30,6 +33,7 @@ type RouteFilter = Partial<{ outputTokenSymbol: string; fromChain: number; toChain: number; + externalProjectId: string; }>; export enum AmountInputError { @@ -101,6 +105,7 @@ export function getReceiveTokenSymbol( } export function validateBridgeAmount( + selectedRoute: SelectedRoute, parsedAmountInput?: BigNumber, quoteFees?: GetBridgeFeesResult, currentBalance?: BigNumber, @@ -131,7 +136,12 @@ export function validateBridgeAmount( }; } - if (quoteFees?.isAmountTooLow) { + if ( + quoteFees?.isAmountTooLow || + // HyperLiquid has a minimum deposit amount of 5 USDC + (selectedRoute.externalProjectId === "hyperliquid" && + parsedAmountInput.lt(parseUnits("5.05", 6))) + ) { return { error: AmountInputError.AMOUNT_TOO_LOW, }; @@ -179,6 +189,7 @@ export function findEnabledRoute( swapTokenSymbol, fromChain, toChain, + externalProjectId, } = filter; const commonRouteFilter = (route: Route | SwapRoute) => @@ -189,7 +200,10 @@ export function findEnabledRoute( ? route.toTokenSymbol.toUpperCase() === outputTokenSymbol.toUpperCase() : true) && (fromChain ? route.fromChain === fromChain : true) && - (toChain ? route.toChain === toChain : true); + (toChain ? route.toChain === toChain : true) && + (externalProjectId !== undefined + ? route.externalProjectId === externalProjectId + : true); if (swapTokenSymbol) { const swapRoute = swapRoutes.find( @@ -225,7 +239,8 @@ export type PriorityFilterKey = | "swapTokenSymbol" | "outputTokenSymbol" | "fromChain" - | "toChain"; + | "toChain" + | "externalProjectId"; /** * Returns the next best matching route based on the given priority keys and filter. * @param priorityFilterKeys Set of filter keys to use if no route is found based on `filter`. @@ -279,6 +294,7 @@ export function findNextBestRoute( "outputTokenSymbol", "fromChain", "toChain", + "externalProjectId", ] as const; const nonPriorityFilterKeys = allFilterKeys.filter((key) => priorityFilterKeys.includes(key) @@ -319,20 +335,23 @@ export function getAllTokens() { export function getAvailableInputTokens( selectedFromChain: number, - selectedToChain: number + selectedToChain: number, + externalProjectId?: string ) { const routeTokens = enabledRoutes .filter( (route) => route.fromChain === selectedFromChain && - route.toChain === selectedToChain + route.toChain === selectedToChain && + route.externalProjectId === externalProjectId ) .map((route) => getToken(route.fromTokenSymbol)); const swapTokens = swapRoutes .filter( (route) => route.fromChain === selectedFromChain && - route.toChain === selectedToChain + route.toChain === selectedToChain && + route.externalProjectId === externalProjectId ) .map((route) => getToken(route.swapTokenSymbol)); return [...routeTokens, ...swapTokens].filter( @@ -344,14 +363,16 @@ export function getAvailableInputTokens( export function getAvailableOutputTokens( selectedFromChain: number, selectedToChain: number, - selectedInputTokenSymbol: string + selectedInputTokenSymbol: string, + externalProjectId?: string ) { return enabledRoutes .filter( (route) => route.fromChain === selectedFromChain && route.toChain === selectedToChain && - route.fromTokenSymbol === selectedInputTokenSymbol + route.fromTokenSymbol === selectedInputTokenSymbol && + route.externalProjectId === externalProjectId ) .map((route) => getToken(route.toTokenSymbol)) .filter( @@ -389,7 +410,22 @@ export function getSupportedChains(chainType: ChainTypeT = ChainType.ALL) { const uniqueChainIds = Array.from(new Set(chainIds)); - const uniqueChains = uniqueChainIds.map((chainId) => getChainInfo(chainId)); + const uniqueChains = uniqueChainIds.flatMap((chainId) => { + return [ + { ...getChainInfo(chainId), projectId: undefined }, + ...Object.values(externConfigs) + .filter( + ({ intermediaryChain, projectId }) => + chainType !== "from" && + intermediaryChain === chainId && + enabledRoutes.some((route) => route.externalProjectId === projectId) + ) + .map((extern) => ({ + ...extern, + chainId: extern.intermediaryChain, + })), + ]; + }); return uniqueChains.sort((a, b) => { if (a.name < b.name) { @@ -408,29 +444,43 @@ export function getRouteFromUrl(overrides?: RouteFilter) { const preferredToChainId = chainEndpointToId[window.location.pathname.substring(1)]; + const preferredExternalProject = + externConfigs[window.location.pathname.substring(1)]; + const fromChain = Number( params.get("from") ?? params.get("fromChain") ?? params.get("originChainId") ?? - overrides?.fromChain + // If an external project is defined, we need to ignore the overrided fromChain + // only if the from chain is an intermediary chain of the project + (isDefined(preferredExternalProject) + ? preferredExternalProject.intermediaryChain === overrides?.fromChain + ? undefined + : overrides?.fromChain + : overrides?.fromChain) ) || undefined; - const toChain = - Number( - preferredToChainId ?? - params.get("to") ?? - params.get("toChain") ?? - params.get("destinationChainId") ?? - overrides?.toChain - ) || undefined; + const toChain = isDefined(preferredExternalProject) + ? preferredExternalProject.intermediaryChain + : Number( + preferredToChainId ?? + params.get("to") ?? + params.get("toChain") ?? + params.get("destinationChainId") ?? + overrides?.toChain + ) || undefined; + + const externalProjectId = + preferredExternalProject?.projectId || + params.get("externalProjectId") || + undefined; const inputTokenSymbol = params.get("inputTokenSymbol") ?? params.get("inputToken") ?? params.get("token") ?? overrides?.inputTokenSymbol; - undefined; const outputTokenSymbol = params.get("outputTokenSymbol") ?? @@ -443,6 +493,7 @@ export function getRouteFromUrl(overrides?: RouteFilter) { toChain, inputTokenSymbol, outputTokenSymbol: outputTokenSymbol?.toUpperCase(), + externalProjectId, }; const route = diff --git a/src/views/DepositStatus/DepositStatus.tsx b/src/views/DepositStatus/DepositStatus.tsx index f69cf9b47..c1f04f0b8 100644 --- a/src/views/DepositStatus/DepositStatus.tsx +++ b/src/views/DepositStatus/DepositStatus.tsx @@ -28,7 +28,7 @@ export default function DepositStatus() { const destinationChainId = queryParams.get("destinationChainId"); const inputTokenSymbol = queryParams.get("inputTokenSymbol"); const outputTokenSymbol = queryParams.get("outputTokenSymbol"); - + const externalProjectId = queryParams.get("externalProjectId") || undefined; if ( !depositTxHash || !originChainId || @@ -54,10 +54,12 @@ export default function DepositStatus() { inputTokenSymbol={inputTokenSymbol} outputTokenSymbol={outputTokenSymbol || inputTokenSymbol} fromBridgePagePayload={state.fromBridgePagePayload} + externalProjectId={externalProjectId} /> ( @@ -15,15 +16,19 @@ type DepositStatusAnimatedIconsParams = { status: DepositStatus; fromChainId: number; toChainId: number; + externalProjectId?: string; }; const DepositStatusAnimatedIcons = ({ status, fromChainId, toChainId, + externalProjectId, }: DepositStatusAnimatedIconsParams) => { const GrayscaleLogoFromChain = getChainInfo(fromChainId).grayscaleLogoSvg; - const GrayscaleLogoToChain = getChainInfo(toChainId).grayscaleLogoSvg; + const GrayscaleLogoToChain = externalProjectId + ? externConfigs[externalProjectId].grayscaleLogoSvg + : getChainInfo(toChainId).grayscaleLogoSvg; return ( <> diff --git a/src/views/DepositStatus/components/DepositStatusLowerCard.tsx b/src/views/DepositStatus/components/DepositStatusLowerCard.tsx index 6f3c3e8ac..aeccc8936 100644 --- a/src/views/DepositStatus/components/DepositStatusLowerCard.tsx +++ b/src/views/DepositStatus/components/DepositStatusLowerCard.tsx @@ -20,6 +20,7 @@ import { EarnByLpAndStakingCard } from "./EarnByLpAndStakingCard"; type Props = { fromChainId: number; toChainId: number; + externalProjectId?: string; inputTokenSymbol: string; outputTokenSymbol: string; fromBridgePagePayload?: FromBridgePagePayload; @@ -28,6 +29,7 @@ type Props = { export function DepositStatusLowerCard({ fromChainId, toChainId, + externalProjectId, inputTokenSymbol, outputTokenSymbol, fromBridgePagePayload, @@ -103,6 +105,7 @@ export function DepositStatusLowerCard({ toChainId, inputTokenSymbol: baseToken.symbol, outputTokenSymbol, + externalProjectId, }) ) } diff --git a/src/views/DepositStatus/components/DepositStatusUpperCard.tsx b/src/views/DepositStatus/components/DepositStatusUpperCard.tsx index 5afc3b7fe..b702dfe85 100644 --- a/src/views/DepositStatus/components/DepositStatusUpperCard.tsx +++ b/src/views/DepositStatus/components/DepositStatusUpperCard.tsx @@ -22,6 +22,7 @@ type Props = { depositTxHash: string; fromChainId: number; toChainId: number; + externalProjectId?: string; inputTokenSymbol: string; outputTokenSymbol?: string; fromBridgePagePayload?: FromBridgePagePayload; @@ -31,9 +32,10 @@ export function DepositStatusUpperCard({ depositTxHash, fromChainId, toChainId, - fromBridgePagePayload, + externalProjectId, inputTokenSymbol, outputTokenSymbol, + fromBridgePagePayload, }: Props) { const { depositQuery, fillQuery } = useDepositTracking( depositTxHash, @@ -94,6 +96,7 @@ export function DepositStatusUpperCard({ status={status} toChainId={toChainId} fromChainId={fromChainId} + externalProjectId={externalProjectId} /> {status === "filled" ? ( diff --git a/src/views/Staking/hooks/useStakeFormLogic.ts b/src/views/Staking/hooks/useStakeFormLogic.ts index 6f147988f..20e71b0fa 100644 --- a/src/views/Staking/hooks/useStakeFormLogic.ts +++ b/src/views/Staking/hooks/useStakeFormLogic.ts @@ -49,11 +49,11 @@ export function useStakeFormLogic( amount && isAmountValid && isNumberEthersParseable(amount) - ? deriveNewStakingValues( + ? (deriveNewStakingValues( poolData, poolData.lpTokenParser(amount), stakingAction - ) ?? poolData + ) ?? poolData) : poolData; const maximumValue = diff --git a/src/wagmi.config.ts b/src/wagmi.config.ts new file mode 100644 index 000000000..ae965c1a6 --- /dev/null +++ b/src/wagmi.config.ts @@ -0,0 +1,40 @@ +import { http, createConfig, Transport } from "wagmi"; +import { + injected, + metaMask, + safe, + walletConnect, + coinbaseWallet, +} from "wagmi/connectors"; + +import { chains_viem } from "constants/chains/configs"; +import { walletConnectProjectId } from "utils/constants"; + +const dappMetadata = { + name: "Across Bridge", + url: "https://app.across.to", + iconUrl: "https://app.across.to/logo-small.png", +}; + +export const wagmiConfig = createConfig({ + chains: chains_viem, + transports: chains_viem.reduce( + (acc, chain) => { + acc[chain.id] = http(chain.rpcUrls.default.http[0]); + return acc; + }, + {} as Record + ), + connectors: [ + injected(), + coinbaseWallet({ + appName: dappMetadata.name, + appLogoUrl: dappMetadata.iconUrl, + }), + walletConnect({ projectId: walletConnectProjectId }), + safe(), + metaMask({ + dappMetadata, + }), + ], +}); diff --git a/yarn.lock b/yarn.lock index 5de1cf94f..474ead0fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,26 +317,40 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.9", "@babel/core@^7.20.12", "@babel/core@^7.21.3", "@babel/core@^7.22.5", "@babel/core@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/compat-data@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" + integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.9", "@babel/core@^7.20.12", "@babel/core@^7.21.3", "@babel/core@^7.22.9", "@babel/core@^7.26.0": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" + integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.7" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.26.7" + "@babel/types" "^7.26.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -353,6 +367,17 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -378,6 +403,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== + dependencies: + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" @@ -458,6 +494,14 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" @@ -469,6 +513,15 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -481,6 +534,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== +"@babel/helper-plugin-utils@^7.25.9": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -525,16 +583,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" @@ -544,14 +617,13 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" + integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.7" "@babel/highlight@^7.22.13": version "7.22.20" @@ -567,6 +639,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" + integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== + dependencies: + "@babel/types" "^7.26.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" @@ -1082,19 +1161,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-self@^7.18.6", "@babel/plugin-transform-react-jsx-self@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" - integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== +"@babel/plugin-transform-react-jsx-self@^7.18.6", "@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" + integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.19.6", "@babel/plugin-transform-react-jsx-source@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" - integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== +"@babel/plugin-transform-react-jsx-source@^7.19.6", "@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" + integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-regenerator@^7.22.10": version "7.22.10" @@ -1345,6 +1424,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.26.0": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" + integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== + 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" @@ -1354,7 +1440,16 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.12.12", "@babel/traverse@^7.18.9", "@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.2": +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.12.12", "@babel/traverse@^7.18.9", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -1370,6 +1465,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" + integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.7" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.7" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" @@ -1379,6 +1487,14 @@ "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" +"@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" + integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@balancer-labs/sdk@1.1.6-beta.16": version "1.1.6-beta.16" resolved "https://registry.yarnpkg.com/@balancer-labs/sdk/-/sdk-1.1.6-beta.16.tgz#1d3c247efdf1fe7d01d6ed4c3b68339c620faa70" @@ -1429,6 +1545,16 @@ preact "^10.16.0" sha.js "^2.4.11" +"@coinbase/wallet-sdk@4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.2.3.tgz#a30fa0605b24bc42c37f52a62d2442bcbb7734af" + integrity sha512-BcyHZ/Ec84z0emORzqdXDv4P0oV+tV3a0OirfA8Ko1JGBIAVvB+hzLvZzCDvnuZx7MTK+Dd8Y9Tjlo446BpCIg== + dependencies: + "@noble/hashes" "^1.4.0" + clsx "^1.2.1" + eventemitter3 "^5.0.1" + preact "^10.24.2" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -2358,7 +2484,7 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" -"@ethereumjs/tx@^4.2.0": +"@ethereumjs/tx@^4.1.2", "@ethereumjs/tx@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== @@ -3257,6 +3383,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -3267,6 +3402,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" @@ -3288,6 +3428,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@js-sdsl/ordered-map@^4.4.2": version "4.4.2" resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" @@ -3345,6 +3493,15 @@ "@types/mdx" "^2.0.0" "@types/react" ">=16" +"@metamask/eth-json-rpc-provider@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz#3fd5316c767847f4ca107518b611b15396a5a32c" + integrity sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA== + dependencies: + "@metamask/json-rpc-engine" "^7.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -3356,6 +3513,15 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@metamask/json-rpc-engine@^7.0.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" + integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== + dependencies: + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + "@metamask/json-rpc-engine@^8.0.1", "@metamask/json-rpc-engine@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz#29510a871a8edef892f838ee854db18de0bf0d14" @@ -3416,6 +3582,11 @@ "@metamask/utils" "^9.0.0" fast-safe-stringify "^2.0.6" +"@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + "@metamask/safe-event-emitter@^3.0.0", "@metamask/safe-event-emitter@^3.1.1": version "3.1.2" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz#bfac8c7a1a149b5bbfe98f59fbfea512dfa3bad4" @@ -3432,6 +3603,17 @@ utf-8-validate "^5.0.2" uuid "^8.3.2" +"@metamask/sdk-communication-layer@0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.31.0.tgz#0acc063b62aa09d044c7aab65801712d760e53b2" + integrity sha512-V9CxdzabDPjQVgmKGHsyU3SYt4Af27g+4DbGCx0fLoHqN/i1RBDZqs/LYbJX3ykJCANzE+llz/MolMCMrzM2RA== + dependencies: + bufferutil "^4.0.8" + date-fns "^2.29.3" + debug "^4.3.4" + utf-8-validate "^5.0.2" + uuid "^8.3.2" + "@metamask/sdk-install-modal-web@0.30.2": version "0.30.2" resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.30.2.tgz#bba124a6cb54c50ac6274029afe7c83a99f75f1c" @@ -3439,6 +3621,38 @@ dependencies: qr-code-styling "^1.6.0-rc.1" +"@metamask/sdk-install-modal-web@0.31.5": + version "0.31.5" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.5.tgz#b5e903b63f936b9ae795f31137b4c9f0873c382d" + integrity sha512-ZfrVkPAabfH4AIxcTlxQN5oyyzzVXFTLZrm1/BJ+X632d9MiyAVHNtiqa9EZpZYkZGk2icmDVP+xCpvJmVOVpQ== + dependencies: + "@paulmillr/qr" "^0.2.1" + +"@metamask/sdk@0.31.5": + version "0.31.5" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.31.5.tgz#804b68382d9f4c74ab0296f1b5c54143622ef2c8" + integrity sha512-i7wteqO/fU2JWQrMZz+addHokYThHYznp4nYXviv+QysdxGVgAYvcW/PBA+wpeP3veX7QGfNqMPgSsZbBrASYw== + dependencies: + "@babel/runtime" "^7.26.0" + "@metamask/onboarding" "^1.0.1" + "@metamask/providers" "16.1.0" + "@metamask/sdk-communication-layer" "0.31.0" + "@metamask/sdk-install-modal-web" "0.31.5" + "@paulmillr/qr" "^0.2.1" + bowser "^2.9.0" + cross-fetch "^4.0.0" + debug "^4.3.4" + eciesjs "^0.4.11" + eth-rpc-errors "^4.0.3" + eventemitter2 "^6.4.9" + obj-multiplex "^1.0.0" + pump "^3.0.0" + readable-stream "^3.6.2" + socket.io-client "^4.5.1" + tslib "^2.6.0" + util "^0.12.4" + uuid "^8.3.2" + "@metamask/sdk@^0.30.0": version "0.30.3" resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.30.3.tgz#5fb2576235132815cf708554e8142f29ae47eb44" @@ -3470,6 +3684,17 @@ resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.1.0.tgz#148f786a674fba3ac885c1093ab718515bf7f648" integrity sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA== +"@metamask/utils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" + integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== + dependencies: + "@ethereumjs/tx" "^4.1.2" + "@types/debug" "^4.1.7" + debug "^4.3.4" + semver "^7.3.8" + superstruct "^1.0.3" + "@metamask/utils@^8.3.0": version "8.5.0" resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.5.0.tgz#ddd0d4012d5191809404c97648a837ea9962cceb" @@ -3604,6 +3829,13 @@ dependencies: "@noble/hashes" "1.5.0" +"@noble/curves@1.8.1", "@noble/curves@~1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff" + integrity sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ== + dependencies: + "@noble/hashes" "1.7.1" + "@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" @@ -3624,6 +3856,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@1.7.1", "@noble/hashes@~1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" + integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -4016,6 +4253,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== +"@paulmillr/qr@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@paulmillr/qr/-/qr-0.2.1.tgz#76ade7080be4ac4824f638146fd8b6db1805eeca" + integrity sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ== + "@phenomnomnominal/tsquery@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-3.0.0.tgz#6f2f4dbf6304ff52b12cc7a5b979f20c3794a22a" @@ -4614,6 +4856,14 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@safe-global/safe-apps-provider@0.18.5": + version "0.18.5" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz#745a932bda3739a8a298ae44ec6c465f6c4773b7" + integrity sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g== + dependencies: + "@safe-global/safe-apps-sdk" "^9.1.0" + events "^3.3.0" + "@safe-global/safe-apps-provider@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.0.tgz#81f1f00684840832e4fe2f92f26891533abd7b10" @@ -4622,6 +4872,14 @@ "@safe-global/safe-apps-sdk" "^8.1.0" events "^3.3.0" +"@safe-global/safe-apps-sdk@9.1.0", "@safe-global/safe-apps-sdk@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz#0e65913e0f202e529ed3c846e0f5a98c2d35aa98" + integrity sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q== + dependencies: + "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" + viem "^2.1.1" + "@safe-global/safe-apps-sdk@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" @@ -4650,6 +4908,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== +"@scure/base@~1.2.2", "@scure/base@~1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" + integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== + "@scure/bip32@1.1.5": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" @@ -4686,6 +4949,15 @@ "@noble/hashes" "~1.5.0" "@scure/base" "~1.1.7" +"@scure/bip32@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.2.tgz#093caa94961619927659ed0e711a6e4bf35bffd0" + integrity sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.2" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -4718,6 +4990,14 @@ "@noble/hashes" "~1.5.0" "@scure/base" "~1.1.8" +"@scure/bip39@1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.4.tgz#07fd920423aa671be4540d59bdd344cc1461db51" + integrity sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA== + dependencies: + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.4" + "@sentry/browser@7.37.2": version "7.37.2" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.37.2.tgz#355dd28ad12677d63e0b12c5209d12b3f98ac3a4" @@ -5194,7 +5474,7 @@ "@stablelib/constant-time" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": +"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== @@ -5225,7 +5505,7 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.3": +"@stablelib/x25519@1.0.3", "@stablelib/x25519@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== @@ -6419,10 +6699,10 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.3.tgz#07570ebd25f9b516c910a91f7244052c9b58eabc" integrity sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.18.0": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" - integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.18.0", "@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -7569,15 +7849,37 @@ magic-string "^0.27.0" react-refresh "^0.14.0" -"@vitejs/plugin-react@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz#793aa790633433558da7ac0a38c58ddf47dff518" - integrity sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA== +"@vitejs/plugin-react@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" + integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== + dependencies: + "@babel/core" "^7.26.0" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +"@wagmi/connectors@5.7.5": + version "5.7.5" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.7.5.tgz#59c4d3abfcb342aa4640749c7a0dcf96dcd5089d" + integrity sha512-btqHHUSTzg4BZe9at/7SnRPv4cz8O3pisbeZBh0qxKz7PVm+9vRxY0bSala3xQPDcS0PRTB30Vn/+lM73GCjbw== + dependencies: + "@coinbase/wallet-sdk" "4.2.3" + "@metamask/sdk" "0.31.5" + "@safe-global/safe-apps-provider" "0.18.5" + "@safe-global/safe-apps-sdk" "9.1.0" + "@walletconnect/ethereum-provider" "2.17.0" + cbw-sdk "npm:@coinbase/wallet-sdk@3.9.3" + +"@wagmi/core@2.16.3": + version "2.16.3" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.16.3.tgz#abbff0a19e75beaad56ffb90da772641552d49c3" + integrity sha512-SVovoWHaQ2AIkmGf+ucNijT6AHXcTMffFcLmcFF6++y21x+ge7Gkh3UoJiU91SDDv8n08eTQ9jbyia3GEgU5jQ== dependencies: - "@babel/core" "^7.22.5" - "@babel/plugin-transform-react-jsx-self" "^7.22.5" - "@babel/plugin-transform-react-jsx-source" "^7.22.5" - react-refresh "^0.14.0" + eventemitter3 "5.0.1" + mipd "0.0.7" + zustand "5.0.0" "@walletconnect/browser-utils@^1.8.0": version "1.8.0" @@ -7622,6 +7924,28 @@ lodash.isequal "4.5.0" uint8arrays "^3.1.0" +"@walletconnect/core@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.17.0.tgz#bf490e85a4702eff0f7cf81ba0d3c1016dffff33" + integrity sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw== + dependencies: + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + "@walletconnect/relay-api" "1.0.11" + "@walletconnect/relay-auth" "1.0.4" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.17.0" + "@walletconnect/utils" "2.17.0" + events "3.3.0" + lodash.isequal "4.5.0" + uint8arrays "3.1.0" + "@walletconnect/core@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" @@ -7659,6 +7983,22 @@ dependencies: tslib "1.14.1" +"@walletconnect/ethereum-provider@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.17.0.tgz#d74feaaed6180a6799e96760d7ee867ff3a083d2" + integrity sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A== + dependencies: + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/modal" "2.7.0" + "@walletconnect/sign-client" "2.17.0" + "@walletconnect/types" "2.17.0" + "@walletconnect/universal-provider" "2.17.0" + "@walletconnect/utils" "2.17.0" + events "3.3.0" + "@walletconnect/ethereum-provider@^2.10.0": version "2.10.1" resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.1.tgz#4733a98f0b388cf5ae6c2b269f50da87da432ee5" @@ -7674,7 +8014,7 @@ "@walletconnect/utils" "2.10.1" events "^3.3.0" -"@walletconnect/events@^1.0.1": +"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== @@ -7691,6 +8031,15 @@ "@walletconnect/time" "^1.0.2" tslib "1.14.1" +"@walletconnect/heartbeat@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz#e8dc5179db7769950c6f9cf59b23516d9b95227d" + integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + events "^3.3.0" + "@walletconnect/iso-crypto@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" @@ -7700,6 +8049,16 @@ "@walletconnect/types" "^1.8.0" "@walletconnect/utils" "^1.8.0" +"@walletconnect/jsonrpc-http-connection@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz#2f4c3948f074960a3edd07909560f3be13e2c7ae" + integrity sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.1" + cross-fetch "^3.1.4" + events "^3.3.0" + "@walletconnect/jsonrpc-http-connection@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98" @@ -7719,6 +8078,15 @@ "@walletconnect/safe-json" "^1.0.2" tslib "1.14.1" +"@walletconnect/jsonrpc-provider@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e" + integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + "@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" @@ -7727,6 +8095,14 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" +"@walletconnect/jsonrpc-types@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c" + integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== + dependencies: + events "^3.3.0" + keyvaluestorage-interface "^1.0.0" + "@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.3", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" @@ -7747,6 +8123,25 @@ tslib "1.14.1" ws "^7.5.1" +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== + dependencies: + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" + "@walletconnect/keyvaluestorage@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" @@ -7755,6 +8150,14 @@ safe-json-utils "^1.1.1" tslib "1.14.1" +"@walletconnect/logger@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.1.2.tgz#813c9af61b96323a99f16c10089bfeb525e2a272" + integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== + dependencies: + "@walletconnect/safe-json" "^1.0.2" + pino "7.11.0" + "@walletconnect/logger@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" @@ -7775,6 +8178,13 @@ dependencies: valtio "1.11.0" +"@walletconnect/modal-core@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.7.0.tgz#73c13c3b7b0abf9ccdbac9b242254a86327ce0a4" + integrity sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA== + dependencies: + valtio "1.11.2" + "@walletconnect/modal-ui@2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.6.1.tgz#200c54c8dfe3c71321abb2724e18bb357dfd6371" @@ -7785,6 +8195,16 @@ motion "10.16.2" qrcode "1.5.3" +"@walletconnect/modal-ui@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.7.0.tgz#dbbb7ee46a5a25f7d39db622706f2d197b268cbb" + integrity sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ== + dependencies: + "@walletconnect/modal-core" "2.7.0" + lit "2.8.0" + motion "10.16.2" + qrcode "1.5.3" + "@walletconnect/modal@2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.1.tgz#066fdbfcff83b58c8a9da66ab4af0eb93e3626de" @@ -7793,6 +8213,14 @@ "@walletconnect/modal-core" "2.6.1" "@walletconnect/modal-ui" "2.6.1" +"@walletconnect/modal@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.7.0.tgz#55f969796d104cce1205f5f844d8f8438b79723a" + integrity sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw== + dependencies: + "@walletconnect/modal-core" "2.7.0" + "@walletconnect/modal-ui" "2.7.0" + "@walletconnect/qrcode-modal@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz#ddd6f5c9b7ee52c16adf9aacec2a3eac4994caea" @@ -7815,6 +8243,13 @@ randombytes "^2.1.0" tslib "1.14.1" +"@walletconnect/relay-api@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.11.tgz#80ab7ef2e83c6c173be1a59756f95e515fb63224" + integrity sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/relay-api@^1.0.9": version "1.0.9" resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" @@ -7823,7 +8258,7 @@ "@walletconnect/jsonrpc-types" "^1.0.2" tslib "1.14.1" -"@walletconnect/relay-auth@^1.0.4": +"@walletconnect/relay-auth@1.0.4", "@walletconnect/relay-auth@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== @@ -7840,7 +8275,7 @@ resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== -"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": +"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== @@ -7862,6 +8297,21 @@ "@walletconnect/utils" "2.10.1" events "^3.3.0" +"@walletconnect/sign-client@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.17.0.tgz#efe811b1bb10082d964e2f0378aaa1b40f424503" + integrity sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg== + dependencies: + "@walletconnect/core" "2.17.0" + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.17.0" + "@walletconnect/utils" "2.17.0" + events "3.3.0" + "@walletconnect/socket-transport@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b" @@ -7871,7 +8321,7 @@ "@walletconnect/utils" "^1.8.0" ws "7.5.3" -"@walletconnect/time@^1.0.2": +"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== @@ -7890,6 +8340,18 @@ "@walletconnect/logger" "^2.0.1" events "^3.3.0" +"@walletconnect/types@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.17.0.tgz#20eda5791e3172f8ab9146caa3f317701d4b3232" + integrity sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA== + dependencies: + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + events "3.3.0" + "@walletconnect/types@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" @@ -7910,6 +8372,21 @@ "@walletconnect/utils" "2.10.1" events "^3.3.0" +"@walletconnect/universal-provider@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.17.0.tgz#c9d4bbd9b8f0e41b500b2488ccbc207dc5f7a170" + integrity sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw== + dependencies: + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/sign-client" "2.17.0" + "@walletconnect/types" "2.17.0" + "@walletconnect/utils" "2.17.0" + events "3.3.0" + "@walletconnect/utils@2.10.1": version "2.10.1" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.1.tgz#65b37c9800eb0e80a08385b6987471fb46e1e22e" @@ -7930,6 +8407,28 @@ query-string "7.1.3" uint8arrays "^3.1.0" +"@walletconnect/utils@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.17.0.tgz#02b3af0b80d0c1a994d692d829d066271b04d071" + integrity sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "1.0.3" + "@walletconnect/relay-api" "1.0.11" + "@walletconnect/relay-auth" "1.0.4" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.17.0" + "@walletconnect/window-getters" "1.0.1" + "@walletconnect/window-metadata" "1.0.1" + detect-browser "5.3.0" + elliptic "^6.5.7" + query-string "7.1.3" + uint8arrays "3.1.0" + "@walletconnect/utils@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" @@ -7948,7 +8447,7 @@ resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== -"@walletconnect/window-getters@^1.0.0", "@walletconnect/window-getters@^1.0.1": +"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.0", "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== @@ -7962,7 +8461,7 @@ dependencies: "@walletconnect/window-getters" "^1.0.0" -"@walletconnect/window-metadata@^1.0.1": +"@walletconnect/window-metadata@1.0.1", "@walletconnect/window-metadata@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== @@ -8136,6 +8635,11 @@ 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.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" + integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -8400,7 +8904,7 @@ any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -8694,6 +9198,13 @@ async-listen@3.0.1: resolved "https://registry.yarnpkg.com/async-listen/-/async-listen-3.0.1.tgz#cbe4edeace2b93ebf5cf8092899ee139457978b7" integrity sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA== +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + async-mutex@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" @@ -9292,6 +9803,16 @@ browserslist@^4.21.9, browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -9580,6 +10101,11 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz" integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.30001688: + version "1.0.30001696" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" + integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -9615,6 +10141,21 @@ cbor@^8.1.0: dependencies: nofilter "^3.1.0" +"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz#daf10cb0c85d0363315b7270cb3f02bedc408aab" + integrity sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw== + dependencies: + bn.js "^5.2.1" + buffer "^6.0.3" + clsx "^1.2.1" + eth-block-tracker "^7.1.0" + eth-json-rpc-filters "^6.0.0" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" + sha.js "^2.4.11" + chai@^4.3.10, chai@^4.3.4: version "4.4.1" resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" @@ -9778,7 +10319,7 @@ chokidar@4.0.0: dependencies: readdirp "^4.0.1" -chokidar@^3.4.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: +chokidar@^3.4.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -10316,6 +10857,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-es@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.2.2.tgz#18ceef9eb513cac1cb6c14bcbf8bdb2679b34821" + integrity sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -10472,6 +11018,13 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crossws@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.3.tgz#627f5e7e55f459e0ca52dfe48094f5ada7865cb4" + integrity sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw== + dependencies: + uncrypto "^0.1.3" + "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -10838,6 +11391,11 @@ defu@^6.1.2: resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== +defu@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + del@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -10885,6 +11443,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destr@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -11218,6 +11781,11 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.787.tgz#3eedd0a3b8be2b9e96e21675d399786ad90b99ed" integrity sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ== +electron-to-chromium@^1.5.73: + version "1.5.88" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz#cdb6e2dda85e6521e8d7d3035ba391c8848e073a" + integrity sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw== + elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -11893,6 +12461,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -12157,6 +12730,17 @@ eth-block-tracker@^4.4.2: pify "^3.0.0" safe-event-emitter "^1.0.1" +eth-block-tracker@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz#dfc16085c6817cc30caabba381deb8d204c1c766" + integrity sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg== + dependencies: + "@metamask/eth-json-rpc-provider" "^1.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + eth-crypto@^2.4.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eth-crypto/-/eth-crypto-2.6.0.tgz#b777f367ae8c70e5917b3b7d52adab6b34841e29" @@ -12211,6 +12795,17 @@ eth-json-rpc-errors@^2.0.2: dependencies: fast-safe-stringify "^2.0.6" +eth-json-rpc-filters@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz#0b3e370f017f5c6f58d3e7bd0756d8099ed85c56" + integrity sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig== + dependencies: + "@metamask/safe-event-emitter" "^3.0.0" + async-mutex "^0.2.6" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + eth-lib@0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" @@ -12247,7 +12842,7 @@ eth-rpc-errors@^3.0.0: dependencies: fast-safe-stringify "^2.0.6" -eth-rpc-errors@^4.0.3: +eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== @@ -12559,7 +13154,7 @@ events-intercept@^2.0.0: resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897" integrity sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q== -events@^3.0.0, events@^3.3.0: +events@3.3.0, events@^3.0.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -13878,6 +14473,22 @@ gunzip-maybe@^1.4.2: pumpify "^1.3.3" through2 "^2.0.3" +h3@^1.13.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.14.0.tgz#292bf0602444b36fd6b333b1d6872d685ecc9899" + integrity sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg== + dependencies: + cookie-es "^1.2.2" + crossws "^0.3.2" + defu "^6.1.4" + destr "^2.0.3" + iron-webcrypto "^1.2.1" + ohash "^1.1.4" + radix3 "^1.1.2" + ufo "^1.5.4" + uncrypto "^0.1.3" + unenv "^1.10.0" + handlebars@^4.0.1, handlebars@^4.7.7: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -14387,6 +14998,11 @@ iconv-lite@0.6.3, iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + idna-uts46-hx@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" @@ -14589,6 +15205,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +iron-webcrypto@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" + integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== + is-absolute-url@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -15853,6 +16474,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -15893,6 +16519,14 @@ json-rpc-engine@^5.1.3: eth-rpc-errors "^3.0.0" safe-event-emitter "^1.0.1" +json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" @@ -16265,6 +16899,13 @@ lit-html@^2.7.0: dependencies: "@types/trusted-types" "^2.0.2" +lit-html@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" + integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== + dependencies: + "@types/trusted-types" "^2.0.2" + lit@2.7.6: version "2.7.6" resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.6.tgz#810007b876ed43e0c70124de91831921598b1665" @@ -16274,6 +16915,15 @@ lit@2.7.6: lit-element "^3.3.0" lit-html "^2.7.0" +lit@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== + dependencies: + "@lit/reactive-element" "^1.6.0" + lit-element "^3.3.0" + lit-html "^2.8.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -16516,6 +17166,11 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== +lru-cache@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -16960,6 +17615,11 @@ minizlib@^3.0.1: minipass "^7.0.4" rimraf "^5.0.5" +mipd@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.7.tgz#bb5559e21fa18dc3d9fe1c08902ef14b7ce32fd9" + integrity sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg== + mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -17275,6 +17935,11 @@ node-fetch-native@^1.4.0: resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" integrity sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w== +node-fetch-native@^1.6.4: + version "1.6.6" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz#ae1d0e537af35c2c0b0de81cbff37eedd410aa37" + integrity sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ== + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -17331,6 +17996,11 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + nofilter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" @@ -17544,6 +18214,20 @@ oboe@2.1.5: dependencies: http-https "^1.0.0" +ofetch@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec" + integrity sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== + dependencies: + destr "^2.0.3" + node-fetch-native "^1.6.4" + ufo "^1.5.4" + +ohash@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.4.tgz#ae8d83014ab81157d2c285abf7792e2995fadd72" + integrity sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g== + on-exit-leak-free@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" @@ -17705,6 +18389,19 @@ ox@0.1.2: abitype "^1.0.6" eventemitter3 "5.0.1" +ox@0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.7.tgz#afd53f2ecef68b8526660e9d29dee6e6b599a832" + integrity sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA== + 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" @@ -18049,6 +18746,11 @@ pathe@^1.1.1: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -18129,6 +18831,11 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -18326,6 +19033,11 @@ preact@^10.16.0: resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.3.tgz#086386bd47071e3b45410ef20844c21e23828f64" integrity sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA== +preact@^10.24.2: + version "10.25.4" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.25.4.tgz#c1d00bee9d7b9dcd06a2311d9951973b506ae8ac" + integrity sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA== + precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" @@ -18354,16 +19066,16 @@ prettier-plugin-rust@^0.1.9: 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: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -18739,6 +19451,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +radix3@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" + integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== + ramda@0.29.0: version "0.29.0" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" @@ -18916,10 +19633,10 @@ react-pro-sidebar@^1.1.0-alpha.1: "@popperjs/core" "^2.11.6" classnames "^2.3.2" -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-refresh@^0.14.0, react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react-remove-scroll-bar@^2.3.3: version "2.3.4" @@ -20751,6 +21468,11 @@ superstruct@^0.15.4: resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.4.tgz#e3381dd84ca07e704e19f69eda74eee1a5efb1f9" integrity sha512-eOoMeSbP9ZJChNOm/9RYjE+F36rYR966AAqeG3xhQB02j2sfAUXDp4EQ/7bAOqnlJnuFDB8yvOu50SocvKpUEw== +superstruct@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== + superstruct@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" @@ -21367,7 +22089,7 @@ tslib@1.14.1, tslib@^1, tslib@^1.13.0, tslib@^1.14.1, tslib@^1.8.1, tslib@^1.9.0 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.6.2, tslib@^2.8.0: +tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.6.0, tslib@^2.6.2, 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== @@ -21633,6 +22355,11 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + uglify-js@^3.1.4, uglify-js@^3.7.7: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" @@ -21643,6 +22370,13 @@ uid-promise@1.0.0: resolved "https://registry.yarnpkg.com/uid-promise/-/uid-promise-1.0.0.tgz#68ef7c70a19dea4d637c7e3df2e0e548106f1a37" integrity sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig== +uint8arrays@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2" + integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== + dependencies: + multiformats "^9.4.2" + uint8arrays@^3.0.0, uint8arrays@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" @@ -21675,6 +22409,11 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + underscore@~1.13.2: version "1.13.6" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" @@ -21692,6 +22431,17 @@ undici@5.28.4, undici@^5.14.0: dependencies: "@fastify/busboy" "^2.0.0" +unenv@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.10.0.tgz#c3394a6c6e4cfe68d699f87af456fe3f0db39571" + integrity sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ== + dependencies: + consola "^3.2.3" + defu "^6.1.4" + mime "^3.0.0" + node-fetch-native "^1.6.4" + pathe "^1.1.2" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -21774,6 +22524,20 @@ unplugin@^1.3.1: webpack-sources "^3.2.3" webpack-virtual-modules "^0.5.0" +unstorage@^1.9.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.14.4.tgz#620dd68997a3245fca1e04c0171335817525bc3d" + integrity sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg== + dependencies: + anymatch "^3.1.3" + chokidar "^3.6.0" + destr "^2.0.3" + h3 "^1.13.0" + lru-cache "^10.4.3" + node-fetch-native "^1.6.4" + ofetch "^1.4.1" + ufo "^1.5.4" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -21803,6 +22567,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" @@ -21874,6 +22646,11 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + utf-8-validate@^5.0.2: version "5.0.10" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" @@ -21969,6 +22746,14 @@ valtio@1.11.0: proxy-compare "2.5.1" use-sync-external-store "1.2.0" +valtio@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" + integrity sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw== + dependencies: + proxy-compare "2.5.1" + use-sync-external-store "1.2.0" + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -22039,6 +22824,20 @@ viem@2.9.9: isows "1.0.3" ws "8.13.0" +viem@2.x, viem@^2.1.1: + version "2.22.16" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.22.16.tgz#f23e3a92284df3d05434d21fbf40b76b8f0b01b6" + integrity sha512-Eb4Ggna2fblb0oHBmy5XZ3Q4cN6fEmKxVpIWHjmAbtYVC9IfbZ28Z1/yZP2oOgvyRrostNndmnR298pgarBVGw== + dependencies: + "@noble/curves" "1.8.1" + "@noble/hashes" "1.7.1" + "@scure/bip32" "1.6.2" + "@scure/bip39" "1.5.4" + abitype "1.0.8" + isows "1.0.6" + ox "0.6.7" + ws "8.18.0" + viem@^1.0.0: version "1.11.1" resolved "https://registry.yarnpkg.com/viem/-/viem-1.11.1.tgz#30531740eb52e5d1ff1167d8df462d1a8d45afb8" @@ -22126,6 +22925,15 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" +wagmi@^2.14.9: + version "2.14.9" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.14.9.tgz#44c47ac6fc119e5ce40bee2c4e4dd5069a0d651a" + integrity sha512-nDJ5hwPaiVpn/8Bi82m5K4BCqDiOSnOV976p/jKXt0svQABGdAxUxej0UgDRoVlrp+NutmejN+SyQKmhV477/A== + dependencies: + "@wagmi/connectors" "5.7.5" + "@wagmi/core" "2.16.3" + use-sync-external-store "1.4.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -23773,3 +24581,8 @@ zod@3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zustand@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.0.tgz#71f8aaecf185592a3ba2743d7516607361899da9" + integrity sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==