diff --git a/CLAUDE.md b/CLAUDE.md index 219f65cb..bda27439 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,18 +21,26 @@ The app has no `lint` script and no in-app test setup — tests live in packages ## Architecture **Monorepo** (pnpm workspaces — `apps/*` and `packages/**`): -- `apps/app` — Next.js 16.2 frontend (App Router, Turbopack). Entry: `app/layout.tsx` (server, awaits `getSettings()`) → `app/providers.tsx` (consolidated client providers). The provider tree is split: outer (PostHog, SWR, Theme, Intercom) and inner `AppShell` (Settings, Tooltip, Train, Wallets, ThemeWrapper, ErrorBoundary, SwapAccounts, AsyncModal). The persistent shell (`ThemeWrapper` — sidebar/navbar/footer) is rendered *above* the Suspense boundary so it never blanks. Only `` (which reads `useSearchParams` internally) plus `AuthDialog`, `SwapModalRoot`, and the page `children` sit inside ``. Route segments: `app/{page,swap,settings,transactions,nocookies}/page.tsx`. Root `error.tsx` + `not-found.tsx`. `proxy.ts` (the Next 16 rename of `middleware.ts` — exports `proxy`, not `middleware`) sets `Cache-Control: public, s-maxage=60, stale-while-revalidate`. The layout is no longer `force-dynamic` — `getSettings` is cached via `unstable_cache` (60s revalidate) and all routes build as `○ Static`. Sidebar ``s use Next's default prefetch (eager prefetch on viewport entry for static routes); the logo opts out via `prefetch={false}` since it points at `/`. All four sidebar nav targets (logo, Home, History, Settings) preserve persistent embed query params via `buildHrefWithPersistantParams`. Web Workers live in `apps/app/workers/` (e.g. `helios` light client) and are built via `build:workers`. -- `apps/packagesdemo` — small Next.js Pages-Router demo app for exercising published SDK packages. +- `apps/app` — Next.js 16.3 frontend (App Router, Turbopack). Entry: `app/layout.tsx` (server, awaits `getSettings()`) → `app/providers.tsx` (consolidated client providers). The provider tree is split: outer (SWR, Theme, Intercom, Vercel Analytics) and inner `AppShell` (Settings, Tooltip, Train, Wallets, Faro tracking, ThemeWrapper, ErrorBoundary, SwapAccounts, AsyncModal). The persistent shell (`ThemeWrapper` — sidebar/navbar/footer) is rendered *above* the Suspense boundary so it never blanks. Only `` (which reads `useSearchParams` internally) plus `AuthDialog`, `SwapModalRoot`, and the page `children` sit inside `}>`. Route segments: `app/{page,swap,settings,transactions,nocookies}/page.tsx`. Root `error.tsx` + `not-found.tsx`. `proxy.ts` (the Next 16 rename of `middleware.ts` — exports `proxy`, not `middleware`) sets `Cache-Control: public, s-maxage=60, stale-while-revalidate`. The layout is no longer `force-dynamic` — `getSettings` is cached via `unstable_cache` (60s revalidate) and all routes build as `○ Static`. Sidebar ``s use Next's default prefetch (eager prefetch on viewport entry for static routes); the logo opts out via `prefetch={false}` since it points at `/`. All four sidebar nav targets (logo, Home, History, Settings) preserve persistent embed query params via `buildHrefWithPersistantParams`. Web Workers live in `apps/app/workers/` (e.g. `helios` light client) and are built via `build:workers`. - `packages/sdk` — `@train-protocol/sdk`: core HTLC protocol logic, `TrainApiClient`, lock verification, consensus helpers (vitest tests in `__tests__/`). -- `packages/blockchains/` — chain-specific HTLC client implementations: `evm`, `solana`, `starknet`, `tron`, `aztec`, plus shared `utils`. +- `packages/blockchains/` — chain-specific HTLC client implementations: `evm`, `solana`, `starknet`, `tron`, `aztec`, `fuel`, plus shared `utils`. - `packages/auth` — `@train-protocol/auth` shared auth helpers. - `packages/react` — `@train-protocol/react` shared React utilities. **What the app does**: Cross-chain atomic swaps using HTLC (Hash Time-Locked Contracts). Users lock funds on a source chain, a solver locks on the destination chain, then secrets are revealed to complete the swap. EVM is the primary chain; Solana, Starknet, TON, Aztec, Tron, and Fuel support is in progress (see `FUEL_PHTLC.json`). ### State Management -- **Zustand stores** (`apps/app/stores/`): `swapStore` (main swap state), `walletStore`, `addressesStore`, `balanceStore`, `rpcConfigStore`, `authDialogStore`, `aztecWalletStore`, `starknetWalletStore`, `recentRoutesStore`, `routeSortingStore`, `routeTokenSwitchStore`, `usdModeStore`. There is no `secretDerivationStore` — secret derivation lives in helpers/components. -- **React Context** (`apps/app/context/`): `swapAccounts` (wallet/account handling), `formWizardProvider` (multi-step forms), `walletHookProviders` (per-chain wallet hook composition), `query` (React Query), `settings`, `snapPointsContext`, `timerContext`, `asyncModal`. HTLC contract interactions and EVM connectors are no longer separate contexts — they're handled inline via wallet hooks and the SDK's HTLC clients. +- **Zustand stores** (`apps/app/stores/`): `swapStore` (main swap state), `walletStore` and `aztecWalletStore` (app-owned Aztec integration), `addressesStore`, `balanceStore`, `rpcConfigStore`, `authDialogStore`, `faucetNudgeStore`, `recentRoutesStore`, `routeSortingStore`, `routeTokenSwitchStore`, and `usdModeStore`. Package-owned wallet state lives in the corresponding `@layerswap/wallet-*` package rather than app stores. There is no `secretDerivationStore` — secret derivation lives in helpers/components. +- **React Context** (`apps/app/context/`): `swapAccounts` (wallet/account handling), `formWizardProvider` (multi-step forms), `query` (React Query), `settings`, `snapPointsContext`, and `asyncModal`. Wallet connection state is supplied by the Layerswap registry/provider tree; HTLC clients are registered separately through `WalletBridges`. + +### Wallet packages and Train bridges +- Published `@layerswap/*` packages provide shared wallet connection state and UI. This branch consumes local packed builds from `local-packages/*.tgz`, pinned by root `pnpm.overrides` while the package changes are under development. +- `components/WalletProviders/LayerswapRegistry.tsx` registers raw Train `ExtendedNetwork[]` with wallet-core through `walletNetworkAdapter`. Train keeps CAIP-2 IDs as its network identity; wallet packages must use the adapter rather than Layerswap internal network names. +- EVM is initialized eagerly with the app's external wagmi config. Fuel, Solana, Starknet, and Tron are descriptor-based providers loaded only when needed or when a persisted session exists. +- Aztec remains app-owned because there is no Layerswap Aztec wallet package. `lib/wallets/aztec/adapter.tsx` adapts the React/context integration into wallet-core's external-store contract. +- `components/WalletBridges/*` is the boundary from connected wallet state to `@train-protocol/react`: each bridge registers the chain's public/write HTLC client and login signer. Non-EVM bridges mount only after their lazy wallet provider is ready. +- `components/WalletModal/*` hosts the app drawer/dialog while `@layerswap/ui-kit` owns the connector flow UI. `components/Wallet/walletListAdapters.tsx` supplies Train-specific CAIP-2 IDs, balances, labels, and connect behavior to UI-kit components. +- Layerswap package `ErrorHandler` events are wired to Grafana Faro in `app/providers.tsx`. ### Layout & navigation - `ThemeWrapper` (inside providers) renders the persistent shell: left-side `AppSidebar` + top app-header strip (desktop) that holds `` + content area + `GlobalFooter`. @@ -59,7 +67,9 @@ Key files: - `apps/app/lib/abis/atomic/EVM_HTLC.json` — unified EVM ABI - `apps/app/lib/abis/atomic/FUEL_PHTLC.json` — Fuel PHTLC ABI - `packages/blockchains/{evm,solana,starknet,tron,aztec}/src/client/` — chain-specific HTLC implementations (PublicClient + WalletClient) -- `apps/app/lib/wallets/{evm,solana,starknet,tron,aztec}/` — per-chain wallet hooks (`useEVM.ts`, `useStarknet.ts`, `useTron.ts`, `useAztec.ts`, etc.) that bridge UI state to the SDK's HTLC clients +- `apps/app/lib/wallets/layerswap/` — Layerswap provider descriptors plus the Train network adapter +- `apps/app/components/WalletBridges/` — per-chain adapters from connected wallets to `@train-protocol/react` HTLC clients +- `apps/app/lib/wallets/aztec/` — app-owned Aztec connection integration and wallet-core adapter ### RPC Node Resolution & Consensus - `apps/app/lib/rpc/` — RPC resolution: `nodeResolver.ts` (entry point), `evmNodes.ts` (static chainlist data from `data/chainlistRpcs.json`), `nonEvmNodes.ts` (static registry) @@ -74,13 +84,13 @@ Key files: - Nonce = `Date.now()` timestamp, stored in URL query params (for page refresh recovery) and on-chain via `userData` bytes field ### Web3 Stack -- EVM: wagmi 2.14 + viem 2.44 (catalog-pinned in `pnpm-workspace.yaml`) -- Starknet: @starknet-react 5.0 + starknet.js 8.x -- Solana: @solana/web3.js 1.98 + wallet-adapter + @coral-xyz/anchor -- TON: @ton/ton 13.11 + @tonconnect/ui-react -- Tron: @tronweb3/tronwallet-adapter-* family -- Aztec: @aztec/aztec.js 4.1 + @aztec/wallet-sdk -- Fuel: fuels 0.101 +- EVM: `@layerswap/wallet-evm` with the app's wagmi 2.14 + viem 2.44 config +- Starknet: `@layerswap/wallet-starknet`; HTLC implementation uses starknet.js 8.x +- Solana: `@layerswap/wallet-svm`; HTLC implementation uses `@solana/web3.js` 1.98 + Anchor +- Tron: `@layerswap/wallet-tron` +- Fuel: `@layerswap/wallet-fuel` + fuels 0.101 +- Aztec: app-owned `@aztec/aztec.js` 5.1 + `@aztec/wallet-sdk` 5.1 integration +- Shared connection UI/state: `@layerswap/ui-kit`, `@layerswap/wallet-core`, `@layerswap/utils`, and `@layerswap/widget-types` ## Key Conventions diff --git a/apps/app/Models/Balance.ts b/apps/app/Models/Balance.ts index 04f2e8be..5a850ffa 100644 --- a/apps/app/Models/Balance.ts +++ b/apps/app/Models/Balance.ts @@ -1,5 +1,5 @@ import { ExtendedNetwork, ExtendedToken } from "./Network" -import { Wallet } from "./WalletProvider" +import type { Wallet } from "@layerswap/widget-types" import { NodeErrorCategory } from "@/lib/balances/nodeErrorClassifier" export type GasProps = { @@ -35,4 +35,4 @@ export type TokenBalance = { export type NetworkBalance = { balances?: TokenBalance[] | null, -} \ No newline at end of file +} diff --git a/apps/app/Models/WalletProvider.ts b/apps/app/Models/WalletProvider.ts deleted file mode 100644 index 15065c7d..00000000 --- a/apps/app/Models/WalletProvider.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { WalletAccount } from 'starknet'; -import { StarknetWindowObject } from 'starknetkit'; - -export type InternalConnector = { - name: string, - id: string, - icon?: string | undefined, - order?: number, - type?: 'injected' | 'walletConnect' | 'other' | string, - isMultiChain?: boolean, - providerName: string, - installUrl?: string, - isMobileSupported?: boolean, - hasBrowserExtension?: boolean, - extensionNotFound: boolean, - isLoadable?: boolean -} - -export type Wallet = { - id: string; - internalId?: string; - displayName?: string; - // TODO: might be unused and unnecessary check - isActive: boolean; - address: string | `0x${string}`; - addresses: string[]; - providerName: string - icon: (props: any) => React.JSX.Element; - //TODO: this is name of the connector, should be changed to connectorId - metadata?: { - starknetAccount?: WalletAccount, - wallet?: StarknetWindowObject, - l1Address?: string, - deepLink?: string - } - chainId?: string | number, - isLoading?: boolean, - disconnect?: () => Promise | undefined | void; - connect?: () => Promise; - isNotAvailable?: boolean; - //TODO: refactor - withdrawalSupportedNetworks?: string[], - asSourceSupportedNetworks?: string[], - autofillSupportedNetworks?: string[], - networkIcon?: string, -} - -export type RequestAdditionalConnectorsParams = { - page?: number, - pageSize?: number, - query?: string, -} - -export type RequestAdditionalConnectorsResult = { - connectors: InternalConnector[], - nextPage: number | null, - totalCount: number, -} - -export type WalletProvider = { - hideFromList?: boolean, - connectWallet: (props?: { connector?: InternalConnector }) => Promise | undefined, - disconnectWallets?: () => Promise | undefined | void, - switchAccount?: (connector: Wallet, address: string) => Promise, - switchChain?: (connector: Wallet, chainId: string | number) => Promise - isNotAvailableCondition?: (connector: string, network: string, purpose?: "withdrawal" | "autofill" | "asSource") => boolean, - availableConnectors?: InternalConnector[], - additionalConnectors?: InternalConnector[], - connectedWallets: Wallet[] | undefined, - activeWallet: Wallet | undefined, - autofillSupportedNetworks?: string[], - withdrawalSupportedNetworks: string[], - asSourceSupportedNetworks?: string[], - name: string, - id: string, - providerIcon?: string, - unsupportedPlatforms?: string[], - ready: boolean, - requestAdditionalConnectors?: (params?: RequestAdditionalConnectorsParams) => Promise, -} - - -export type SelectAccountProps = { - walletId: string; - address: string; - providerName: string; -} \ No newline at end of file diff --git a/apps/app/app/providers.tsx b/apps/app/app/providers.tsx index 5a08d48b..f70c5c97 100644 --- a/apps/app/app/providers.tsx +++ b/apps/app/app/providers.tsx @@ -9,6 +9,8 @@ import { SWRConfig } from "swr" import { Analytics } from "@vercel/analytics/next" import { ThemeProvider } from "next-themes" import { FaroErrorBoundary } from "@grafana/faro-react" +import { setNetworkAdapter } from "@layerswap/utils" +import { setErrorLogger } from "@layerswap/widget-types" import { TrainProvider } from "@train-protocol/react" import { registerEvmSdk } from "@train-protocol/evm" import { registerTronSdk } from "@train-protocol/tron" @@ -31,14 +33,24 @@ import { TrainAppSettings } from "@/Models/TrainAppSettings" import { TrainSettings } from "@/Models/TrainSettings" import { SendErrorMessage } from "@/lib/telegram" import { IsExtensionError } from "@/helpers/errorHelper" -import { initFaro } from "@/lib/faro" +import { captureException, initFaro } from "@/lib/faro" import FaroTracker from "@/components/FaroTracker" import AppSettings from "@/lib/AppSettings" import { useRpcConfigStore } from "@/stores/rpcConfigStore" import Loading from "@/components/Loading" +import { walletNetworkAdapter } from "@/lib/wallets/layerswap/networkAdapter" if (typeof window !== "undefined") { - initFaro() + setNetworkAdapter(walletNetworkAdapter) + const faro = initFaro() + if (faro) { + setErrorLogger(event => { + const error = new Error(event.message || event.type) + error.name = event.name || event.type + if (event.stack) error.stack = event.stack + captureException(error) + }) + } registerEvmSdk() registerAztecSdk() registerSolanaSdk() diff --git a/apps/app/components/AddressIcon/colors.mjs b/apps/app/components/AddressIcon/colors.mjs deleted file mode 100644 index ddf25b4f..00000000 --- a/apps/app/components/AddressIcon/colors.mjs +++ /dev/null @@ -1,12 +0,0 @@ -export default [ - '#01888C', // teal - '#FC7500', // bright orange - '#034F5D', // dark teal - '#F73F01', // orangered - '#FC1960', // magenta - '#C7144C', // raspberry - '#F3C100', // goldenrod - '#1598F2', // lightning blue - '#2465E1', // sail blue - '#F19E02', // gold -] diff --git a/apps/app/components/AddressIcon/index.tsx b/apps/app/components/AddressIcon/index.tsx deleted file mode 100644 index 217c6c0b..00000000 --- a/apps/app/components/AddressIcon/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -'use client' -import Jazzicon from "./jazzicon.mjs"; -import { FC, useEffect, useRef } from "react"; - -type Props = { - address: string; - size: number; - className?: string; - rounded?: string; -} - -const AddressIcon: FC = ({ address, size, className, rounded }) => { - const ref = useRef(null) - useEffect(() => { - if (address && ref.current) { - ref.current.innerHTML = ""; - const iconElement = Jazzicon(size, parseInt(address.slice(2, 10), 16)) - if (iconElement) { - iconElement.style.display = 'block' - iconElement.style.width = "100%" - iconElement.style.height = "100%" - iconElement.style.borderRadius = rounded || "3px" - ref.current.appendChild(iconElement); - } - } - }, [address, size]); - - return
-} -export default AddressIcon \ No newline at end of file diff --git a/apps/app/components/AddressIcon/jazzicon.mjs b/apps/app/components/AddressIcon/jazzicon.mjs deleted file mode 100644 index ba572bfb..00000000 --- a/apps/app/components/AddressIcon/jazzicon.mjs +++ /dev/null @@ -1,79 +0,0 @@ -import MersenneTwister from './mersenne-twister.mjs'; -import paperGen from './paper.mjs'; -import Color from 'color'; -import colors from './colors.mjs'; - -var shapeCount = 4 -var svgns = 'http://www.w3.org/2000/svg' - -var generator -function generateIdenticon(diameter, seed) { - generator = new MersenneTwister(seed); - var remainingColors = hueShift(colors.slice(), generator) - - var elements = paperGen(diameter, genColor(remainingColors)) - var container = elements.container - - var svg = document.createElementNS(svgns, 'svg') - svg.setAttributeNS(null, 'x', '0') - svg.setAttributeNS(null, 'y', '0') - svg.setAttributeNS(null, 'width', diameter) - svg.setAttributeNS(null, 'height', diameter) - - container.appendChild(svg) - - for(var i = 0; i < shapeCount - 1; i++) { - genShape(remainingColors, diameter, i, shapeCount - 1, svg) - } - - return container -} - -function genShape(remainingColors, diameter, i, total, svg) { - var center = diameter / 2 - - var shape = document.createElementNS(svgns, 'rect') - shape.setAttributeNS(null, 'x', '0') - shape.setAttributeNS(null, 'y', '0') - shape.setAttributeNS(null, 'width', diameter) - shape.setAttributeNS(null, 'height', diameter) - - var firstRot = generator.random() - var angle = Math.PI * 2 * firstRot - var velocity = diameter / total * generator.random() + (i * diameter / total) - - var tx = (Math.cos(angle) * velocity) - var ty = (Math.sin(angle) * velocity) - - var translate = 'translate(' + tx + ' ' + ty + ')' - - // Third random is a shape rotation on top of all of that. - var secondRot = generator.random() - var rot = (firstRot * 360) + secondRot * 180 - var rotate = 'rotate(' + rot.toFixed(1) + ' ' + center + ' ' + center + ')' - var transform = translate + ' ' + rotate - shape.setAttributeNS(null, 'transform', transform) - var fill = genColor(remainingColors) - shape.setAttributeNS(null, 'fill', fill) - - svg.appendChild(shape) -} - -function genColor(colors) { - var rand = generator.random() - var idx = Math.floor(colors.length * generator.random()) - var color = colors.splice(idx,1)[0] - return color -} - -var wobble = 30 -function hueShift(colors, generator) { - var amount = (generator.random() * 30) - (wobble / 2) - return colors.map(function(hex) { - var color = Color(hex) - color.rotate(amount) - return color.hex() - }) -} - -export default generateIdenticon diff --git a/apps/app/components/AddressIcon/mersenne-twister.mjs b/apps/app/components/AddressIcon/mersenne-twister.mjs deleted file mode 100644 index 628859c6..00000000 --- a/apps/app/components/AddressIcon/mersenne-twister.mjs +++ /dev/null @@ -1,169 +0,0 @@ -/* - https://github.com/banksean wrapped Makoto Matsumoto and Takuji Nishimura's code in a namespace - so it's better encapsulated. Now you can have multiple random number generators - and they won't stomp all over eachother's state. - - If you want to use this as a substitute for Math.random(), use the random() - method like so: - - var m = new MersenneTwister(); - var randomNumber = m.random(); - - You can also call the other genrand_{foo}() methods on the instance. - - If you want to use a specific seed in order to get a repeatable random - sequence, pass an integer into the constructor: - - var m = new MersenneTwister(123); - - and that will always produce the same random sequence. - - Sean McCullough (banksean@gmail.com) -*/ - -/** - * @constructor - * @param {number|Array} [seed] - Optional seed for the random number generator - */ -function MersenneTwister(seed) { - if (seed == undefined) { - seed = new Date().getTime(); - } - - /* Period parameters */ - this.N = 624; - this.M = 397; - this.MATRIX_A = 0x9908b0df; /* constant vector a */ - this.UPPER_MASK = 0x80000000; /* most significant w-r bits */ - this.LOWER_MASK = 0x7fffffff; /* least significant r bits */ - - this.mt = new Array(this.N); /* the array for the state vector */ - this.mti = this.N + 1; /* mti==N+1 means mt[N] is not initialized */ - - if (seed.constructor == Array) { - this.init_by_array(seed, seed.length); - } - else { - this.init_seed(seed); - } -} - -/* initializes mt[N] with a seed */ -/* origin name init_genrand */ -MersenneTwister.prototype.init_seed = function (s) { - this.mt[0] = s >>> 0; - for (this.mti = 1; this.mti < this.N; this.mti++) { - var s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30); - this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) - + this.mti; - /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ - /* In the previous versions, MSBs of the seed affect */ - /* only MSBs of the array mt[]. */ - /* 2002/01/09 modified by Makoto Matsumoto */ - this.mt[this.mti] >>>= 0; - /* for >32 bit machines */ - } -} - -/* initialize by an array with array-length */ -/* init_key is the array for initializing keys */ -/* key_length is its length */ -/* slight change for C++, 2004/2/26 */ -MersenneTwister.prototype.init_by_array = function (init_key, key_length) { - var i, j, k; - this.init_seed(19650218); - i = 1; j = 0; - k = (this.N > key_length ? this.N : key_length); - for (; k; k--) { - var s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30) - this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + ((s & 0x0000ffff) * 1664525))) - + init_key[j] + j; /* non linear */ - this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ - i++; j++; - if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; } - if (j >= key_length) j = 0; - } - for (k = this.N - 1; k; k--) { - var s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30); - this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941)) - - i; /* non linear */ - this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ - i++; - if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; } - } - - this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */ -} - -/* generates a random number on [0,0xffffffff]-interval */ -/* origin name genrand_int32 */ -MersenneTwister.prototype.random_int = function () { - var y; - var mag01 = new Array(0x0, this.MATRIX_A); - /* mag01[x] = x * MATRIX_A for x=0,1 */ - - if (this.mti >= this.N) { /* generate N words at one time */ - var kk; - - if (this.mti == this.N + 1) /* if init_seed() has not been called, */ - this.init_seed(5489); /* a default initial seed is used */ - - for (kk = 0; kk < this.N - this.M; kk++) { - y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK); - this.mt[kk] = this.mt[kk + this.M] ^ (y >>> 1) ^ mag01[y & 0x1]; - } - for (; kk < this.N - 1; kk++) { - y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK); - this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ mag01[y & 0x1]; - } - y = (this.mt[this.N - 1] & this.UPPER_MASK) | (this.mt[0] & this.LOWER_MASK); - this.mt[this.N - 1] = this.mt[this.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1]; - - this.mti = 0; - } - - y = this.mt[this.mti++]; - - /* Tempering */ - y ^= (y >>> 11); - y ^= (y << 7) & 0x9d2c5680; - y ^= (y << 15) & 0xefc60000; - y ^= (y >>> 18); - - return y >>> 0; -} - -/* generates a random number on [0,0x7fffffff]-interval */ -/* origin name genrand_int31 */ -MersenneTwister.prototype.random_int31 = function () { - return (this.random_int() >>> 1); -} - -/* generates a random number on [0,1]-real-interval */ -/* origin name genrand_real1 */ -MersenneTwister.prototype.random_incl = function () { - return this.random_int() * (1.0 / 4294967295.0); - /* divided by 2^32-1 */ -} - -/* generates a random number on [0,1)-real-interval */ -MersenneTwister.prototype.random = function () { - return this.random_int() * (1.0 / 4294967296.0); - /* divided by 2^32 */ -} - -/* generates a random number on (0,1)-real-interval */ -/* origin name genrand_real3 */ -MersenneTwister.prototype.random_excl = function () { - return (this.random_int() + 0.5) * (1.0 / 4294967296.0); - /* divided by 2^32 */ -} - -/* generates a random number on [0,1) with 53-bit resolution*/ -/* origin name genrand_res53 */ -MersenneTwister.prototype.random_long = function () { - var a = this.random_int() >>> 5, b = this.random_int() >>> 6; - return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); -}; - -export default MersenneTwister; diff --git a/apps/app/components/AddressIcon/paper.mjs b/apps/app/components/AddressIcon/paper.mjs deleted file mode 100644 index 7b59e43c..00000000 --- a/apps/app/components/AddressIcon/paper.mjs +++ /dev/null @@ -1,16 +0,0 @@ -function newPaper(diameter, color) { - var container = document.createElement('div') - container.style.borderRadius = '50px' - container.style.overflow = 'hidden' - container.style.padding = '0px' - container.style.margin = '0px' - container.style.width = '' + diameter + 'px' - container.style.height = '' + diameter + 'px' - container.style.display = 'inline-block' - container.style.background = color - return { - container: container, - } -} - -export default newPaper diff --git a/apps/app/components/Common/ImageWithFallback.tsx b/apps/app/components/Common/ImageWithFallback.tsx deleted file mode 100644 index 58536b70..00000000 --- a/apps/app/components/Common/ImageWithFallback.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import Image, { ImageProps } from "next/image"; -import React, { forwardRef, useCallback, useEffect, useState } from "react"; -import LogoPlaceholder from "../Icons/LogoPlaceholder"; - -export const ImageWithFallback = forwardRef(({ src, ...props }, ref) => { - const [imgSrc, setImgSrc] = useState(src); - const [hasError, setHasError] = useState(false); - - useEffect(() => { - setImgSrc(src); - setHasError(false); - }, [src]) - - const handleError = useCallback(() => { - setHasError(true); - }, [setHasError]); - - if (hasError) { - return ; - } - - return {props.alt; -}); \ No newline at end of file diff --git a/apps/app/components/Faucet/FaucetNetworkSelector.tsx b/apps/app/components/Faucet/FaucetNetworkSelector.tsx index d4345863..8ec7a2de 100644 --- a/apps/app/components/Faucet/FaucetNetworkSelector.tsx +++ b/apps/app/components/Faucet/FaucetNetworkSelector.tsx @@ -1,7 +1,7 @@ import { FC } from "react" import { ExtendedNetwork } from "@/Models/Network" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/shadcn/select" -import { ImageWithFallback } from "@/components/Common/ImageWithFallback" +import { ImageWithFallback } from "@layerswap/ui-kit" type Props = { networks: ExtendedNetwork[] diff --git a/apps/app/components/Faucet/FaucetWalletPicker.tsx b/apps/app/components/Faucet/FaucetWalletPicker.tsx index 7c4d8952..9a03cf28 100644 --- a/apps/app/components/Faucet/FaucetWalletPicker.tsx +++ b/apps/app/components/Faucet/FaucetWalletPicker.tsx @@ -2,11 +2,12 @@ import { FC, useRef, useState } from "react" import { Check } from "lucide-react" import clsx from "clsx" import { ExtendedNetwork } from "@/Models/Network" -import { Wallet } from "@/Models/WalletProvider" +import type { Wallet } from "@layerswap/widget-types"; import { Address } from "@/lib/address" import { Popover, PopoverAnchor, PopoverContent } from "@/components/shadcn/popover" import MobileTooltip from "@/components/Modal/mobileTooltip" import { AddressInputField } from "@/components/Input/Address/AddressPicker/ManualAddressInput" +import { WalletIconView } from "@layerswap/ui-kit"; type Props = { network: ExtendedNetwork | null @@ -83,7 +84,7 @@ const FaucetWalletPicker: FC = ({ network, wallets, value, onChange, disa isSelected ? "bg-secondary-300" : "bg-secondary-500 hover:bg-secondary-300", )} > - +
{wallet?.icon ? ( - + ) : addressProviderIcon ? ( ) : ( - + )} { ((Address.isValid(values?.destination_address, values?.to) && values?.to) ? @@ -85,4 +86,4 @@ export const SummaryRow: FC<{
) -} \ No newline at end of file +} diff --git a/apps/app/components/FeeDetails/useFeeDisplay.ts b/apps/app/components/FeeDetails/useFeeDisplay.ts index 30a373da..c2e75786 100644 --- a/apps/app/components/FeeDetails/useFeeDisplay.ts +++ b/apps/app/components/FeeDetails/useFeeDisplay.ts @@ -4,8 +4,8 @@ import { SwapFormValues } from '../DTOs/SwapFormValues' import useWallet from '@/hooks/useWallet' import useSWRGas from '@/lib/gases/useSWRGas' import { resolveTokenUsdPrice } from '@/helpers/tokenHelper' -import formatAmount from '@/lib/formatAmount' -import { truncateDecimals } from '../utils/RoundDecimals' +import { formatUnits } from '@layerswap/utils' +import { truncateDecimals } from '@layerswap/utils' /** `$x.xx`, or `<$0.01` for dust. `Free` when the amount is exactly zero and `freeWhenZero` is set. */ function formatUsd(amount: number, freeWhenZero: boolean): string { @@ -48,7 +48,7 @@ export function useSwapFeeDisplay(values: SwapFormValues, quote: SwapQuote | und const feeAmount = useMemo(() => { if (!quote?.totalFee || !fromCurrency) return null - return formatAmount(BigInt(quote.totalFee), fromCurrency.decimals) + return formatUnits(BigInt(quote.totalFee), fromCurrency.decimals) }, [quote?.totalFee, fromCurrency]) const feeInUsd = useMemo(() => { diff --git a/apps/app/components/Icons/CircularLoader.tsx b/apps/app/components/Icons/CircularLoader.tsx deleted file mode 100644 index 3c154781..00000000 --- a/apps/app/components/Icons/CircularLoader.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { SVGProps } from "react" - -const CircularLoader = (props: SVGProps) => { - return - - - -} - -export default CircularLoader \ No newline at end of file diff --git a/apps/app/components/Icons/ConnectorIcons.tsx b/apps/app/components/Icons/ConnectorIcons.tsx index 07217939..c0cdbb67 100644 --- a/apps/app/components/Icons/ConnectorIcons.tsx +++ b/apps/app/components/Icons/ConnectorIcons.tsx @@ -1,111 +1,22 @@ -import RainbowIcon from "./Wallets/Rainbow"; -import MetaMaskIcon from "./Wallets/MetaMask"; -import WalletConnectIcon from "./Wallets/WalletConnect"; -import Braavos from "./Wallets/Braavos"; -import ArgentX from "./Wallets/ArgentX"; -import Argent from "./Wallets/Argent"; -import Phantom from "./Wallets/Phantom"; -import CoinbaseIcon from "./Wallets/Coinbase"; -import { Mail } from "lucide-react"; -import Fuel from "./Wallets/Fuel"; -import BakoSafe from "./Wallets/BakoSafe"; -import Ethereum from "./Wallets/Ethereum"; -import Solana from "./Wallets/Solana"; -import TonKeeper from "./Wallets/TonKeeper"; -import OpenMask from "./Wallets/OpenMask"; -import TON from "./Wallets/TON"; -import MyTonWallet from "./Wallets/MyTonWallet"; -import GlowIcon from "./Wallets/Glow"; +import { ResolveConnectorIcon as BaseResolveConnectorIcon } from "@layerswap/ui-kit"; +import { cn } from "@layerswap/utils"; +import { NetworkTypes } from "@/Models/Network"; import Azguard from "./Wallets/Azguard"; -import { cn } from "@/lib/utils"; - -export const ResolveConnectorIcon = ({ - connector, - iconClassName, - className, -}: { +type Props = { connector?: string; iconClassName: string; className?: string; -}) => { - switch (connector?.toLowerCase()) { - case KnownConnectors.EVM: - return ( - - - - - - - ); - case KnownConnectors.Starknet: - return ( - - - - - - - ); - case KnownConnectors.TON: - return ( - - - - - - - ); - case KnownConnectors.Solana: - return ( - - - - - - - ); - case KnownConnectors.Fuel: - return ( - - - - - - - ); - case KnownConnectors.Aztec: - return ( - - - - ); - default: - return ( - - - - - - - ); - } -}; +} -const IconsWrapper = ({ children, className, single }: { children: React.ReactNode, className?: string, single?: boolean }) => { - if (single) { - return
{children}
; +export const ResolveConnectorIcon = ({ connector, iconClassName, className }: Props) => { + if (connector?.toLowerCase() === NetworkTypes.Aztec) { + return ( +
+ +
+ ); } - return
{children}
; -} -const KnownConnectors = { - Starknet: "starknet", - EVM: "eip155", - TON: "ton", - Solana: "solana", - Glow: "glow", - Fuel: "fuel", - Aztec: "aztec", -}; \ No newline at end of file + return ; +}; diff --git a/apps/app/components/Icons/CopyIcon.tsx b/apps/app/components/Icons/CopyIcon.tsx deleted file mode 100644 index 5fbed5e7..00000000 --- a/apps/app/components/Icons/CopyIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; - -const CopyIcon = (props) => ( - - - - -); - -export default CopyIcon; \ No newline at end of file diff --git a/apps/app/components/Icons/FilledCheck.tsx b/apps/app/components/Icons/FilledCheck.tsx deleted file mode 100644 index f554b8af..00000000 --- a/apps/app/components/Icons/FilledCheck.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { SVGProps } from "react" - -const FilledCheck = (props: SVGProps) => { - return - - -} - -export default FilledCheck \ No newline at end of file diff --git a/apps/app/components/Icons/FilledX.tsx b/apps/app/components/Icons/FilledX.tsx deleted file mode 100644 index 57dcc95b..00000000 --- a/apps/app/components/Icons/FilledX.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { SVGProps } from "react" - -const FilledX = (props: SVGProps) => { - return - - -} - -export default FilledX \ No newline at end of file diff --git a/apps/app/components/Icons/LogoPlaceholder.tsx b/apps/app/components/Icons/LogoPlaceholder.tsx deleted file mode 100644 index fc52ca76..00000000 --- a/apps/app/components/Icons/LogoPlaceholder.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React, { SVGProps } from 'react'; - -const LogoPlaceholder = ({ className, ...props }: SVGProps) => ( - - - - -); - -export default LogoPlaceholder; \ No newline at end of file diff --git a/apps/app/components/Icons/MenuIcon.tsx b/apps/app/components/Icons/MenuIcon.tsx deleted file mode 100644 index 5db54723..00000000 --- a/apps/app/components/Icons/MenuIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { SVGProps } from "react" - -const MenuIcon = (props: SVGProps) => { - return - - - - - - - -} - -export default MenuIcon \ No newline at end of file diff --git a/apps/app/components/Icons/SearchIcon.tsx b/apps/app/components/Icons/SearchIcon.tsx deleted file mode 100644 index 90cf382b..00000000 --- a/apps/app/components/Icons/SearchIcon.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { SVGProps } from "react"; - -const SearchIcon = (props: SVGProps) => - - - -export default SearchIcon; \ No newline at end of file diff --git a/apps/app/components/Icons/SvgWithImg.tsx b/apps/app/components/Icons/SvgWithImg.tsx deleted file mode 100644 index dbda75b5..00000000 --- a/apps/app/components/Icons/SvgWithImg.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { SVGProps } from "react" - -const SVGWithImg = (props: SVGProps & { image_url: string }) => { - return ( - - - - ) -} - -export default SVGWithImg \ No newline at end of file diff --git a/apps/app/components/Icons/WalletIcon.tsx b/apps/app/components/Icons/WalletIcon.tsx deleted file mode 100644 index 524aab13..00000000 --- a/apps/app/components/Icons/WalletIcon.tsx +++ /dev/null @@ -1,7 +0,0 @@ -const WalletIcon = ({ strokeWidth = 2, ...props }: any) => ( - - - -); - -export default WalletIcon; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Argent.tsx b/apps/app/components/Icons/Wallets/Argent.tsx deleted file mode 100644 index 7fea9795..00000000 --- a/apps/app/components/Icons/Wallets/Argent.tsx +++ /dev/null @@ -1,7 +0,0 @@ -const Argent = (props) => - - - - - -export default Argent; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/ArgentX.tsx b/apps/app/components/Icons/Wallets/ArgentX.tsx deleted file mode 100644 index f5a74ea9..00000000 --- a/apps/app/components/Icons/Wallets/ArgentX.tsx +++ /dev/null @@ -1,11 +0,0 @@ -const ArgentX = (props) => { - return ( - - - - - - ) -} - -export default ArgentX \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/BakoSafe.tsx b/apps/app/components/Icons/Wallets/BakoSafe.tsx deleted file mode 100644 index bcb2695f..00000000 --- a/apps/app/components/Icons/Wallets/BakoSafe.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { SVGProps } from "react" - -const BakoSafe = (props: SVGProps) => - - - - - - - - - - - - - - - - - - - -export default BakoSafe; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/BitKeep.tsx b/apps/app/components/Icons/Wallets/BitKeep.tsx deleted file mode 100644 index 910f0b2d..00000000 --- a/apps/app/components/Icons/Wallets/BitKeep.tsx +++ /dev/null @@ -1,19 +0,0 @@ -const BitKeep = (props) => - - - - - - -export default BitKeep; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Bitget.tsx b/apps/app/components/Icons/Wallets/Bitget.tsx deleted file mode 100644 index b12cecf3..00000000 --- a/apps/app/components/Icons/Wallets/Bitget.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { SVGProps } from "react"; - -const BitGetIcon = (props: SVGProps) => { - return ( - - - - - - - - - - - - - - ) -} - -export default BitGetIcon \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Braavos.tsx b/apps/app/components/Icons/Wallets/Braavos.tsx deleted file mode 100644 index bbb17e62..00000000 --- a/apps/app/components/Icons/Wallets/Braavos.tsx +++ /dev/null @@ -1,22 +0,0 @@ -const Braavos = (props) => - - - - - - - - - - - - - - - - - - - - -export default Braavos; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/BrowserWallet.tsx b/apps/app/components/Icons/Wallets/BrowserWallet.tsx deleted file mode 100644 index b8f3ed86..00000000 --- a/apps/app/components/Icons/Wallets/BrowserWallet.tsx +++ /dev/null @@ -1,7 +0,0 @@ -const BrowserWallet = (props) => - - - - - -export default BrowserWallet; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Coinbase.tsx b/apps/app/components/Icons/Wallets/Coinbase.tsx deleted file mode 100644 index c9e9d94d..00000000 --- a/apps/app/components/Icons/Wallets/Coinbase.tsx +++ /dev/null @@ -1,6 +0,0 @@ -const CoinbaseIcon = (props) => - - - - -export default CoinbaseIcon; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Controller.tsx b/apps/app/components/Icons/Wallets/Controller.tsx deleted file mode 100644 index cda70368..00000000 --- a/apps/app/components/Icons/Wallets/Controller.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { SVGProps } from "react"; - -const Controller = (props: SVGProps) => - - - - -export default Controller \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Ethereum.tsx b/apps/app/components/Icons/Wallets/Ethereum.tsx deleted file mode 100644 index 27da36ef..00000000 --- a/apps/app/components/Icons/Wallets/Ethereum.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { SVGProps } from "react" - -const Ethereum = (props: SVGProps) => - - - - - - - - -export default Ethereum; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Fuel.tsx b/apps/app/components/Icons/Wallets/Fuel.tsx deleted file mode 100644 index 9fc4d75f..00000000 --- a/apps/app/components/Icons/Wallets/Fuel.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { SVGProps } from "react" - -const Fuel = (props: SVGProps) => - - - - - - - - -export default Fuel; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Glow.tsx b/apps/app/components/Icons/Wallets/Glow.tsx deleted file mode 100644 index de672832..00000000 --- a/apps/app/components/Icons/Wallets/Glow.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import Image from "next/image"; - -const GlowIcon = (props) => { - const src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAB4FBMVEUAAACjON6dNNyjONd7C+GIHNq1S+K9W+O3TeLAVOe6TuSJHtqcMdPBVeiuQt2kOdeRJc7AVeeyRd95COR9DeF7CuKWKtCaL9KoPdr78/789/7//f+zPt7u0Pi7ROG5SuK9TOT67/315PzVYfHAT+bx1Pry4PuiMNWmMdaqN9moM9fv2vqvOdvtzff15/ysN9mxO9yzRN/13/ysPdz46Py/SeTFVemPE+/EUOe5QeC3P+DJW+y9SOOfLtPZYvT46/2TGOu2R+GNEPKaI9/PXO7t1fjbZfWgLNfu0/jIV+rQX++ZKdCQIdSWIOGmN9iYJNvCVOjRVe/CTOaKE+eZKNSgKd2TIdnLV+yECfGfKdqKEO2dJ9ylL9iNHdr02/uHC/KjLdp+BfCcKdbKU+t7B+eUJs+dLNKTHeG+ROXUW/GLGeCFFd6PHN+JDfOuQd3JS+vNWu2EEeGOF+WiNtbOUe2BDOf02fuSGuWOFOuUJdPWXfGFDuvMT+yVHOWIF9vCSOiZJteACeyLHNV9C+N4A+x1A+mGGOPHUOmKHN2aLtKFEOWXHubarPLXju7CfevoxvffuPXQmu7QfuvnvfXJje3dnPHBauTOcOu4bfDjp/SqUOytStugNu6yXd6bKueVNOUmkAxzAAAAGXRSTlMAIxB+3D9C/WLfo2CcxcXf34TffL6cvc/vU7i1KQAAOkJJREFUeNrElMFuqlAQhivICpLehFofgb6ET1CjCwk7drZNwA0SFqYJ8Upq1Ke+/wwz9hwurtT2m5lT0933z+jDLRgMPN/3w3AEnoihkAt1l10PU3SHN+aP8EwEQeC6ru973sB5+GWgHY4gW5jk1LlNjSFruy13FLEz5KGP/p9X5Xg8jp8D1/cGDz+N44WjYd6cKRorAozBDgHUaIX1YV13lo8WdS5OgKfrrxwFDsL1fuogHH80bHrcG/MEUAbqv6PC37ROU3v/zI7mjYb/ofZd/TfUUeyVyQQ9Du5/C174tGxsEEFViX7znYEF++/0AlJF/MmbS+Dtb2C7QZmQvHA2R5uM3Ttm4ITDJWg6EVTwRwsNHwBaqQ0QgrpTEa28wQat9Bx/+5q77/Lo3ycD72nJWOpsL/4NTV4Q3evP2krrQ4rz7zCdog3gzxFg/Wg27/nqvxvyR5qyLCPUJIomUeDdT395tucAyL8p+EEAyt5MwOBwsN0TLmRgAn3lLG4e/yvswdmerctyIoUUwNi/i76eAA3Loxu8NKeWYr/fFwu8pyzPEUSW11mW1TX1IevY69/pFC36SSL2cbyJ2RyNR3kXe4H0eaShj8H7eLsrGOj2vxo8/AlTVeTN6ixPb1GcsgL6GUWAb0IGyJ8TYFbpCtghYEg9QYM2gVh4pbHtgS4fq9fF4wi6BIMb/fSJPRfbV7AXOILWXi8A+idM1gvrrwiSp1a2WpsY+hguiuCSP906tPkC+nFvcf1DtV8qpE+jQF5ZIAHaPqYvgwPkoU9vukosNlr4SPom6m/IR2hOAK8ym83KWWlx9ffAGen1f9tTG/IoNlcWSgbWFy8A/miTrVYM7AhIHk36SiTAEto96PfAuW79JP5Fj/IX/gafmIXtvpcS5TXNCupo3j2eD06ASKnnsNf1b7cxdWzxrlj2ZfTyEkWia9RMX+bxil+CEOpfNEszgcriE71g4P/J5sJ6sRbIXAIgPmhA8pEw8/m8fbYEJ2DKm/r29l+QgOhe5IpfAmf0j9SyaWkjisIwrS0I7bbgIn/AUDBlFm4Ds8hKs2lloouQILrLIiATGAQDycZf3ed85c4dTTX2Oefe+LF6znlndGv2eQKUh7XKNzQ8oE5BigD6mFvxlam7OTef6N+r99h4CrL1z3/P74JcX+xzTuVw5Xz0Mfj0ZauE/kblOQ9afDbKs5hzuKhnTQDXMgLg9kupezEPrqgLs7+SekojwFtKL3D/3F5xccBeL/+CuwWPwUcef8jyr/pBs25aeAT0LGX90A0A8nSoI8/+XZ71y6Fh/jTPuZun+Ef2Q7+vgjgDd2EfoJ//MYFvBB+4N5tbGv3Zeq++FFxzHPbPZbD7WjMQj74yZgIXF2NPQHoIuvrJHlrr79v+T+mckC/8KCfHB/pvFey3txv8Z7cz/BNNhok3DIB2edG3DNS1qtPBlbgbZTkuYwREwNefE/LJX+j3+5f95Fvo9uOmikspvZSjg17/4c8ERB//dgAqumoPICH6Qo2/URvy7gt/2z/rl97p34wFVZ5oz0ejOTUy/46+4f7hzSn0FPY9aEiUo4P9Af3ZZqbs078mAKlSAuItWC/VnwkYZm5XaZg+TT3d2ADUH338R7hLOaGf9m/OdIIfKTEMncDB/gTAJ8DlEah2NHQ3AKuV+HNgpfrBfRuxd0pB9DlywWQ+gVEbt4+nP20fzpL4Ty86wa89DMcHPv9BSkCFv16N1nU1NfsUACbg21/VMoM6oea4O2OpFAHcXf9m4owS2V8/9++r/dkplcw5r3N5+d4JfL0N/7DfaK1lCFWbaTWdTq+b9v6BCbB7j0A2gMd72OmXbD8Y0+g7XXt4GQBfPnVWnLnkgJO+WFiZPingTXny6b3//4S+uQdVNaua2D76Qpb/AHd62B4A9o++/6BkAoEFwNiz/zwA7i9Y9tW6p6dHFxBDcMjA2/8PfO74awJcn9PZPvqcYJXA3dj5Gzt3lw9CPgUgi0CuH/4uj77lfoB3gm8W3Rgwgbf+K/6xNdzfymH/0EiZfh4AXgDOkh4OaZnDMA2ADAS5fjlO+kFXHzJ/DUCkfzAoegPoLVoFi0WWAV6G39/8A5DvP6MKEKdoKrE6TwkAnYDKox+8OoCbMtt/sDcA/vYHe/cNlF5ONgM6ZnD0zxeA+cf+YdPVb/RMXybg/Bx/118Nawp9G8AL/449144/O/3JngCEvQ1AMH0aYw5N/er1aPvJX9rN5bWpIIzi+BYFFz7AqOSWLBTflSKloQsTEFcuBR+BVHBbQUEUpIviMjFtbSmllv6tnvkePTN37qRW6ZmZGxvr4nfmfN8MCQKfMTgxtQHk/Y/5dzl+uv/OzwR81QTgdcU1Go1evsR8SX6sV3Tg1bs0AYM7gzuYoG8KAOBBpAb4tpuehAXpu3ORBVPawLW0/DFzA4ZhQGoB8Q8SMB/wJQMSA2hlRAMCfFjkBz6m0TMB0JImAPjgN/wkAbr7c6CfJbvimwFYeHovMBWL4EzS/+gA2PEwftUyxnDYRwSUHvhvA7zQm4z+2SjI8GHASGT8YJcl9K/wIP8SDBB6237Meybtf1IAef1z88GukjciC84WDKidgGkBEN8cEANE/f686huGw2OAHuOZ4pMfCwEYRfjGj2kGhOeLpRdLA5HwswCCAdx/zATf4amPmHiPKSgVwZVaAJRcZ7b/y8vgDwnoiwVmgEzh9weebgCeFgDDpwVAlwX5/mMGiQGDgd0ATcr/2NsfJiWZ73bJTx/owKniCQA5PwbF64/zQ8M+ZA0Q8gpgAr5KBFgBln5Mp9ceIOjUm7CWVANRHADQewBmzYFI3Vvdbneh+wQO9Gr8qIKg4klwjfyEfx0eQ+M/CD/xYQCWByBYUGsBkDuA7dfhGWACVPQB9W9SfnNA+EGv4glICf3CAvAXYEAPSm1wBy6VOmC9/0F5BcAAzP6yBiDil6fBf/YAIAIrGGkPBD5FAzwARp8HgAbMzTXhgx0jqIfpiqrAe+HZUgdUC8guz1oHcFkCpAWYvAnOB3ywi4TYEwDt7Uy2xutrnU7rpqjVub+2Pt6YnKtyA1Sof0zgqwGYNID4EOBdPRggj5CENARNEbioXwA4PS3AyPlZA6p5SughwfcegCXa35mMO0Au6v7mxrm75GcFRB8CCL/guwGsfvK32712L8oAliYA4lGYBeADO0C6/8N8/xv52QSUHvtvCdgj+yHqbE6qmL92CfLyB37Cj/B3ia8WVJEJUyNwJnwFCDEAbP/N/OgBhQBYBr56DGTnx4j7UdQZb98dDOhAnACI/HEFOL2pCqtHWRdojMA14ce3PzwANQJ5/pmAsgHGji6I+O9P1m7+k9Ymv5t64F29A0BpACDlT9SrggniQ9wGahE4cfAdsNKzBZT4+4UA1LW/C/p/1+YEBtzLWsADVUMCJPqJqoopEHq/DpxMvgeCYACvQAJPlfe/HACM3a1C8o9SC7/LPSA5AS0BNXgoFEJV7wPpdfA0+P0b0OYPQModsJwAbv7/6eF2/FF48yWILSDBD8tf1AD2gUtxC9QEQJL/1YS/0P+oZv6dqfg3dOrjUHUmtY8CD/hn4wuw81NAp5gBMSBqg1eiAKyyA/AAsNtfKQAU8W83UxOb5DfiUbLgl1qg/HkPzM4AaLFytWVUtaPgFCvA+YGPscoEJOkfEr/IT/ycnha4iFx+jxYEAx6zBbAC8v1fxAgGtDGzCHgGLvEMcPE7cOC78v5XdIC1nyNhMgEyigngr6UWbHsPVEkFMACgjwxok32x5oCHAOcAz4Afwv/+g9KTf+iiAYfw763X6ZOf/En0JBHsDvxNar1KL4LpHUDwGQFhl4HpOUgicJ63IJXhvwZ/Af/wApi0GuC5u3zBYDRu2Ip+lT9Eam2kPZABqDfARagK0yKgFvBKGBw45S2ABqgF+ArsSPtPA/aeJ/SOxx+zzJPTX5O/zEL0qCoYUA8AJPz2jKvAE3BZ+U9GLcBEAwr4BQO2ai3PFP0pfsr7GTTTIL+U18IGSyA2oJscAAeawZIU0AA6oE3gjLcASPFX2QBKNwDyU779hjRNtMbtoBl8W15pURSC5kMw5a+wPAfsA0kXOMtbQJIAsH9X/iOcAFr9bHT/p/q/T1LQ+mkGzBZKYJGamUEGsCoXbwPeBa/mFQB8LOcf/k0BjDaiA+wYlKZg/EQc4D0wSwAF+pm4EUT3wQtJD/zCCgj4UHr9L+Sf8Vf84+DPU/BoxvlZAbUO+FTgRfInJsAjYFehT94DvqQJ8Bvw3wRgt8XtP07RgkfbWQ+o7/9TYcfS13oNQNflHij/ASY2wL4ErtV/Tk9NDP8Y6WmB6w9v5/7aZhWHccVLRUHw9kO80L6hBrUaFdu1IJIpFBWVjnlBNm84UFj7SyeSiSjiYMY1TROb1Rrb+a/6fO/n5OStlzmfc96TqKB8nvOc75t0fb/uugHCXxqwsgITlB8GLKQGyGeB2+kmcMX41QDAWw2o/wJEwzX+3/jjpgBdTwPgDjj9wgpdC4nKCNBt4D4yQB8C0gAI/od/9xNAfwq/gesWKkLQdwPK/cfmqwF+BiIDbsA9dBcUA74W0W8Bx03wHP8haNCX+CU/1LDl1pgRGRiGAWGBJUCO/0qRgNSAO+ibABug+MiAHgDAn9Pb4GufFviJAetJ8Ws0MCG8ykL8eMF0W+LdTchq4dJ8+V1Y+FV/4QDdBx9OA8APAcCANAEn7v/O6qCyO5/BhwfhREhcMldkoVVl/ya3q0ZxCGBAyY+L+c2BxbIKmAF3SgL8CEBUACQBmPJnwHUGrA9Wj1rOX6/woRRnRC4FFvoiKeGIWFANHp97wmuACehMD15e8bIYEVjIDKCvQ5spP+DVAZZwY62vf50jfAgU/H+rR8MHUUQk3pcpeey5ucfnm6gDVgLiLuDxx8KvZkFEIAy4UhoAAV62/1x5/EP08be1c/ry4VLKfxNW8PAJYbUhHmPVAzLC5wAUYHXA9z9LANAJfsUPwfSNEF+GcwPUAvsNKFx5BBw/7v8j/F7A0ahxSxVumCWtuWcff/wX+TxA/O5A3AMF/+zK4uLiAl2lAfRJ6Hbm31b+LAEYLDhQ//kPWzGBAwhBQ1Vh3ALlh2T0Ir4MLTT1MyGdgcCPMwB8SgBbIJpfCAfEgLskALkD51LVff6dMD/UPoIB72YhqGzcGk/25ujPx1/Ys/vhr/4T0eC3/OPiCNghyMvg3TCABH6W8tMw5fQhFH+Iq99Qfkv+aMnRQ5kL/40T7fHTT9OPRHb9dtiYyz8IMz+T8/678kMgn4XvKxMAJftPi+OHdpwfOgQ/6XD9nyWg+jf4o5f4h+PPzi833IHWgpVA49ftF3otA5KBLAH3sAHcAKLmBOh9cHVaI+eHmjv6sNQfg8bfS0BF17+pGvizUv4Twpde6jcgc+C3tARqAII+IpA6IF8GHrqyLQG4RgZcKwwA+rnVkn9g/KIxJ+Aq5h+jEjB/X2H6q6sqnJo2ibQ/x78wSgn4pQFFBnbjBKQF0Oj51TKQnIE71AAE4Bqkz0GeS7U6S0eV8psm9tTwVbMAqipQJJxVAR//sFT5T/aP6bdm5bfl5lFwzAIpA8oPxR3wrPJHAEoD9FPANrUB0Mdf/9qAVsJfEefQ+cmCwbpsoe8l1KgdVb7/9jqVpHb/+BV/au7p568rv2fgkyIB2H58CMglBsQZeOC2R7a3v6bhDQC+pcc/DZ7GDI2dvzIdMj+m6HCdmTENqWI1Sn76R+EVzdw8qTLjr754RQzgBMwbfzhwPSkBtv8YZ/MUBD8bcC++DcMBiA3Qh4Czp0ASnaYJHQl/YOGltcMlIDQZVaVKfD/qNf+sIu0fywPEkYB+o3TgQAJg9DQXCZ9nmQAzYBuKBMgRwLAEkPhXYMsDQPgdQ+sMQB/axPjjcFjNNCETg2besOL90vgrbx9iCThopEoOARng4v3HsqYGlA7AgIe3SVkCsodAcGHRAOA6LQdA8t9JHGh1we0maC8l8uCmtDQ6juZB4IfIgOfyEumHIBKAIfSsxVBUwdSAa6IIAMZlOMD0wh9//l15AXB1MAaCHxG4aQ+G4+Op/jF6BAZWHXMHGqeSACySBSaEYHFN+HMD7mcDwgHgk/ghQMxVnr77GPCg7/wdF3nQ+i7n36Srt0nXZPyPTVgfHbzCjbSCP4rgEqHzCcnLwJ4bcJYdCBVVoM4APgTpU5CrMiIBkzgAUxok+GDH2sPa6232oC8ng/56x+NCk18wptUajo5/zvvnZQY8NeDsRQbiEPwaCWDsMGCtPANhwJUsAcYfFjA6Llar4De1uoGP2SP+ngzVxmQwHu4JepCHBet7o8HxV9FFL+2gZPzQvvB7qQwH3vA/EWD4OABra2vGv5hEAAZYR1Cit88BKb/8Dnzo0G4AnVKDogTABKX/HtfHNKA/fj8eDMaj/lA1Go3Gg4Pjr37+hhT4ZgDRYxr/XFXIHdjVBOQG0H1gdgQehAHKzxZwAtAR4TKG7b+hFwGojcDFi3QEeoSf6PuP2QLT24UMXy3w+Pv+awnsn2DAshhAnwCNXSZCMIOfDLBOmJQAa4AC/EhAxn/o/O1Ou8LAmzbT03oI9ovE30PrPNl6WuWd49fzg90TMLsCQr9Xs+QRKBIAer0TrpU3QjJAdJWWd6+GBSKCvlwGoGLkSoa+wJGh8GNhD1gRAOd/GwMz7aaZN1HEDE3tPwegPgPLOf8aLxBlwBQ1gBNwRR24ui3faC/RCAMu1wQAvApu/LBkQvS9q9h/zICP/e+FBbVNJIHPY2b+6R5Y60BEIHZfBimNwDxLDJBWoIQfjcDCAFYZAMaFBRBeXCPuGMcuyBL0zi5DE1AG4BvwJyr4B3zjqD8Eb2QBcC3yIppRBNmAbWXHoFczoAxARfD5YFXt1jvcMi/1gLUlAQhFAj7AAH/gSw/N8vzrs7P79B/CVBPKCPxKd0HbfSxYhd8DYA5EDUAb3DwCl1j+FLhpzwNQNw63ROQDzd4WsW9R+Le8i2YeAOCHyu0Peub/ndmxYC0MKCKwFlqUmUcABoBd+DEUXgZagAh86Ogv+dtDghcLMHHBAtHHNQFI+YV+6vNPdA+iHwbucgBUFc8iAil/fgoEPz0Dt20CHxc74Am4JNJH4N2GvhiAA1DvwA3BReM4lXXQpGGNdL9R/g+ijfJ7mNQ6EtPw38puf/rY4HrHpZ+k4zSoAb/FCWAFf/HTcTJAxQmwCHAbGEt/xKAVARCV/O3B1iXtm8aDuUWgtz66eAd4lrDTOqODquHHc7NzgR8hYCOiDDbOiAPBHg6o0gSorl2UBOgRgLgPSvTC8BIIzELE7mfgyxB7AAEdF1ags6SJLhblx+4zPhbb/ah+SeeIUadUJS5EBH6RBET+g39NzsDMBFgAQI+pNSBNwBAGcABO1A3tmCZT36cNVGX7pYsqVuw87T6GKGue7Pj22CyfgOXCAjsHEoEn9QyclIAFws8NoI9wYFd8PgTY+HgQ/sgrwIkaaLswdwGDuscx/Abv/gZetI3qD8Q+pS8Kfn9car5zkjwCp+pPwJmpM2AGXNzkLsCMbl2gTuc6tACcrCHgIfZAV+Br21S84JXpOQCEX9KXN3/rm/YLth+jTnYjuA7+mRYY/mKSABPzwwFeoK4UAH8I/vSeBeBkLd0g5ugXt4GZigygBrLcQRfCEvQqo4/tBzxpn+CX/zICT+oRKFR+I8wNIHShNwNCN+gERADqNbFOYRs09B2odUA/hNA41fQ5FLufGhB9k5YhOIBFFYaUZ6CsARhn3ADmLwzASPvA8QOgch/ACZAANNsna8z7XvQM8wQAO/idniX4UIb/jPVMeP5gWdShJSwIWRncXVH8+gjUJwBL1yXwmN1+BKDZbLoNpR3DIM+lm7+B6dvPw/QK0ef4WdeMZ0cM7+Io8BQrIgL7HoAyA6xIgP9PQDQBOb/gd2m2ogQ2obbMWboB/lLaM9Kap85QRp+dfusatW/obYxUHgM1oJEa8NOpIgJRBMwALYKSgK5Z8F0XDSCIf6c7kXsA6Bkdrzwg+2v7G83JLAMYH9d5mucz8NdJSm+KtnFp07A2sDEz+igLePEIvJwYcIouT8BaGPBqHIHvv/cEcACC/zSaP5AHh3YCmq62v9FVPRioAdErbQML6FneNvPzaBj3OVuAMdU3L7afdUAGGH+YkBYGM+B68Bt+fQLAbwZsSRvkpA0i8PFmpztMDGjxJYo3bfOgnwbg/eiWF/xZx7hQ0TVPy9+zqnHbIqBrqU5SBDj+GKd4YBJ+/oXwVTaA6MEvBmCgD3TCT+pGCWDUFkYTSzN945HYMwNAThbU8efw2e7nj4pbw4hhWxyIWQiHgA1YFgNAjxIARQL0ThgJQP2LAACfZAFwdW9wCaAAKG2bkf1Nlof3s0Zx3CMt2gWGMv5i+5P8m/baoghBfQTezIpgODD9o+HbLAAia4E/ZUCXamBWAmACLfEGw4LRnBC/4bPOswPWLC3k/KqsZ3RC/wIvhg9ZNaw1YPes4WsEwoLFMzgBJE1AHgHgk7L9RzUcSwngAADWlnhDabAwDBhfQ+AKenlFuyzf/Y+KpqnJ8beuYXOC7/zt2QZUXgVB/9MFOgai9PtA1ACgO34YAH2XaagnQHMur0quPkQ0xnoEYv9d2fZ/hvGRbD8cyPsFPa8GRL8U3ARSGXvpgFZBLv8/Af+C8mMm9wFLgP0/0KIGCH83d2A9NcAy0G61gj0OQrMv/FCQJx5oqzjGJ2UtI/OekYGPazfD57W+CCxLAuQEYLK8CCxEDQD7j/z/gepFDehSAMKALzHTEtDiBRJm5EFccO2l6T+fROAzDFpMH5mYvrz7RQBIfYMPE06ognoXvIBTAAOsDJgFkQDQs3oegUv6Ew2z4B28Wg0U7ta0mjKhFg8+Alz04AIug5c3oeAvm0VBwu7aF+bEAMzaIvAyGwD8C6gDloDAx7QEkAW9qIGQFoF3MCBaJlwDEQADTlV68ZLy57LNLwPwjPLnx3/agCfkkza4m/CB8We5oAbsEi1t/wWWOHBGIpAmwALQI36rAdEF/Ttc8OLQSkAddf76uycA+x/4uGp3vwyApd/VbsZXEFyqMgKZAT8RPE0xgEKgRSASoAbo7osB0Qedf7A1Lgw4UQfgB75l4LzhY6mPv/PXBOBPys7tJ64qjOJVY+o16otaK6WFTlERtQwYLV7SWJSi9mKaEqMSY2PFxAhJDYmmCY0vjQmUFgpIGv9X13fba1/mUF3nMjNeHtZvr+/bew4zZ05n7zfUPpJgAHBUTQAA9g2A2g//ECNQ9AD84Q4BoH+zT607gHLYubcAvhGx/X19YPm/kRNQ++XNchTAYZgPBraLvBJaANspAAUA+oc8Af4roLD/Hey3AJCAu+yBjHq37lysekBjH3t9u9Dy6ke4p3Z98CF95hSsIPIIGIBNser+CeC9S7EWZBOEDIAiwDXsFsCXm0fZA0dqBu3L+/5zCSkAHf0/3BfrX+w2AxLAqwagfvuN3aVdseyCPQJQBK5LeRMggLAfBVADmCWAjhZY1MM9vfIBVfa7OyAXQGo/BO/Y7bSlrtkICAMTgxAoAUx5CwgxA5dsKsxXghoAQ2B/zviy0qkAMO6m47GVA2j8d9qvbhfIBhjD/6oR2PJBj4dWU+CA08cG4PZtBMAInM8jcMmaABPACoD8V4CqAPx0AgB8EhhX/wcjWJcSeLh/I9B2ALNf3Tb8nY1klEGILBBJmgePZAF4FwhwSgAMgQGIFui/gxkFcLFsgkcdQG573DcRwRiA2v/XrX+6L94BVDeLo38DwPQz/ykAdo6FwG0oCJzHFgnQErAm4CVAAvUc+AkBaAnQN7aSBB7IYN1KwGe/cv3TUf8QO6DK218OYBI7VtqtyIEA3rtd9QACYA0gARAB6CSAv+PE7+Bgkxc/YSXcJIAswreDCADyxj/sU+0CMJTyT/sh4SAAaJePVAmAywCM/3lNACcCJiD3f/UX7QDZj+B4EpAAWQeN0HWbfr4MAHrhQ+wPaAAIvqu2b3eNHwgABCwEB4oJYAWgBbAJQHFJgAAgAIB9yAPwSYw/fhjNALxVuBwPGhx6fSQAqBn/jgCw/ov7hVKeAEyzxiFYtBHwpSAAsAMsnIfePZ+KQNyzBByBfHIBCWAAZPcewJWwe20fWAcG4GtV2f6prvzTfwtA7E8yBrKJ+LwBcNsBuOqJkADcPpTG3xKAXQGcUAAjZpGO/RgnCW+Ct3j1uwHQ+m8ngMEAJjH+CiEYpCBMYVMSUEyDt6Hcv7QC1oBfGQUAlSZAFQFQAgmALITYAzzu6jpynyOxEuj2X8e/vQRG+9TWJCKgG62ThR1AEQmYUvtOQErAqiAmQlUA+O7PlIAvr8YvAToDfUkAYrgoBI5/Vg73fgj7GYAu+yUA+m8BjFgGJsM2/WevIwGT6Y3AwoIQWDD/DqA7ARfhHs4pDcSmLYQ8ADb8yXdwYCDu4zcTTZ3pZ/7pvqMBMgGSgawR1idsLIFeJADOPQIkwIVA3QMuQjQvIdBF4d1YCI0PlFKxklDdAQBXd/dvABT+W+1OZjVg403/bAUBYCI6wAISgF3l/knAAXzBACQCFAisE0AHAT9qAB3L/3r9f/AEcEbPhydDWQ8clIApBbBtABauLUBKwWUEmADYVwCeAGw1AawM70cJjB8gMvgnADSrX9rv/hsA1PiHjk+SgJ1om3tKwH4AUPO0XyyFDIB8aNsB+Md46h/Du3iHCXiICOAz/dtf4/+Njvybe78CMFCTpQrjLAdbCuOiqANwkQEAMAIOQBPgAZAdrulf9Pf/A/BAAUDff1b6by+A0j8vgZQ/GwRZCibC+Sk7Ff75xAFsGQAYN7EPFguBQ2JfE/AFe4CcywT0/x8A/9yLMChXfy0Be/9XNEDaD9nL7SoAZRTSamDqhALYM//UiiNgDRgAIyD+2QPgWa1/YwHAyS+K/jcAQwDQ2Dfntf0k1n81+kSwU/g/hd02YpAtAGgASGBGM0ACJ50AAMSXtwyAC97FNwCYTuHd0H8GsH4FAExE0LZ/Eujof/QPGASQE4CMgrrXScAATBYAVlZWFlayubBNgAKIDHyDDQhkj5LAPJgAzGIL8SmFhSABcPrj5f9m+neJ/ToAlK2EOO7MgO9WAX5ZfKL2D5UALnkCYN0Q6KeXmQB7MBgxDWAtHI5BgU8rGHcSgG8/o30TAYgq+1Az/ARwuAnAIs6LiiBqIS0D9mMdCPtQICCAVAL86pKNPzzrZntoNwDAprknB4ehe8yC6ccim+7XPfxtB3zffj3MAQxn7rFxl5eL+jDCSSBLQALANhgAmICrmoCLkQEyMApfcxowl7O+EQifPUgVQP/Mf+X/7e7xf18kZ0cwAY9BgBDUvQeAPXAlJgECUARG4JITAACzbwREt2j+Gyh9tvWUTwNhk5sT4bOJK1ECY5qAdvLDHwAPan+8YbwpUrCPuOf2Pfl8IAB9M0z/LIK6DQKAILiqBYAIQBeVgQkUzP8tdkFGnb6LBKwTAET7B+XflLm38FNCYMesLqpVL/5F1gF29kADEPYZAb84RgAYf5N/iUPk/kkA/0y64MAEBASe7l+hf89+2/1oH2rLP90pNSewt7iItEvgZefQZ/UQPXAD9nMA56ILtAlIkgiYxDalAK72y2kg3OuZu/dAyD/8WF/9MP9R/V0XwCL/xyCc5VESMLy4CN8CYbFYCSAU8Sp64N5NAqCsDbIJEMBVScCtIPDND5n/H6QAQOCEdUF3HxD4klkYg/8PLQBV/Pl7ad3tjw0Q1pMsA5uIgMVeQHj64yQNIiYBtgAZfQgR4ExQJuDHmAR/D/8/AMDXsI5DdQsqm8BsBoGjP4vn0N0rP1zvAJB//rWq/9q/D3yJYGdRA6BFQAQ4DAqqw9eB2zdvOgDaZxvkRIhZIH2DXwBcDQBqHwDkQ+14eatqAux4DkMeoyruXZHvPjT+Ofqmjukv818A0G6wtQi5ddusF0QJsAUIgN8WFi7D/+VzJgVAAiyBHxUAhC+xiX3oa0oIQLdujflKQEfa7OLsDyZ7+s91AOB3Pvlzye34w34NoMh/HYFhA5AlINci3wuvSAAuw6xavywQuBpSRQ2kBEBXDEBFwPxDm/F+aLZS9Q/GrqMC1H85/cvsb+IHAAavf2m/JiBNQCGkEOQCAJsEewjAb7/BrJnvigAB/GgA4B87ARQJuJJqYPZArV/h9/7Ki99F+Lv6P/PfyJoACGBzAhoFChVgV4MUwOWFc3kCCCDvglYC9vVtVdgnANMVqwFrAgdplwD40Q8r/3b51z3/txIoux4AJyDmmQMCmJcOIC0gEsAIdCQgKoAEKgTy71gDB+nBdQAI/wMXPzg6/LP+g8AHVQSG1HwhEoirQRPWAi+7dSCYd//QIABMQADABU07cF1HauCK6B/OA93avp4BUO+Mfzn8fPvf+C9/MosEpAag8aIERJYDzgEggArA6HsC5ueFQQ3gkpeABYA1AMG3CQwSgbETnAc6db8JAPx31L/5J4D2F7Owf6B7ENhdXI0aoGI6iFXQ8s2b6AAWgJ9//lnME4AsB2dAIAHgFEAAMvCZtAag+1kbHJqNkz1hBbADMP3038a/+c28LAAiQ+A6OYQA6E6ldsBV0E34dwDnfsY+D5UJIACMf7QABqCS18CDsg3SOp9uf84AtG/9Wf2dy1/aJwArgyX9RzuWgGBAZS0QBcAEmOa1CLgaJIDnpQIaAESQA0AblIsCCmBIdhxVCHZRAc0X/zn3t/5pnwBY/5SHYGlvFd5Xx3GulFpgb1n9MwHz2ByASv5UEE3gSQCA8hJoAwAedRuEX9mwk4OeL6QAcPFL/53tn+Xf/lwOtXRsaenY0CrMrzYBKFrgbxEAAHCxCvQieQ0ACFoAlMZCIxAXxmAWMgi26b6OALADDux+NN+Mfwtg2o5pOS19sCQENlYXJQBCYRxHHYC2BcpG/wAww2mAAH7EDVxMrICKwHX8S74jUvtGQU/2uGsdkA2g6f2mgf4ZfwKgLANLSydXxb0icK0yAEckADmAeSAY/Xl+dHQeGEAgpoEZAuDd+zgJmMZ0U5l/SC4NTr1lAKA5bFAg2GYHzH4pPgfQ7d9U268QLEF3hYDEQM84VGkOFP/RAuAeCEZFFoEVAgABA0D7SuB6IkBhVJ3A53xDEO5xThzuMwCsfyn+7sVPs/4hgHBPLQEB2qAZt14gT4sAWAVAmP7UPgDMWwAsAjPoAYMAMAFyPSdCQAKobgD4/FTeBeYm5Mws9BmA8meyu6/9Mv7Y2vy3CDQClKcgOgADwP4HBCKLwLmVmRn41xKAagDXr4v9H+ifGbgO4T+qIgACc1b+eHaP/r0B9Duq//jx3b29rQ3X1tbe7u7Jevw7tLS0tVqrXAWrfxDwBojxH5UT2yAQeAIA4CUCAIG4i4td0cIhAocPIQGACMhaYMojMJtvCADv/RwNsF+O/tnDexs769tzcz3ss3Ozs71eb67nmri7v7G1d9KHv5vAV0MNgHoKgHTw//jj5z/EvkkJlACePfQiAcBeBkCMi+xRCWgE/knLQe99OGy/92EA8G//FZd9Tx/eugfnFKzDf6vt/Y29k5n/r3yjNjoDsMUASP/D4dZ187dE8L+gNfBuDYD+FQAFACIAgPCJMSwHIwLY49QvCiCb/mB+Y108z85RcC8HznKarSns7M1U3gPBUh0BaYHWAbeXAcD9ewJGM/lEcE67gDVBAjAFgBh9NaQA2AX6fFPIVQB0j/6L/nd4C+aH5nDImbI60ANnIWHexzMI9jsB78ntIBSHI9gYGICjR+ZTAMy9A/jDMyAR0HkA8hpoAfBWPpWI4D5XQ2HfA8AGEPYPb2yrb84Vg4UE0D61ub/1VRIQrE1Pr2F7b2i1h83EKXBf/AcAcc8AsAewBgzAM4MT4IIfJMDkAIBgln3QNJsFIC0AZOw3hyhNQKeQAOy0nzHYyxHkXaBXd8AiAAEAR0wDo04AALwHPAUA3QF4DTsJMAP6tnhqBATEu6tv/tP4n76zTt+y6Qs9wEF3ymqgS5sbM04AhbAm29pmr0f/fBvMDugRGC2lBGYgJAD+HQAJ0L8BoMoQ3GMRRATuZP4BYHhjk0tlWlcNToBs3WIMtAzW9no9+JejLgB2gI/U8kfYmAFNgAFgAtoCaP2/FgCMgRSBL4dMd/u5/8M++LZYnMAc4SMvmxKoO0Iv2mGrcY/BltmXA7rbE/vw3xQAhNH34Q8IKkUQACwCLxx6rADQjP8b2AZk4AFmgqIN7Ga3voV996fmITzB5gFozBMC9v+AQLWwqgQ4A9QFAOno0zwToDpfAWAHoH1jADkDpuC+LYcmT42rn/X0ZwCzPzE0MTE3IeM/FAlQFHje0Q57B9dAi2CjVyyBdqIAIPP/EQBg8HE4BJ8Iw78n4Onk/y8HkI9/CEFgBlRlG+hH/mHf/NuwT5hvP+P1rGxFAyyrgHXQhSAAXNssGsAyAfj4W/0rAPq3ElhRAJcA4IkcQBMAOKI0AmRwIbUBZOCON4Bhs2+b7ZZ+tS4IojOoPAqMAHUgguXltbXltT3xHw1gYbnugBp/kXIoegCnAQB4XAG0/nlVX8o6EMSyEEIbCALb9n/079O+JgCGgwIeZnFoEeCZcTAKZp8xEM2lbYD2Z0AACHbYAOfNPwNgBFQMQERgRmQA8IuT1RTY3tFMKbiiDwiDf45GI3yg/8edTfiESWfAk21zeCHuxbofegox/Q+Pwsay6NpQrAD22gIQ53pAZQKg6AHvAsAjBuAvCwCcVffzAwA7vBUIAYdw3wiM3Jf/48G62mUGsFebw4nh50YRgQWguw6EwF40wOXlpgN+hD2pXg3PpB7wCACwA0QA2m+0GYiog9A9JTBhw+9Df5D/WS8FeXAIOLI2kFrhw7V/DgT24Z8NkAGAfScw+qluXAxFBM5bCTx66FB0AAIob2lH4ZUAyBisg8DsAxl+eJMAQAGAIEjATt4WsUwwAL6r/VxD2LpgrC4O7YFATyeAfAnkAXD/nz4sAfjl6efVP0qAARCTvKOHHZoCy4ApCNwZe+3OOBZEUuO5e7LgFv9SW4IslHxlyNWwusauh51b+QIIyZ8/cXQbHGL86d/cf4qdTcACQAD469hhBUD/TQN4G7uLCAKAzAnj98b66/q+CBkwhVUcAaKgwDYJ/xMegCHPPk5BQFh0MPAF0OL88sYkht8bAN8FswF4GTADBiBWgs8CwIuSgDoAF/hnvVJMgan/2oNTRz5GJ5QMBAKPerite0L+JNogACgFaM4QYPNz63/SF0AnNpZXNP91AXgEIgHsAZn/GQfwDOyLCKD5Rnsfx5v9Nx1AMHAMm9oJfUU0MUiKoc5BahMiWw9g/MM23aeaoLJLIJPivl4BRP1bDbgGJ+ApAHjMAOQVcKFw3+/DPvwrAgj+k4TVuhPA+4JeTYBloQeHPxBwGvAnZp/55+7SN4Dx5cibzD9nAI4/xCbAJsgEvAAAT5ctEPYvXKhuakf12QsoJfAxCIw7gQ4KEgI9kwMB6FP4rHoAdxzuf4T+1T6U/EM+/h0AoCwBTwDA46kCxkiAf9fq93lbU1EiIIj881/3lMAUvrTERtApLpZqyehDDEC9M/42/6t7jn8RAHOvJ9GgaVAWggDwCAFAN8bMfwqAePfd1Q8ElN1sDgQYgg6xIKAKQk8OH+0O+/SP26aGfwLIGgBkCEaRAUlAaoPwr8KXBrAQ1HmQADwAr1+wHoDh7wsBV98gvF0ikGXC7sgrbAQMQZc4TRICJV47hz/8H9li/MM/J0DzzgQwAkUCsAyAXkpzwI0bYzcUQPhPACimoNDwSDQChGBubuI/qiVA89Uew/+xtf9RWC/8Q3kDZAKcQMcyAHrG/EM3UAL0/7oCoP1Xcwb9AgEycdpuOfifQ8CVUgXAoEQK2uG39neO7lXW/4IAAwDVACDxLwSeUgBPGwD6B4BIAOwXt7QqYoB/r977ViobJ17xXkgEne5dRFCItln9kxz+Izs+9ysA5p/+KSTAFoOpBUCcBESPA0D4v3Ej9w8ZANinLAtWCYDAzz9YGWgIJlcflgJeLxgsdU77HH6Jf9b96wUQ/ZcJ4CwQ7wRsEoAeZQLgvwTA73O3CMCm1s5RD8EIPrrYe3gh2DujLgA+J9C+3yz0Zlv+HH8CSHXQtIB4M/juo4dUzzMBJQBIC6BVtIRwjif64riEIBCsdiLg+6LODEz0aF/Tj7WPDv8e3/wX/jkD0L7tQDA4AeiB3gXZA9S/SyqbAajFnqhh0CfQzgmpgxNThmCcDLpAdKqnMvueflQ/F38Hjz81ygAUk6D2wOiCat9LAHL/TuDVbhUTpJ2P4/MDCQFjcPCaqB1/iOGP9E+M3hTV/q3+sdF+XQFcCfN6kLSAaAK6ChAGuX8I7gv/ZwZBwFbd/rVGAAZD/y8D7r6w38OFwNY/pP47AuAI0iTAOUDWga4X473wjQrAoI+0d3EwCHbecgSYEYzBuNTzAf2gY/BpH5e+9VJw65/V32m/bYKoAGkBoccsAfks2DcCdQCwq/AwgACzQASIgc4JqwhCXQ3F2yJ96BXuZeL30Yd9UVf+OxoAFwJ5ACIBL4R/rAQ8AFAEIAHgLR2S3vfHzqZABGRgEExptDkJ0rslfyT/0Zwhs88CoP9y/EeTCKCzB6ICQi/pm+G2BACAovX3/c4Gorocompw3poAApsVjYFBSBgoeod5uLfoq32v/RoA819eAoFz3UzpzUC9DJRFwJNqnTUwFj0AcgD1dzrju/xJXUGIyjl5V2MABg4BFBSDgaAWoUmId8Y195j49veWkzgDlv1fpGlX/yKF4BNBcTGAq4AnMgCPpiag9rH1X/cA/EoC4fwYDiIIKaMWxta2/14/GACCUQCHWiMq+6kg/obw0N41Mb6Ggx2ge/4f1RM3fc0CYAs8f0krgHqxnAUusAQq/3Rv32tXBl2N8YwyOYlSUAaA4BQcBMWfSUrm4X4H7s15HoBknzMA4x8MrAxsHTRKAvU7QbbBKgEO4NVIwGlYeT99pUFPOGyHoi2KX86TbJvDW6gFhwAKygEkku30o7FmHu6PbG9cW7PBl4d2BoB7VVn/Mf66Q6j/rgDYKogRiGkgawF4058K4PTpVACNLAZymP8ztZTP7samQRAOLlhW2+HcRn5qe2dmbc3th+Lyf9kAIdqPAOR1UAJw/1wE5BEggJgFISQgAHgABgOA2AzkqP0bvuG9nc1xWASIVkfN+9btNZfaX+uYANv6H/UDmz31BAz6qyBbICPgABgBUdh/9fSZM6cVQJcMQRRDq2zy2MUnxu9uTqyOHDmqOjI1NbS5vbOxNbO0tLaG3aXu6V8BVAEY5QogtpgCcOqqgBnOgXkE6N8yEAkwCPxWd5fMXetcdtZPDnGpFc2HmP92BqB/dcwm4C8+yqbAUQaAHaCIwFhFIEsAAnD6YQDS/NAMPHY5+fnYmaX3sZXu12xbSwS0+xX51w7QOf6Q9/7Bw99cDGz1CPxn82DfaiBmAahugh/IaXhwDBwDB9/+6RJ23+AaEUjuVeHfnVf5p//mCmAQ4AJAX5d/EWMAuAYo9Jh3QVXZBdEDAOAs/Wdf7tSzZ8BEwyaOP3zL0Z0A+s8SMNA/lwCcAXyvA8DxtwDwbVCpR58TAFwK9Z1AGYGzdG9nEf+Bq1gu6iv3zvF3BAwACbD7037rn1MACRQtwOy31wLZAes+2DQBSLqg+T8r9ulf86/usctWSQccUsNnjtG9RP8Y7ScItK8EOPzWAJJ9NsBR+rfUKwH3zjVw9akAdsBGz3ApxBqIAIDAaU2Al746H/5gePgDVw1hCf0uhh0vfGua/xrd19N/W//4LrT45x9BiUDEK+H2T8I/AYh/FkBbBDealYC6x24IIJh3Bm4dDMDBGTQQuHX5h6ax5/4h3Boe9pv+d84DYO3N/uSBs8545UXArABoXwLw5KOHOvVIXgNsAgHgrEi8GwMxHgoCpBBn9WxP3L4hYOPHN0AQgOks/V8pghj/azH8Nv7zVgFOADIAFM2XCwDOAN16LACwC8osQAAQnGMXJdfHSaBJgvrFA31XCdDvgDAAX4n929jUv98U7vLlFf82+LwkYBT+1X6a97KCkIMfEM8nQGwsgK424ASgvAaQAQUgXfCsRiAYwDn8Hz+OAximiQAHfIvUvj8WUuc4sLnM/W0WgN8STMcf0gTo+AcB2iaK0RD9138LOLANtF2APUC64FlxDgZmH7ax47BzLSkF2MfRaBoyBmF/TbL/3m3VtaQFIRD2kYBRBCAEAhECq4IMwDz2wv9BDYBtQAi4f9YAS4BtQCnoNGAR8BywKzAK0JId2vH4tVBjoOYh/7XoZRJQ97wlmBYAirr4MlAqAP9ILPZEoB7/J9kAugm8DACpBIiADLIeYC7NOxkcnwYGmCxugkEO04V93XX0Re6e/oXAyoLZRwSg5I8UfOCr3teO/2H6P0BPpwio+f6vv/pKiCEYzsQEZDJz8MqTGaf/TF/F8GsAVOV9oc9FA4BgrBJ983nr/zwvAvwvAkxAMRNk9mUHgW6pZ2NCtfbRAGGfHYD+IQUwLxVg5rDTcoWBX5Mtxp/+H6rHog1eIIHTTQaIQDPQyQD1EF7xorFvAHzscdB/DWAeAEZBwPtbGwX6Z/t3vcsV4H8jwC4A+0bg1wzA8Fmal/NxmQs7ExAg6D//Vvx708i+IIAMAX8fp0oAlAY4eaVvumf8PQD0/38IeBfQUxYBIggI0PFh+m01zYciBCenxbnsMK8A6J8JYASgPAE5DrpX87V95P9/6d/izp+1kRiI4l4vKOvFdvBVKY642ebKI7AEXLm0K5HmvkUI3PeHe9LM5K2klTnsmPz0x06KwHt6M1pIsd3TXysCMcEiAGZqANCDEogOW/z8PHuoH4bh7W2I8g15S7ae/8nkw4CPsxgQjjdLwJlDofyT6H+o6q8/D0xrAPz+WY1AbIMX9A/6CcnxR3wMyuswFQ/5StAPRL95AF1ngxlg7LX0Vb4ZYPf/NQ78kgjIZYgAvGMkjfAZg8CDug8DAj9ggw1T9HXgYgDW+DoKagCYWBCwJAS93Hn0qfzxSv1guQ4ZeDFgASPAEJTkwmWXGUkcCPKB7qMhAQhFAKgfU1C91B2X2EP5Wv79cnEd7acD75oBjMQE1sB/ZMAMqCbA4/iVUwTypQ+YB2gEMgC/qnZA9dTP9ndVGaANGNGCIgVVihgwBKUJwHtsdIAWiAMHyJeN0ifYr6byR3Bl/FkGvAmyDBwnPGfSGYecIawCy4CHAZ4OKAcxAaI+dKAUDvHYOQ6UzssP7JaL23CP9i8CZoBlYKTdkPL3WQXEmTng4xbVez96YAaEhYP8ozkQYepDmOSMlYU//pmVW9xOiypgBhILjvSAHTE3oWTI8TEE0I8ZGDFpAQi3GU2ow9r3PP6badZsBOIA9BtHsq9QGoBRWGA5MCwFYUghIAtiwrwRvPdOIn/TUMPNdfCShQBjzoNYCHlH0L3qgRf5r/pdsVaAKTmAOig0+Vgfc+oPo+A3bvGVdFv2gawOaEJZD7waZcMigwxM4NkRzQEM2mClcNKQJ4mPG+Rjp/yvxq1pgVC3YC/7bDVgowWYZoHXGfGAPmAG+OJUOeyTjpB6KOdrdUfIvwdN91hJAT3IfYDoI2MwfzlMrwa64DPGBFEr/YHSgfcbtL670bTbLAVhJNAEpqFoCLXeCNKCyCy4jA/q3eLONG6tJogBrISUoidgS/uCUvGAPmQ2YIRNpxjjw+dq1/Hs78vStf32iZUwfUC84MM+8YF1gZXfD9hYEIqv8rDpO3d/8WUWOviwfRITFH677ENigzBTEjqJxySrVd/vOtcsvpll41zXtW3b9zAE/FAgXGb+4CgWpGmQNfPYuFI2oAe73a7rnGu+RPc/7NDmX/6EDAkAAAAASUVORK5CYII=" - return Glow icon -} - -export default GlowIcon; - diff --git a/apps/app/components/Icons/Wallets/Keplr.tsx b/apps/app/components/Icons/Wallets/Keplr.tsx deleted file mode 100644 index bdf7454e..00000000 --- a/apps/app/components/Icons/Wallets/Keplr.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { SVGProps } from "react"; - -const Keplr = (props: SVGProps) => - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -export default Keplr \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/MetaMask.tsx b/apps/app/components/Icons/Wallets/MetaMask.tsx deleted file mode 100644 index 5e6ac143..00000000 --- a/apps/app/components/Icons/Wallets/MetaMask.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { SVGProps } from "react" - -const MetaMaskIcon = (props: SVGProps) => - - - - - - - - -export default MetaMaskIcon \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/MyTonWallet.tsx b/apps/app/components/Icons/Wallets/MyTonWallet.tsx deleted file mode 100644 index 5e638888..00000000 --- a/apps/app/components/Icons/Wallets/MyTonWallet.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { SVGProps } from "react" - -const MyTonWallet = (props: SVGProps) => { - return ( - - - - - - - - - - - - ) -} - -export default MyTonWallet \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/OpenMask.tsx b/apps/app/components/Icons/Wallets/OpenMask.tsx deleted file mode 100644 index 0cf09a8b..00000000 --- a/apps/app/components/Icons/Wallets/OpenMask.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { SVGProps } from "react" - -const OpenMask = (props: SVGProps) => { - return ( - - - - - - - - - - - - - ) -} - -export default OpenMask \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Phantom.tsx b/apps/app/components/Icons/Wallets/Phantom.tsx deleted file mode 100644 index 0d34c11a..00000000 --- a/apps/app/components/Icons/Wallets/Phantom.tsx +++ /dev/null @@ -1,29 +0,0 @@ -const Phantom = (props) => { - return ( - - - - - - - - - - - - ); -}; - -export default Phantom; diff --git a/apps/app/components/Icons/Wallets/Rainbow.tsx b/apps/app/components/Icons/Wallets/Rainbow.tsx deleted file mode 100644 index 5961e95c..00000000 --- a/apps/app/components/Icons/Wallets/Rainbow.tsx +++ /dev/null @@ -1,55 +0,0 @@ -const RainbowIcon = (props) => - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -export default RainbowIcon diff --git a/apps/app/components/Icons/Wallets/Solana.tsx b/apps/app/components/Icons/Wallets/Solana.tsx deleted file mode 100644 index 4489ec4e..00000000 --- a/apps/app/components/Icons/Wallets/Solana.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { SVGProps } from "react" - -const Solana = (props: SVGProps) => - - - - - - - - - - - - - -export default Solana; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Solflare.tsx b/apps/app/components/Icons/Wallets/Solflare.tsx deleted file mode 100644 index 8be25211..00000000 --- a/apps/app/components/Icons/Wallets/Solflare.tsx +++ /dev/null @@ -1,25 +0,0 @@ -const Solflare = (props) => { - return ( - - - - - - - - - - ); -}; - -export default Solflare; diff --git a/apps/app/components/Icons/Wallets/TON.tsx b/apps/app/components/Icons/Wallets/TON.tsx deleted file mode 100644 index af0dab75..00000000 --- a/apps/app/components/Icons/Wallets/TON.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { SVGProps } from "react"; - -const TON = (props: SVGProps) => - - - - - - -export default TON; \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/TonKeeper.tsx b/apps/app/components/Icons/Wallets/TonKeeper.tsx deleted file mode 100644 index dba1f34f..00000000 --- a/apps/app/components/Icons/Wallets/TonKeeper.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { SVGProps } from "react"; - -const TonKeeper = (props: SVGProps) => { - return ( - - - - - - - ) -} - -export default TonKeeper \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/WalletConnect.tsx b/apps/app/components/Icons/Wallets/WalletConnect.tsx deleted file mode 100644 index 02e3cb87..00000000 --- a/apps/app/components/Icons/Wallets/WalletConnect.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const WalletConnectIcon = (props) => - - - -export default WalletConnectIcon \ No newline at end of file diff --git a/apps/app/components/Icons/Wallets/Xverse.tsx b/apps/app/components/Icons/Wallets/Xverse.tsx deleted file mode 100644 index e915435b..00000000 --- a/apps/app/components/Icons/Wallets/Xverse.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { SVGProps } from "react"; - -const Xverse = (props: SVGProps) => - - - - - -export default Xverse \ No newline at end of file diff --git a/apps/app/components/Input/Address/AddressPicker/AddressBook.tsx b/apps/app/components/Input/Address/AddressPicker/AddressBook.tsx index e96d115a..9e3daa09 100644 --- a/apps/app/components/Input/Address/AddressPicker/AddressBook.tsx +++ b/apps/app/components/Input/Address/AddressPicker/AddressBook.tsx @@ -1,12 +1,12 @@ import { Command, CommandGroup, CommandItem, CommandList } from "@/components/shadcn/command"; import { Address } from "@/lib/address"; -import FilledCheck from "@/components/Icons/FilledCheck"; +import { FilledCheck } from "@layerswap/ui-kit"; import { AddressGroup, AddressItem } from "."; import { Network } from "@/Models/Network"; import { FC } from "react"; import AddressWithIcon from "./AddressWithIcon"; import { Partner } from "@/Models/Partner"; -import { Wallet } from "@/Models/WalletProvider"; +import type { Wallet } from "@layerswap/widget-types"; import { BookOpen } from "lucide-react"; type AddressBookProps = { @@ -63,4 +63,4 @@ const sortingByDate = (a: AddressItem, b: AddressItem) => { - (b.date ? Math.abs(((new Date()).getTime() - new Date(b.date).getTime())) : 0) } -export default AddressBook; \ No newline at end of file +export default AddressBook; diff --git a/apps/app/components/Input/Address/AddressPicker/AddressButton.tsx b/apps/app/components/Input/Address/AddressPicker/AddressButton.tsx index 46ee3cb6..019bbaac 100644 --- a/apps/app/components/Input/Address/AddressPicker/AddressButton.tsx +++ b/apps/app/components/Input/Address/AddressPicker/AddressButton.tsx @@ -2,8 +2,7 @@ import { FC } from "react" import { AddressItem } from "."; import { Partner } from "@/Models/Partner"; import { Network } from "@/Models/Network"; -import { Wallet } from "@/Models/WalletProvider"; - +import type { Wallet } from "@layerswap/widget-types"; type AddressButtonProps = { openAddressModal: () => void; destination_address?: string; @@ -20,4 +19,4 @@ const AddressButton: FC = ({ openAddressModal, children, des } -export default AddressButton \ No newline at end of file +export default AddressButton diff --git a/apps/app/components/Input/Address/AddressPicker/AddressWithIcon.tsx b/apps/app/components/Input/Address/AddressPicker/AddressWithIcon.tsx index 80364bf3..50f1b176 100644 --- a/apps/app/components/Input/Address/AddressPicker/AddressWithIcon.tsx +++ b/apps/app/components/Input/Address/AddressPicker/AddressWithIcon.tsx @@ -1,24 +1,18 @@ -import { FC, MouseEventHandler, ReactNode, SVGProps, useCallback, useMemo, useState } from "react" +import { ComponentProps, FC, useMemo } from "react" import { AddressGroup, AddressItem } from "."; -import AddressIcon from "@/components/AddressIcon"; -import { Address, getExplorerUrl } from "@/lib/address"; -import { History, Copy, Check, ChevronDown, WalletIcon, Pencil, Link2, SquareArrowOutUpRight, Unplug, Info } from "lucide-react"; +import { AddressIcon, ExtendedAddress as BaseExtendedAddress, ImageWithFallback, WalletIconView } from "@layerswap/ui-kit"; +import { Address } from "@/lib/address"; +import { History, Pencil, Link2 } from "lucide-react"; import { Partner } from "@/Models/Partner"; import { Network } from "@/Models/Network"; -import { Popover, PopoverContent, PopoverTrigger } from "@/components/shadcn/popover"; -import useCopyClipboard from "@/hooks/useCopyClipboard"; -import Link from "next/link"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/shadcn/tooltip"; -import { ImageWithFallback } from "@/components/Common/ImageWithFallback"; -import clsx from "clsx"; -import shortenString from "@/components/utils/ShortenString"; +import { toWidgetNetwork } from "@/lib/wallets/layerswap/widgetNetwork"; +import { shortenString } from "@layerswap/utils"; type Props = { addressItem: AddressItem; partner?: Partner; network?: Network; balance?: { amount: number, symbol: string, isLoading: boolean } | undefined; - onDisconnect?: ExtendedAddressProps['onDisconnect'] } const AddressWithIcon: FC = ({ addressItem, partner, network, balance }) => { @@ -46,7 +40,7 @@ const AddressWithIcon: FC = ({ addressItem, partner, network, balance }) { group: AddressGroup.ConnectedWallet, text:

{addressItem.wallet?.displayName || 'Connected wallet'}

, - icon: addressItem.wallet?.icon || WalletIcon + icon: undefined }, { group: AddressGroup.FromQuery, @@ -79,7 +73,7 @@ const AddressWithIcon: FC = ({ addressItem, partner, network, balance }) /> ) ) : ( - + ) } @@ -94,7 +88,9 @@ const AddressWithIcon: FC = ({ addressItem, partner, network, balance })
- {itemDescription?.icon && ( + {addressItem.group === AddressGroup.ConnectedWallet && addressItem.wallet ? ( + + ) : itemDescription?.icon && ( )} {itemDescription?.text} @@ -125,24 +121,6 @@ const AddressWithIcon: FC = ({ addressItem, partner, network, balance }) ) } -type ExtendedAddressProps = { - address: string; - isForCurrency?: boolean; - addressClassNames?: string; - onDisconnect?: () => void; - showDetails?: boolean; - title?: string; - description?: string; - logo?: string | ((e: SVGProps) => ReactNode); - children?: ReactNode - shouldShowChevron?: boolean - isNativeToken?: boolean; - network?: Network; - providerName?: string; - onPopoverOpenChange?: (open: boolean) => void; - onTooltipOpenChange?: (open: boolean) => void; -} - const calculateMaxWidth = (balance: string | undefined) => { const symbolCount = balance?.length || 0; @@ -155,201 +133,8 @@ const calculateMaxWidth = (balance: string | undefined) => { } }; -export const ExtendedAddress: FC = ({ address, network, providerName, isForCurrency, children, onDisconnect, showDetails = false, title, description, logo: Logo, shouldShowChevron = true, isNativeToken = false, onPopoverOpenChange, onTooltipOpenChange }) => { - const [isCopied, setCopied] = useCopyClipboard() - const [isPopoverOpen, setPopoverOpen] = useState(false) - - const addr = useMemo(() => { - if (network) { - return new Address(address, network, providerName) - } - return new Address(address, null, providerName!) - }, [address, network, providerName]); - - - const isAddressValid = useMemo(() => { - if (network) { - return Address.isValid(addr.full, network) - } - return false - }, [addr.full, network]); - - // Resolver for action buttons - const getActionButtons = useCallback(() => { - if (isNativeToken) return { buttons: [], showTitles: false }; - - const buttons: ActionButtonProps[] = [ - { - title: 'Copy', - Icon: isCopied ? Check : Copy, - onClick: (e: React.MouseEvent) => { e.stopPropagation(); setCopied(addr.normalized); } - }, - ...((network && !isNativeToken && isAddressValid) ? [{ - title: 'View', - Icon: SquareArrowOutUpRight, - href: getExplorerUrl(network?.explorerUrlTemplate?.address, addr.full) - }] : []), - ...(onDisconnect ? [{ - title: 'Disconnect', - Icon: Unplug, - iconClassNames: 'text-error-foreground', - onClick: (e: React.MouseEvent) => { e.stopPropagation(); setPopoverOpen(false); onDisconnect(); } - }] : []) - ]; - - const showTitles = buttons.length <= 2; - - return { buttons, showTitles }; - }, [addr.full, network, providerName, isNativeToken, isAddressValid, isCopied, onDisconnect]); - - const { buttons, showTitles } = getActionButtons(); - - return ( -
e.stopPropagation()}> - { setPopoverOpen(open); onPopoverOpenChange?.(open); }} modal={false}> - -
- - - { - children ?? -
-

- {addr.toShortString()} -

- {shouldShowChevron ? - - : null - } -
- } -
- -

{isForCurrency ? "View token details" : "View address details"}

-
-
-
-
- - {showDetails && (title || description) && ( -
-
- {Logo ? - - typeof Logo == 'string' ? ( - - ) : ( - - ) : ( - - )} -
- {title &&

{title}

} - {description &&

{description}

} -
-
-
-
- - )} -

- { - isNativeToken ? address : (() => { - const { start, middle, end } = addr.toEmphasizedParts(); - return <>{start}{middle}{end}; - })() - } -

- {buttons.length > 0 && ( -
- {buttons.map((button) => ( - - ))} -
- )} -
-
-
- ) -} - -type ActionButtonProps = { - title: string, - Icon: (props: SVGProps) => ReactNode, - iconClassNames?: string, - onClick?: MouseEventHandler | undefined, - href?: string, - showTitle?: boolean -} - -const ActionButton: FC = ({ title, Icon, onClick, href, iconClassNames, showTitle = true }) => { - const [showTooltip, setShowTooltip] = useState(false) - const children = ( - <> - - {showTitle &&

{title}

} - - ) - - const buttonClasses = "cursor-pointer text-secondary-text hover:text-primary-text px-2.5 py-2 bg-secondary-400 hover:bg-secondary-300 rounded-lg transition-all duration-200 flex items-center gap-1 flex-1 justify-center" - - const renderButton = () => { - if (href) { - return ( - - {children} - - ) - } - - return ( -
- {children} -
- ) - } - - if (showTitle) { - return renderButton() - } - - return ( - - - {renderButton()} - - -

{title}

-
-
- ) -} +export const ExtendedAddress: FC, "network"> & { network?: Network }> = ({ network, ...props }) => ( + +) -export default AddressWithIcon \ No newline at end of file +export default AddressWithIcon diff --git a/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/ConnectWalletButton.tsx b/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/ConnectWalletButton.tsx index a1cb28eb..f4e6dda1 100644 --- a/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/ConnectWalletButton.tsx +++ b/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/ConnectWalletButton.tsx @@ -1,12 +1,14 @@ import { RefreshCw } from "lucide-react"; import { ResolveConnectorIcon } from "../../../../Icons/ConnectorIcons"; import { FC, useState } from "react"; -import { Wallet, WalletProvider } from "../../../../../Models/WalletProvider"; +import type { Wallet } from "@layerswap/widget-types"; +import { WalletConnectionProvider } from "@layerswap/wallet-core/types"; +import { useProvidersConnectReady } from "@layerswap/wallet-core"; import { useConnectModal } from "../../../../WalletModal"; import { captureEvent } from "@/lib/faro"; interface Props extends React.ButtonHTMLAttributes { - provider?: WalletProvider, + provider?: WalletConnectionProvider, onConnect?: (wallet: Wallet) => void, descriptionText?: string } @@ -14,10 +16,10 @@ interface Props extends React.ButtonHTMLAttributes { const ConnectWalletButton: FC = ({ provider, onConnect, descriptionText, ...rest }) => { const [isLoading, setIsLoading] = useState(false) const { connect } = useConnectModal() - const isProviderReady = provider?.ready ?? true + const isProvidersReady = useProvidersConnectReady() const handleConnect = async () => { - if (!isProviderReady) return + if (!isProvidersReady) return captureEvent("connect_wallet_clicked", { location: "address_picker" }) setIsLoading(true) const result = await connect(provider) @@ -29,8 +31,8 @@ const ConnectWalletButton: FC = ({ provider, onConnect, descriptionText, {...rest} type="button" onClick={handleConnect} - disabled={!isProviderReady || rest.disabled} - className={`focus-ring-primary-bold py-5 px-6 bg-secondary-500 hover:bg-secondary-400 transition-colors duration-200 rounded-xl ${(isLoading || !isProviderReady) ? 'cursor-progress opacity-80' : ''} disabled:opacity-50 disabled:cursor-not-allowed ${rest.className ?? ''}`} + disabled={!isProvidersReady || rest.disabled} + className={`focus-ring-primary-bold py-5 px-6 bg-secondary-500 hover:bg-secondary-400 transition-colors duration-200 rounded-xl ${(isLoading || !isProvidersReady) ? 'cursor-progress opacity-80' : ''} disabled:opacity-50 disabled:cursor-not-allowed ${rest.className ?? ''}`} >
= ({ provider, onConnect, descriptionText,

{descriptionText ?? 'Connect your wallet to browse and select from your addresses'}

{ - !isProviderReady ? + !isProvidersReady ?
Initializing... diff --git a/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/index.tsx b/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/index.tsx index c3587764..6d70d7a9 100644 --- a/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/index.tsx +++ b/apps/app/components/Input/Address/AddressPicker/ConnectedWallets/index.tsx @@ -1,15 +1,17 @@ import { ChevronDown, Plus, RefreshCw } from "lucide-react"; +import { WalletIcon } from "@layerswap/ui-kit"; import { Network } from "@/Models/Network"; import { FC, useState } from "react"; import ResizablePanel from "@/components/ResizablePanel"; -import { SelectAccountProps, Wallet, WalletProvider } from "@/Models/WalletProvider"; -import WalletIcon from "@/components/Icons/WalletIcon"; +import type { Wallet } from "@layerswap/widget-types"; +import { SelectAccountProps, WalletConnectionProvider } from "@layerswap/wallet-core/types"; import { WalletItem } from "@/components/Wallet/WalletsList"; import { useConnectModal } from "@/components/WalletModal"; +import { WalletIconView } from "@layerswap/ui-kit"; type Props = { - provider: WalletProvider, + provider: WalletConnectionProvider, notCompatibleWallets: Wallet[], onClick: (props: SelectAccountProps) => void, onConnect?: (wallet: Wallet) => void, @@ -92,7 +94,7 @@ const ConnectedWallets: FC = ({ provider, notCompatibleWallets, onClick,
{notCompatibleWallets?.map((wallet) => (
- +
))} = ({ provider, notCompatibleWallets, onClick, : null } -export default ConnectedWallets; \ No newline at end of file +export default ConnectedWallets; diff --git a/apps/app/components/Input/Address/AddressPicker/ManualAddressInput.tsx b/apps/app/components/Input/Address/AddressPicker/ManualAddressInput.tsx index 859b17cc..15647a80 100644 --- a/apps/app/components/Input/Address/AddressPicker/ManualAddressInput.tsx +++ b/apps/app/components/Input/Address/AddressPicker/ManualAddressInput.tsx @@ -4,11 +4,11 @@ import { Input } from "@/components/shadcn/input" import { Partner } from "@/Models/Partner" import { SwapFormValues } from "@/components/DTOs/SwapFormValues" import { FormikHelpers } from "formik" -import FilledX from "@/components/Icons/FilledX" +import { FilledX } from "@layerswap/ui-kit" import AddressWithIcon from "./AddressWithIcon" import { AddressGroup, AddressItem } from "." import { Address } from "@/lib/address" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" type AddressInput = { manualAddress: string, diff --git a/apps/app/components/Input/Address/AddressPicker/index.tsx b/apps/app/components/Input/Address/AddressPicker/index.tsx index 3a3e52f3..24234b8d 100644 --- a/apps/app/components/Input/Address/AddressPicker/index.tsx +++ b/apps/app/components/Input/Address/AddressPicker/index.tsx @@ -11,7 +11,7 @@ import AddressBook from "./AddressBook"; import AddressButton from "./AddressButton"; import { useQueryState } from "@/context/query"; import ConnectedWallets from "./ConnectedWallets"; -import { Wallet } from "@/Models/WalletProvider"; +import type { Wallet } from "@layerswap/widget-types"; import { useSelectedAccount, useSelectSwapAccount } from "@/context/swapAccounts"; import ConnectWalletButton from "./ConnectedWallets/ConnectWalletButton"; import { useAddressesStore } from "@/stores/addressesStore"; @@ -309,4 +309,4 @@ const getUniqueAddresses = (addresses: AddressItem[], destination: Network) => { return Array.from(normalizedMap.values()); } -export default AddressPicker \ No newline at end of file +export default AddressPicker diff --git a/apps/app/components/Input/Amount/Balance.tsx b/apps/app/components/Input/Amount/Balance.tsx index 876c31f4..812cd676 100644 --- a/apps/app/components/Input/Amount/Balance.tsx +++ b/apps/app/components/Input/Amount/Balance.tsx @@ -1,5 +1,5 @@ import { SwapFormValues } from "@/components/DTOs/SwapFormValues"; -import { truncateDecimals } from "@/components/utils/RoundDecimals"; +import { truncateDecimals } from "@layerswap/utils"; import { Info } from "lucide-react"; import { useSelectedAccount } from "@/context/swapAccounts"; import { useBalance } from "@/lib/balances/useBalance"; diff --git a/apps/app/components/Input/AmountField.tsx b/apps/app/components/Input/AmountField.tsx index 03adffc5..c3ab9dd5 100644 --- a/apps/app/components/Input/AmountField.tsx +++ b/apps/app/components/Input/AmountField.tsx @@ -6,9 +6,9 @@ import { ArrowUpDown } from "lucide-react"; import { Input } from "@/components/shadcn/input"; import { SwapFormValues } from "@/components/DTOs/SwapFormValues"; import { useUsdTokenSync } from "@/hooks/useUsdTokenSync"; -import { isScientific } from "@/components/utils/RoundDecimals"; +import { isScientific } from "@layerswap/utils"; import type { SwapQuote } from "@train-protocol/react"; -import formatAmount from "@/lib/formatAmount"; +import { formatUnits } from "@layerswap/utils"; import { captureEvent } from "@/lib/faro"; // Caps on significant digits shown in NumberFlow. Above the cap, render `...` to indicate truncation. @@ -33,7 +33,7 @@ const AmountField = ({ side, actionValue, actionValueUsd, className, showToggle, const quoteDirection: 'source' | 'destination' = values?.receiveAmount ? 'destination' : 'source'; const token = side === 'source' ? values?.fromCurrency : values?.toCurrency; const quoteAmount = side === 'source' ? quote?.amount : quote?.receiveAmount; - const quoteDerivedAmount = quoteAmount && token?.decimals != null ? formatAmount(BigInt(quoteAmount), token.decimals) : ''; + const quoteDerivedAmount = quoteAmount && token?.decimals != null ? formatUnits(BigInt(quoteAmount), token.decimals) : ''; const stableDerivedAmountRef = useRef(quoteDerivedAmount); diff --git a/apps/app/components/Input/DestinationWalletPicker.tsx b/apps/app/components/Input/DestinationWalletPicker.tsx index a23b4053..dcbfe016 100644 --- a/apps/app/components/Input/DestinationWalletPicker.tsx +++ b/apps/app/components/Input/DestinationWalletPicker.tsx @@ -1,11 +1,12 @@ import { ChevronDown, PlusIcon } from "lucide-react"; import { AddressGroup, AddressItem, AddressTriggerProps } from "./Address/AddressPicker"; import { Partner } from "@/Models/Partner"; -import AddressIcon from "../AddressIcon"; -import { Wallet } from "@/Models/WalletProvider"; -import { ImageWithFallback } from "@/components/Common/ImageWithFallback"; +import { AddressIcon } from "@layerswap/ui-kit"; +import type { Wallet } from "@layerswap/widget-types"; +import { ImageWithFallback } from "@layerswap/ui-kit"; import clsx from 'clsx'; import { Address } from "@/lib/address"; +import { WalletIconView } from "@layerswap/ui-kit"; import { captureEvent } from "@/lib/faro"; const DestinationWalletPicker = (props: AddressTriggerProps) => { @@ -71,11 +72,11 @@ const ResolvedIcon = (props: AdderssIconprops) => { /> } else if (addressItem.group === AddressGroup.ConnectedWallet && wallet) { - return + return } else { - return + return } } -export default DestinationWalletPicker \ No newline at end of file +export default DestinationWalletPicker diff --git a/apps/app/components/Input/RoutePicker/Content.tsx b/apps/app/components/Input/RoutePicker/Content.tsx index 832b2929..21ab67a0 100644 --- a/apps/app/components/Input/RoutePicker/Content.tsx +++ b/apps/app/components/Input/RoutePicker/Content.tsx @@ -2,12 +2,13 @@ import { FC, useEffect, useMemo, useRef, useState } from "react"; import { NetworkElement, RowElement } from "@/Models/Route"; import { SwapDirection } from "@/components/DTOs/SwapFormValues"; import { useVirtualizer } from "@/lib/virtual"; -import { Accordion } from "@/components/shadcn/accordion"; +import { Accordion } from "@layerswap/ui-kit"; import Row from "./Rows"; import { Network, Token } from "@/Models/Network"; import RouteSearch from "./RouteSearch"; import NavigatableList from "@/components/NavigatableList"; import useWallet from "@/hooks/useWallet"; +import { useProvidersConnectReady } from "@layerswap/wallet-core"; import ConnectWalletButton from "@/components/Input/Address/AddressPicker/ConnectedWallets/ConnectWalletButton"; type ContentProps = { @@ -48,8 +49,8 @@ const Items: FC = ({ searchQuery, setSearchQuery, rowElements, selec const parentRef = useRef(null) const [openValues, setOpenValues] = useState(selectedNetwork ? [selectedNetwork] : []) const scrollTimeoutRef = useRef(null) - const { wallets, providers } = useWallet() - const isProvidersReady = providers.every(p => p.ready) + const { wallets } = useWallet() + const isProvidersReady = useProvidersConnectReady() const isSingleNetwork = useMemo(() => { if (!searchQuery) return false; diff --git a/apps/app/components/Input/RoutePicker/PickerWalletConnect.tsx b/apps/app/components/Input/RoutePicker/PickerWalletConnect.tsx index 049799c6..27948b2a 100644 --- a/apps/app/components/Input/RoutePicker/PickerWalletConnect.tsx +++ b/apps/app/components/Input/RoutePicker/PickerWalletConnect.tsx @@ -1,18 +1,20 @@ import { FC, useMemo, useState } from "react"; import { AccountIdentity, useSelectSwapAccount, useSwapAccounts } from "@/context/swapAccounts"; import { SwapDirection, SwapFormValues } from "@/components/DTOs/SwapFormValues"; -import { WalletsIcons } from "@/components/Wallet/ConnectedWallets"; +import { WalletsIcons } from "@layerswap/ui-kit"; import { ChevronDown } from "lucide-react"; +import { WalletIcon } from "@layerswap/ui-kit"; import { Address } from "@/lib/address"; -import WalletIcon from "@/components/Icons/WalletIcon"; -import ConnectButton from "@/components/buttons/connectButton"; +import { ConnectButton } from "@layerswap/ui-kit"; import VaulDrawer from "@/components/Modal/vaulModal"; import { WalletItem } from "@/components/Wallet/WalletsList"; import { ConnectNewWalletButton } from "@/components/Wallet/ConnectNewWalletButton"; -import { SelectAccountProps, Wallet } from "@/Models/WalletProvider"; +import type { Wallet } from "@layerswap/widget-types"; +import { SelectAccountProps } from "@layerswap/wallet-core/types"; import { Network } from "@/Models/Network"; import { useFormikContext } from "formik"; import { useConnectModal } from "@/components/WalletModal"; +import { WalletIconView } from "@layerswap/ui-kit"; const PickerWalletConnect: FC<{ direction: SwapDirection }> = ({ direction }) => { const [openModal, setOpenModal] = useState(false); @@ -83,7 +85,7 @@ const AccountsPickerButton: FC<{ accounts: (Wallet | AccountIdentity)[], onOpenM > {accounts.length === 1 ? (
- + {firstWallet.address && (

{new Address(firstWallet.address, null, firstWallet.providerName).toShortString()}

)} diff --git a/apps/app/components/Input/RoutePicker/Routes.tsx b/apps/app/components/Input/RoutePicker/Routes.tsx index 73a54761..e5856bb4 100644 --- a/apps/app/components/Input/RoutePicker/Routes.tsx +++ b/apps/app/components/Input/RoutePicker/Routes.tsx @@ -1,9 +1,9 @@ import { ExtendedNetwork, ExtendedToken } from "@/Models/Network"; import { SwapDirection } from "@/components/DTOs/SwapFormValues"; -import { truncateDecimals } from "@/components/utils/RoundDecimals"; +import { truncateDecimals } from "@layerswap/utils"; import { SelectItem } from "@/components/Select/Selector/SelectItem"; import { ChevronDown } from "lucide-react"; -import { ImageWithFallback } from "@/components/Common/ImageWithFallback"; +import { ImageWithFallback } from "@layerswap/ui-kit"; import { useBalance } from "@/lib/balances/useBalance"; import { useSwapAccounts } from "@/context/swapAccounts"; import { memo, useMemo } from "react"; diff --git a/apps/app/components/Input/RoutePicker/Rows/CollapsibleRow.tsx b/apps/app/components/Input/RoutePicker/Rows/CollapsibleRow.tsx index a04b3122..f2c4415e 100644 --- a/apps/app/components/Input/RoutePicker/Rows/CollapsibleRow.tsx +++ b/apps/app/components/Input/RoutePicker/Rows/CollapsibleRow.tsx @@ -1,5 +1,5 @@ import { useMemo, memo, useRef, useState } from "react"; -import { AccordionContent, AccordionItem, AccordionTrigger } from "@/components/shadcn/accordion"; +import { AccordionContent, AccordionItem, AccordionTrigger } from "@layerswap/ui-kit"; import { NetworkElement, GroupedTokenElement } from "@/Models/Route"; import { SwapDirection } from "@/components/DTOs/SwapFormValues"; import { ExtendedNetwork, ExtendedToken } from "@/Models/Network"; diff --git a/apps/app/components/Input/RoutePicker/TokenTitleDetails.tsx b/apps/app/components/Input/RoutePicker/TokenTitleDetails.tsx index 4cf59048..9dada3a2 100644 --- a/apps/app/components/Input/RoutePicker/TokenTitleDetails.tsx +++ b/apps/app/components/Input/RoutePicker/TokenTitleDetails.tsx @@ -4,7 +4,7 @@ import { ExtendedAddress } from "../Address/AddressPicker/AddressWithIcon"; import { useState } from "react"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/shadcn/popover"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/shadcn/tooltip"; -import { ImageWithFallback } from "@/components/Common/ImageWithFallback"; +import { ImageWithFallback } from "@layerswap/ui-kit"; import { resolveTokenLogoUrl } from "@/components/utils/resolveTokenLogoUrl"; type TokenInfoIconProps = { diff --git a/apps/app/components/Input/Search.tsx b/apps/app/components/Input/Search.tsx index 91fda3e3..126d1ad4 100644 --- a/apps/app/components/Input/Search.tsx +++ b/apps/app/components/Input/Search.tsx @@ -1,8 +1,7 @@ import useWindowDimensions from "@/hooks/useWindowDimensions"; import { Input } from "@/components/shadcn/input"; import { DetailedHTMLProps, InputHTMLAttributes, useEffect, useRef, useState } from "react"; -import FilledX from "@/components/Icons/FilledX"; -import SearchIcon from "@/components/Icons/SearchIcon"; +import { FilledX, SearchIcon } from "@layerswap/ui-kit"; import clsx from "clsx"; import { AnimatePresence, motion } from "framer-motion"; diff --git a/apps/app/components/Input/SourceWalletPicker.tsx b/apps/app/components/Input/SourceWalletPicker.tsx index 60ac9370..1ae96c7b 100644 --- a/apps/app/components/Input/SourceWalletPicker.tsx +++ b/apps/app/components/Input/SourceWalletPicker.tsx @@ -1,16 +1,19 @@ import { useFormikContext } from "formik"; import { SwapFormValues } from "../DTOs/SwapFormValues"; -import { Dispatch, FC, SetStateAction, useCallback, useState } from "react"; +import { FC, useCallback, useState } from "react"; import useWallet from "@/hooks/useWallet"; +import { useProvidersConnectReady } from "@layerswap/wallet-core"; import { Address } from "@/lib/address"; import { ChevronDown } from "lucide-react"; +import { WalletIcon } from "@layerswap/ui-kit"; import VaulDrawer from "../Modal/vaulModal"; -import { SelectAccountProps, Wallet } from "@/Models/WalletProvider"; -import WalletIcon from "@/components/Icons/WalletIcon"; +import type { Wallet } from "@layerswap/widget-types"; +import { SelectAccountProps } from "@layerswap/wallet-core/types"; import SubmitButton from "@/components/buttons/submitButton"; import { useConnectModal } from "../WalletModal"; import WalletsList from "@/components/Wallet/WalletsList"; import { useSelectedAccount, useSelectSwapAccount } from "@/context/swapAccounts"; +import { WalletIconView } from "@layerswap/ui-kit"; import { captureEvent } from "@/lib/faro"; const SourceWalletPicker: FC = () => { @@ -58,7 +61,7 @@ const SourceWalletPicker: FC = () => { - - -

Disconnect

-
- +export const WalletItem: FC>> = ({ network, token, ...props }) => ( + ) -function hasNetworkIcon(w: AccountIdentity | Wallet): w is Wallet & { networkIcon: string } { - return 'networkIcon' in w && typeof w.networkIcon === 'string' && w.networkIcon !== ''; -} -function hasDisconnect(w: AccountIdentity | Wallet): w is Wallet & { disconnect: Function } { - return 'disconnect' in w && typeof w.disconnect === 'function'; -} -function isLoading(w: AccountIdentity | Wallet): w is Wallet & { isLoading: boolean } { - return 'isLoading' in w && typeof w.isLoading === 'boolean' && w.isLoading; -} -export default WalletsList \ No newline at end of file +export default WalletsList diff --git a/apps/app/components/Wallet/walletListAdapters.tsx b/apps/app/components/Wallet/walletListAdapters.tsx new file mode 100644 index 00000000..74b24ce7 --- /dev/null +++ b/apps/app/components/Wallet/walletListAdapters.tsx @@ -0,0 +1,39 @@ +"use client" +import { useCallback, useMemo, type ReactNode } from "react"; +import { WalletListAdaptersProvider, type WalletListAdapters } from "@layerswap/ui-kit"; +import { truncateDecimals } from "@layerswap/utils"; +import { useSettingsState } from "@/context/settings"; +import { useConnectModal } from "@/components/WalletModal"; +import { useBalance } from "@/lib/balances/useBalance"; +import { toWidgetNetwork } from "@/lib/wallets/layerswap/widgetNetwork"; + +export const TrainWalletListAdapters = ({ children }: { children: ReactNode }) => { + const { networks } = useSettingsState() + const { connect } = useConnectModal() + + const connectAdapter = useCallback( + (provider, context) => connect(provider, context?.layout === "overlay" ? { displayMode: "dialog" } : undefined), + [connect] + ) + + const useWalletBalance = useCallback(({ address, network, token }) => { + const caip2Id = (network as { caip2Id?: string } | undefined)?.caip2Id + const balanceNetwork = token ? networks.find(n => n.caip2Id === caip2Id && n.tokens.some(t => t.symbol === token.symbol)) : undefined + const { balances, isLoading } = useBalance(address, balanceNetwork) + const balance = balances?.find(b => b?.token === token?.symbol) + + return { + formatted: balance?.amount !== undefined ? truncateDecimals(balance.amount, Math.min(token?.decimals ?? 8, 8)) : undefined, + isLoading, + } + }, [networks]) + + const adapters = useMemo>(() => ({ + networks: networks.map(toWidgetNetwork), + connect: connectAdapter, + getNetworkId: network => (network as { caip2Id?: string }).caip2Id ?? network.name, + useWalletBalance, + }), [networks, connectAdapter, useWalletBalance]) + + return {children} +} diff --git a/apps/app/components/WalletBridges/AztecWalletBridge.tsx b/apps/app/components/WalletBridges/AztecWalletBridge.tsx index 67018c85..cd8e632b 100644 --- a/apps/app/components/WalletBridges/AztecWalletBridge.tsx +++ b/apps/app/components/WalletBridges/AztecWalletBridge.tsx @@ -9,14 +9,16 @@ import type { TrainSDK } from '@train-protocol/sdk' import { useAztecWalletStore } from '@/stores/aztecWalletStore' import { useWalletStore } from '@/stores/walletStore' import { useBridgeRpcUrl } from './useBridgeRpcUrl' +import { useActiveAztecAccount } from '@/components/WalletProviders/ActiveAztecAccount' export function AztecWalletBridge() { const wallet = useAztecWalletStore(s => s.wallet) const connectedWallets = useWalletStore(s => s.connectedWallets) const getRpcUrl = useBridgeRpcUrl('aztec:') + const { activeAddress } = useActiveAztecAccount() const aztecWallet = connectedWallets.find(w => w.providerName === 'Aztec') - const address = aztecWallet?.address ?? null + const address = activeAddress ?? aztecWallet?.address ?? null const adapter = useMemo(() => { return { diff --git a/apps/app/components/WalletBridges/EvmWalletBridge.tsx b/apps/app/components/WalletBridges/EvmWalletBridge.tsx index 9cd54650..49c010c6 100644 --- a/apps/app/components/WalletBridges/EvmWalletBridge.tsx +++ b/apps/app/components/WalletBridges/EvmWalletBridge.tsx @@ -1,10 +1,5 @@ import { useMemo } from 'react' -import { - useRegisterWallet, - chainNamespace, - type TrainWalletAdapter, - type Caip2Id, -} from '@train-protocol/react' +import { useRegisterWallet, chainNamespace, type TrainWalletAdapter, type Caip2Id, } from '@train-protocol/react' import type { TrainSDK } from '@train-protocol/sdk' import { useConfig } from 'wagmi' import { getAccount, getWalletClient, getConnections } from 'wagmi/actions' @@ -41,7 +36,7 @@ export function EvmWalletBridge() { address, chainNamespace: 'eip155', sendTransaction: async (tx: { to: string; data: string; value?: bigint }) => { - if(!chain?.id) throw new Error("No chain id") + if (!chain?.id) throw new Error("No chain id") const walletClient = await getWalletClient(config, { chainId: chain.id, diff --git a/apps/app/components/WalletBridges/FuelWalletBridge.tsx b/apps/app/components/WalletBridges/FuelWalletBridge.tsx index dc5e0da6..b7cbe0e0 100644 --- a/apps/app/components/WalletBridges/FuelWalletBridge.tsx +++ b/apps/app/components/WalletBridges/FuelWalletBridge.tsx @@ -1,24 +1,32 @@ -import { useMemo } from 'react' -import { useWallet } from '@fuels/react' -import { Provider } from 'fuels' -import { - chainNamespace, - useRegisterWallet, - type Caip2Id, - type TrainWalletAdapter, -} from '@train-protocol/react' +import { useEffect, useMemo, useState } from 'react' +import { useFuelStore } from '@layerswap/wallet-fuel' +import { Provider, type Account } from 'fuels' +import { chainNamespace, useRegisterWallet, type Caip2Id, type TrainWalletAdapter, } from '@train-protocol/react' import type { TrainSDK } from '@train-protocol/sdk' import { Address } from '@/lib/address' -import { useWalletStore } from '@/stores/walletStore' import { useBridgeRpcUrl } from './useBridgeRpcUrl' export function FuelWalletBridge() { - const connectedWallets = useWalletStore(state => state.connectedWallets) - const fuelWallet = connectedWallets.find(wallet => wallet.providerName === 'Fuel') + const fuel = useFuelStore(state => state.fuel) + const fuelWallet = useFuelStore(state => state.connectedWallets[0]) const address = fuelWallet?.address ?? null - const { wallet: account } = useWallet({ account: address }) + const [account, setAccount] = useState(null) const getRpcUrl = useBridgeRpcUrl('fuel:') + useEffect(() => { + let cancelled = false + setAccount(null) + if (!fuel || !address) return + + void fuel.getWallet(address).then(wallet => { + if (!cancelled) setAccount(wallet) + }).catch(() => { + if (!cancelled) setAccount(null) + }) + + return () => { cancelled = true } + }, [fuel, address]) + const adapter = useMemo(() => { return { chainNamespace: chainNamespace('fuel'), @@ -56,4 +64,4 @@ export function FuelWalletBridge() { useRegisterWallet(adapter) return null -} +} \ No newline at end of file diff --git a/apps/app/components/WalletBridges/SolanaWalletBridge.tsx b/apps/app/components/WalletBridges/SolanaWalletBridge.tsx index 2c2c57c6..e7f1c2da 100644 --- a/apps/app/components/WalletBridges/SolanaWalletBridge.tsx +++ b/apps/app/components/WalletBridges/SolanaWalletBridge.tsx @@ -1,18 +1,30 @@ import { useMemo } from 'react' -import { - useRegisterWallet, - chainNamespace, - type TrainWalletAdapter, - type Caip2Id, -} from '@train-protocol/react' +import { useRegisterWallet, chainNamespace, type TrainWalletAdapter, type Caip2Id, } from '@train-protocol/react' import type { TrainSDK } from '@train-protocol/sdk' -import { useWallet, useConnection } from '@solana/wallet-adapter-react' +import type { Transaction, VersionedTransaction } from '@solana/web3.js' +import { svmAdapterManager } from '@layerswap/wallet-svm' import { Address } from '@/lib/address' import { useBridgeRpcUrl } from './useBridgeRpcUrl' +type SvmSignerAdapter = { + connected?: boolean + publicKey?: { toBase58(): string } | null + signMessage?: (message: Uint8Array) => Promise + signTransaction?: (tx: T) => Promise +} + +const resolveSignerAdapter = (address?: string): SvmSignerAdapter | undefined => { + if (!address) return svmAdapterManager.getActiveSignerAdapter() as SvmSignerAdapter | undefined + + return (svmAdapterManager.getAdapters() as unknown as SvmSignerAdapter[]).find(candidate => + candidate.connected + && typeof candidate.signTransaction === 'function' + && !!candidate.publicKey + && Address.equals(candidate.publicKey.toBase58(), address, null, 'solana') + ) +} + export function SolanaWalletBridge() { - const { wallets } = useWallet() - const { connection } = useConnection() const getRpcUrl = useBridgeRpcUrl('solana:') const adapter = useMemo(() => { @@ -25,41 +37,32 @@ export function SolanaWalletBridge() { createWriteClient(sdk: TrainSDK, networkId: Caip2Id, address?: string) { const rpcUrl = getRpcUrl(networkId) - const connectedWallet = address - ? wallets.find(w => w.adapter.connected && w.adapter.publicKey?.toBase58() === address) - : wallets.find(w => w.adapter.connected) - - if (address && !connectedWallet) { + const walletAdapter = resolveSignerAdapter(address) + const publicKey = walletAdapter?.publicKey?.toBase58() + if (address && (!walletAdapter || !publicKey)) { throw new Error(`No connected Solana wallet found for address "${address}"`) } - - const publicKey = connectedWallet?.adapter.publicKey - - if (!connectedWallet || !publicKey) throw new Error('No Solana signer available') + if (!walletAdapter || !publicKey) throw new Error('No Solana signer available') + const signTransaction = walletAdapter.signTransaction + if (!signTransaction) throw new Error('Connected Solana wallet cannot sign transactions') const signer = { - publicKey: publicKey.toBase58(), - sendTransaction: async (tx: any) => { - return connectedWallet.adapter.sendTransaction(tx, connection) - }, + publicKey, + signTransaction: (tx: T) => signTransaction.call(walletAdapter, tx), } return sdk.createHTLCWalletClient('solana', { rpcUrl, signer }) }, getLoginConfig: (address?: string) => { - const connectedAdapter = address - ? wallets.find(w => w.adapter.connected && w.adapter.publicKey && Address.equals(w.adapter.publicKey?.toBase58(), address, null, 'solana'))?.adapter - : wallets.find(w => w.adapter.connected)?.adapter - const signMessage = connectedAdapter && 'signMessage' in connectedAdapter - ? (msg: Uint8Array) => (connectedAdapter as any).signMessage(msg) - : undefined - if (!signMessage) return null - return { wallet: { signMessage } } + const walletAdapter = resolveSignerAdapter(address) + if (!walletAdapter?.signMessage || !walletAdapter.publicKey) return null + const signMessage = walletAdapter.signMessage + return { wallet: { signMessage: (message: Uint8Array) => signMessage.call(walletAdapter, message) } } }, } - }, [wallets, connection, getRpcUrl]) + }, [getRpcUrl]) useRegisterWallet(adapter) return null -} +} \ No newline at end of file diff --git a/apps/app/components/WalletBridges/StarknetWalletBridge.tsx b/apps/app/components/WalletBridges/StarknetWalletBridge.tsx index acb8f830..680f6b31 100644 --- a/apps/app/components/WalletBridges/StarknetWalletBridge.tsx +++ b/apps/app/components/WalletBridges/StarknetWalletBridge.tsx @@ -1,11 +1,7 @@ import { useMemo } from 'react' -import { - useRegisterWallet, - chainNamespace, - type TrainWalletAdapter, - type Caip2Id, -} from '@train-protocol/react' +import { useRegisterWallet, chainNamespace, type TrainWalletAdapter, type Caip2Id, } from '@train-protocol/react' import type { TrainSDK } from '@train-protocol/sdk' +import { Address } from '@/lib/address' import useWallet from '@/hooks/useWallet' import { useBridgeRpcUrl } from './useBridgeRpcUrl' @@ -22,9 +18,12 @@ export function StarknetWalletBridge() { return sdk.createHTLCPublicClient('starknet', { rpcUrl: getRpcUrl(networkId) }) }, - createWriteClient(sdk: TrainSDK, networkId: Caip2Id, _address?: string) { + createWriteClient(sdk: TrainSDK, networkId: Caip2Id, address?: string) { const starknetAccount = starknetWalletProvider?.activeWallet?.metadata?.starknetAccount if (!starknetAccount) throw new Error('No Starknet signer available') + if (address && !Address.equals(starknetAccount.address, address, null, 'starknet')) { + throw new Error(`No connected Starknet signer available for address "${address}"`) + } return sdk.createHTLCWalletClient('starknet', { rpcUrl: getRpcUrl(networkId), @@ -32,10 +31,11 @@ export function StarknetWalletBridge() { }) }, - getLoginConfig: (_address?: string) => { + getLoginConfig: (address?: string) => { const starknetAccount = starknetWalletProvider?.activeWallet?.metadata?.starknetAccount if (!starknetAccount) return null + if (address && !Address.equals(starknetAccount.address, address, null, 'starknet')) return null const isSandbox = process.env.NEXT_PUBLIC_API_VERSION === 'sandbox' return { provider: starknetAccount, diff --git a/apps/app/components/WalletBridges/TronWalletBridge.tsx b/apps/app/components/WalletBridges/TronWalletBridge.tsx index 9acc70bd..daa6a0e1 100644 --- a/apps/app/components/WalletBridges/TronWalletBridge.tsx +++ b/apps/app/components/WalletBridges/TronWalletBridge.tsx @@ -1,34 +1,27 @@ -import { useMemo, useRef } from 'react' -import { - useRegisterWallet, - chainNamespace, - type TrainWalletAdapter, - type Caip2Id, -} from '@train-protocol/react' +import { useMemo } from 'react' +import { useRegisterWallet, chainNamespace, type TrainWalletAdapter, type Caip2Id, } from '@train-protocol/react' import type { TrainSDK } from '@train-protocol/sdk' -import { useWallet } from '@tronweb3/tronwallet-adapter-react-hooks' import type { TronSigner, TronUnsignedTransaction } from '@train-protocol/tron' +import { tronAdapterManager } from '@layerswap/wallet-tron' +import { Address } from '@/lib/address' import { useBridgeRpcUrl } from './useBridgeRpcUrl' +type TronSignerAdapter = { signMessage?: (message: string) => Promise } + export function TronWalletBridge() { - const { wallet: tronWallet } = useWallet() const getRpcUrl = useBridgeRpcUrl('tron') - // Use a ref to access the wallet lazily inside callbacks, - // avoiding tronWallet in useMemo deps (new object ref each render). - const walletRef = useRef(tronWallet) - walletRef.current = tronWallet - const adapter = useMemo(() => { - function getSignerForNetwork(rpcUrl: string): TronSigner | null { - const tronAdapter = walletRef.current?.adapter + function getSignerForNetwork(rpcUrl: string, requestedAddress?: string): TronSigner | null { + const tronAdapter = tronAdapterManager.getActiveAdapter() if (!tronAdapter?.connected || !tronAdapter.address) return null + if (requestedAddress && !Address.equals(tronAdapter.address, requestedAddress, null, 'tron')) return null return { address: tronAdapter.address, async signAndBroadcast(unsignedTx: TronUnsignedTransaction): Promise { - const signedTx = await tronAdapter.signTransaction(unsignedTx as any) + const signedTx = await tronAdapter.signTransaction(unsignedTx) const response = await fetch(`${rpcUrl}/wallet/broadcasttransaction`, { method: 'POST', @@ -52,26 +45,25 @@ export function TronWalletBridge() { return sdk.createHTLCPublicClient('tron', { rpcUrl }) }, - createWriteClient(sdk: TrainSDK, networkId: Caip2Id) { + createWriteClient(sdk: TrainSDK, networkId: Caip2Id, address?: string) { const rpcUrl = getRpcUrl(networkId) - const signer = getSignerForNetwork(rpcUrl) + const signer = getSignerForNetwork(rpcUrl, address) if (!signer) throw new Error('No Tron signer available') return sdk.createHTLCWalletClient('tron', { rpcUrl, signer }) }, - getLoginConfig: async () => { - const tronAdapter = walletRef.current?.adapter + getLoginConfig: async (address?: string) => { + const tronAdapter = tronAdapterManager.getActiveAdapter() if (!tronAdapter?.connected || !tronAdapter.address) return null + if (address && !Address.equals(tronAdapter.address, address, null, 'tron')) return null + const signMessage = (tronAdapter as TronSignerAdapter).signMessage + if (!signMessage) return null - return { - wallet: { - signMessage: (message: string) => tronAdapter.signMessage(message), - }, - } + return { wallet: { signMessage: (message: string) => signMessage.call(tronAdapter, message) } } }, } }, [getRpcUrl]) useRegisterWallet(adapter) return null -} +} \ No newline at end of file diff --git a/apps/app/components/WalletBridges/index.tsx b/apps/app/components/WalletBridges/index.tsx index 259389a6..319f767e 100644 --- a/apps/app/components/WalletBridges/index.tsx +++ b/apps/app/components/WalletBridges/index.tsx @@ -1,19 +1,27 @@ +"use client" + +import dynamic from "next/dynamic" import { EvmWalletBridge } from './EvmWalletBridge' -import { SolanaWalletBridge } from './SolanaWalletBridge' -import { StarknetWalletBridge } from './StarknetWalletBridge' -import { AztecWalletBridge } from './AztecWalletBridge' -import { TronWalletBridge } from './TronWalletBridge' -import { FuelWalletBridge } from './FuelWalletBridge' +import useWallet from '@/hooks/useWallet' + +const AztecWalletBridge = dynamic(() => import('./AztecWalletBridge').then(module => module.AztecWalletBridge), { ssr: false }) +const SolanaWalletBridge = dynamic(() => import('./SolanaWalletBridge').then(module => module.SolanaWalletBridge), { ssr: false }) +const StarknetWalletBridge = dynamic(() => import('./StarknetWalletBridge').then(module => module.StarknetWalletBridge), { ssr: false }) +const TronWalletBridge = dynamic(() => import('./TronWalletBridge').then(module => module.TronWalletBridge), { ssr: false }) +const FuelWalletBridge = dynamic(() => import('./FuelWalletBridge').then(module => module.FuelWalletBridge), { ssr: false }) export function WalletBridges() { + const { providers } = useWallet() + const isReady = (id: string) => providers.some(provider => provider.id === id && provider.ready) + return ( <> - - - - - + {isReady('aztec') && } + {isReady('solana') && } + {isReady('starknet') && } + {isReady('tron') && } + {isReady('fuel') && } ) } diff --git a/apps/app/components/WalletModal/ConnectWalletDrawer.tsx b/apps/app/components/WalletModal/ConnectWalletDrawer.tsx index 1bbb4d6a..f14d8c66 100644 --- a/apps/app/components/WalletModal/ConnectWalletDrawer.tsx +++ b/apps/app/components/WalletModal/ConnectWalletDrawer.tsx @@ -1,12 +1,20 @@ -import { FC } from "react"; +import { ensureRegistryBrowseLoaded, useWalletDescriptorLoader } from "@layerswap/wallet-core"; +import { type FC, useCallback, useEffect } from "react"; import { ChevronLeft } from "lucide-react"; +import { ConnectorsList as UiKitConnectorsList } from "@layerswap/ui-kit"; +import type { ConnectorsListProps } from "@layerswap/ui-kit"; import IconButton from "../buttons/iconButton"; import VaulDrawer from "../Modal/vaulModal"; import AppShellDialog from "../shared/AppShellDialog"; +import TrainLogoSymbol from "@/components/Icons/TrainLogoSymbol"; import useWindowDimensions from "@/hooks/useWindowDimensions"; -import ConnectorsList from "./ConnectorsList"; +import useWallet from "@/hooks/useWallet"; +import { useAztecWalletContext } from "../WalletProviders/AztecWalletProvider"; +import AztecEmojiVerification from "./AztecEmojiVerification"; import { useConnectModal } from "."; +const ConnectorsList = UiKitConnectorsList as FC; + const ConnectWalletDrawer: FC = () => { const { goBack, @@ -15,23 +23,55 @@ const ConnectWalletDrawer: FC = () => { setOpen, selectedConnector, selectedMultiChainConnector, + setSelectedConnector, displayMode, } = useConnectModal(); + const { pendingVerification } = useAztecWalletContext(); + const { providers } = useWallet(); const { isMobile } = useWindowDimensions(); + const { loadAll } = useWalletDescriptorLoader(); + + useEffect(() => { + if (!open) return; + ensureRegistryBrowseLoaded(); + void loadAll().then(() => ensureRegistryBrowseLoaded()); + }, [open, loadAll]); - const title = (selectedMultiChainConnector && !selectedConnector) ? "Select ecosystem" : "Connect wallet" - const showBack = !!(selectedConnector || selectedMultiChainConnector) + const title = selectedMultiChainConnector && !selectedConnector ? "Select ecosystem" : "Connect wallet"; + const showBack = !!(selectedConnector || selectedMultiChainConnector); + const cancelPendingVerification = useCallback(() => { + pendingVerification?.cancel(); + setSelectedConnector(undefined); + }, [pendingVerification, setSelectedConnector]); + const handleBack = pendingVerification ? cancelPendingVerification : goBack; + const handleClose = useCallback(() => { + pendingVerification?.cancel(); + onFinish(); + }, [onFinish, pendingVerification]); + const content = pendingVerification ? ( + { void pendingVerification.confirm(); }} + onCancel={cancelPendingVerification} + /> + ) : ( + } + /> + ); - if (displayMode === 'dialog' && !isMobile) { + if (displayMode === "dialog" && !isMobile) { return ( { if (!v) onFinish() }} + onOpenChange={value => { if (!value) handleClose(); }} title={title} - onBack={showBack ? goBack : undefined} + onBack={showBack ? handleBack : undefined} contentClassName="h-[550px]! max-h-[85svh]!" > - + {content} ) } @@ -40,20 +80,20 @@ const ConnectWalletDrawer: FC = () => { {showBack && (
- } /> + } />
)}

{title}

}> - - + + {content} ); diff --git a/apps/app/components/WalletModal/Connector.tsx b/apps/app/components/WalletModal/Connector.tsx deleted file mode 100644 index ed18b650..00000000 --- a/apps/app/components/WalletModal/Connector.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { ButtonHTMLAttributes, DetailedHTMLProps, FC } from "react"; -import { WalletModalConnector } from "."; -import { InternalConnector } from "../../Models/WalletProvider"; -import { Loader } from "lucide-react"; -import { resolveWalletConnectorIcon } from "@/lib/wallets/utils/resolveWalletIcon"; -import { Badge } from "@/components/shadcn/badge"; - -type Connector = DetailedHTMLProps, HTMLButtonElement> & { - connector: InternalConnector, - connectingConnector?: WalletModalConnector - isRecent?: boolean - onClick: () => void - isProviderReady?: boolean -} - -const Connector: FC = ({ connector, connectingConnector, onClick, isRecent, isProviderReady = true, ...props }) => { - const connectorName = connector?.name - const connectorId = connector?.id - - const Icon = resolveWalletConnectorIcon({ connector: connectorId, iconUrl: connector.icon }) - const isLoading = connectingConnector?.name === connectorName - - return ( - <> - - - ) -} - -export default Connector \ No newline at end of file diff --git a/apps/app/components/WalletModal/ConnectorsList.tsx b/apps/app/components/WalletModal/ConnectorsList.tsx deleted file mode 100644 index 2122aca7..00000000 --- a/apps/app/components/WalletModal/ConnectorsList.tsx +++ /dev/null @@ -1,524 +0,0 @@ -import { FC, useCallback, useEffect, useRef, useState } from "react"; -import useWallet from "../../hooks/useWallet"; -import { useConnectModal, WalletModalConnector } from "."; -import { InternalConnector, Wallet, WalletProvider } from "../../Models/WalletProvider"; -import clsx from "clsx"; -import Connector from "./Connector"; -import { usePersistedState } from "../../hooks/usePersistedState"; -import { useConnectors } from "../../hooks/useConnectors"; -import { SearchComponent } from "../Input/Search"; -import CircularLoader from "../Icons/CircularLoader"; -import { MultichainConnectorPicker } from "./MultichainConnectorPicker"; -import { ProviderPicker } from "./ProviderPicker"; -import { InstalledExtensionNotFound } from "./InstalledExtensionNotFound"; -import { WalletQrCode } from "./WalletQrCode"; -import { LoadingConnect } from "./LoadingConnect"; -import AztecEmojiVerification from "./AztecEmojiVerification"; -import { useAztecWalletContext } from "../WalletProviders/AztecWalletProvider"; -import { isMobile } from "@/lib/wallets/utils/isMobile"; - -type ProviderPaginationState = { - loaded: boolean; - nextPage: number | null; - totalCount: number; - pageSize: number; - isLoading: boolean; -} - -type RequestCapableWalletProvider = WalletProvider & { - requestAdditionalConnectors: NonNullable; -} - -const DEFAULT_BROWSE_PAGE_SIZE = 40 -const SEARCH_PAGE_SIZE = 100 - -const upsertPaginationState = ( - previous: Record, - providerNames: string[], - pageSize: number -) => { - const next = { ...previous } - - for (const providerName of providerNames) { - next[providerName] = { - loaded: previous[providerName]?.loaded ?? false, - nextPage: previous[providerName]?.nextPage ?? null, - totalCount: previous[providerName]?.totalCount ?? 0, - pageSize: previous[providerName]?.pageSize ?? pageSize, - isLoading: true, - } - } - - return next -} - -/** - * Settle pagination state after a load-more round, carrying the previous total and page - * size forward when the provider doesn't report them. The initial-load paths deliberately - * reset those instead, so they build their state inline rather than calling this. - */ -const applyLoadMoreResults = ( - previous: Record, - results: { providerName: string; result?: { nextPage?: number | null; totalCount?: number } }[], - pageSize: number -) => { - const next = { ...previous } - - for (const { providerName, result } of results) { - next[providerName] = { - loaded: true, - nextPage: result?.nextPage ?? null, - totalCount: result?.totalCount ?? previous[providerName]?.totalCount ?? 0, - pageSize: previous[providerName]?.pageSize ?? pageSize, - isLoading: false, - } - } - - return next -} - -const withProviderName = (providerName: string, connectors: InternalConnector[]) => { - return connectors.map(connector => ({ ...connector, providerName })) -} - -const clearSearchResultsIfNeeded = (previous: InternalConnector[]) => { - return previous.length === 0 ? previous : [] -} - -const clearPaginationIfNeeded = (previous: Record) => { - return Object.keys(previous).length === 0 ? previous : {} -} - -const canRequestAdditionalConnectors = (provider: WalletProvider): provider is RequestCapableWalletProvider => { - return typeof provider.requestAdditionalConnectors === "function" -} - -const ConnectorsList: FC<{ onFinish: (result: Wallet | undefined) => void }> = ({ onFinish }) => { - const { providers } = useWallet(); - const { setSelectedConnector, selectedProvider, setSelectedProvider, selectedConnector, selectedMultiChainConnector, setSelectedMultiChainConnector } = useConnectModal() - const { pendingVerification } = useAztecWalletContext() - let [recentConnectors, setRecentConnectors] = usePersistedState<({ providerName?: string, connectorName?: string }[])>([], 'recentConnectors', 'localStorage'); - const [connectionError, setConnectionError] = useState(undefined); - const [searchValue, setSearchValue] = useState(undefined) - const [isScrolling, setIsScrolling] = useState(false); - const [searchResults, setSearchResults] = useState([]); - const [browsePaginationByProvider, setBrowsePaginationByProvider] = useState>({}); - const [searchPaginationByProvider, setSearchPaginationByProvider] = useState>({}); - const scrollTimeout = useRef(null); - const searchDebounceRef = useRef(null); - const searchRequestSequenceRef = useRef(0); - const isMobilePlatfrom = isMobile(); - const loadMoreTriggerRef = useRef(null); - - const filteredProviders = providers.filter(p => !p.hideFromList) - const [selectedProviderNames, setSelectedProviderNames] = useState([]) - - const resolvedSelectedProvider = selectedProvider && !selectedProvider.isSelectedFromFilter - ? filteredProviders.find(p => p.name === selectedProvider.name) || selectedProvider - : selectedProvider; - const featuredProviders = selectedProviderNames.length > 0 ? filteredProviders.filter(p => selectedProviderNames.includes(p.name)) : (resolvedSelectedProvider ? [resolvedSelectedProvider] : filteredProviders) - const requestCapableFeaturedProviderNamesKey = featuredProviders - .filter(canRequestAdditionalConnectors) - .map(provider => provider.name) - .join("|") - - const featuredProvidersRef = useRef(featuredProviders) - const browsePaginationRef = useRef(browsePaginationByProvider) - const searchPaginationRef = useRef(searchPaginationByProvider) - const currentSearchValue = searchValue?.trim() ?? "" - const currentSearchValueRef = useRef(currentSearchValue) - const isSearching = currentSearchValue.length >= 2 - - const isSearchingRef = useRef(isSearching) - featuredProvidersRef.current = featuredProviders - browsePaginationRef.current = browsePaginationByProvider - searchPaginationRef.current = searchPaginationByProvider - currentSearchValueRef.current = currentSearchValue - isSearchingRef.current = isSearching - - const handleScroll = () => { - setIsScrolling(true); - - if (scrollTimeout.current) clearTimeout(scrollTimeout.current); - - scrollTimeout.current = setTimeout(() => { - setIsScrolling(false); - }, 1000); - }; - - useEffect(() => { - return () => clearTimeout(scrollTimeout.current as any); - }, []); - - // If the user leaves the connecting step (back button clears selectedConnector) - // while an Aztec emoji verification is still open, tear down the secure channel. - useEffect(() => { - if (!selectedConnector && pendingVerification) { - pendingVerification.cancel() - } - }, [selectedConnector, pendingVerification]); - - const connect = async (connector: WalletModalConnector, provider: WalletProvider) => { - try { - setConnectionError(undefined) - if (connector?.isMultiChain) { - setSelectedMultiChainConnector(connector) - return; - } - setSelectedConnector(connector) - if (connector?.hasBrowserExtension !== false && connector.extensionNotFound && !connector?.showQrCode && !isMobilePlatfrom) return - if (!provider.ready) { - setConnectionError("Wallet provider is still initializing. Please wait a moment and try again.") - return - } - - const result = provider?.connectWallet && await provider.connectWallet({ connector }) - - if (result && connector && provider) { - setRecentConnectors((prev) => { - const next = [{ providerName: provider.name, connectorName: connector.name }]; - const counts = new Map(); - counts.set(provider.name, 1); - - (prev || []).forEach(item => { - if ( - item.providerName && - item.connectorName && - !(item.providerName === provider.name && item.connectorName === connector.name) - ) { - const count = counts.get(item.providerName) ?? 0; - if (count < 3) { - next.push({ providerName: item.providerName, connectorName: item.connectorName }); - counts.set(item.providerName, count + 1); - } - } - }); - return next; - }) - onFinish(result) - setSelectedConnector(undefined) - setSelectedMultiChainConnector(undefined) - } else { - setConnectionError("Connection didn't complete. Please try again.") - } - } catch (e) { - console.log(e) - const message = (e?.message || e?.details || '').toLowerCase() - if (e?.name === 'WalletWindowClosedError' || message.includes('rejected') || message.includes('denied')) { - setConnectionError("You've declined the wallet connection request") - } else { - setConnectionError(e.message || e.details || 'Something went wrong') - } - } - } - - const handleSelectProvider = (providerNames: string[]) => { - setSelectedProviderNames(providerNames) - if (providerNames.length === 0) { - setSelectedProvider(undefined) - } else { - const provider = filteredProviders.find(p => p.name === providerNames[0]) - if (provider) { - setSelectedProvider({ ...provider, isSelectedFromFilter: true }) - } - } - } - - useEffect(() => { - if (isSearching) return - - let cancelled = false - const providersToLoad = featuredProvidersRef.current.filter(provider => - provider.requestAdditionalConnectors - && !browsePaginationRef.current[provider.name]?.loaded - && !browsePaginationRef.current[provider.name]?.isLoading - ) - - if (providersToLoad.length === 0) return - - setBrowsePaginationByProvider(previous => upsertPaginationState(previous, providersToLoad.map(provider => provider.name), DEFAULT_BROWSE_PAGE_SIZE)) - - Promise.all(providersToLoad.map(async (provider) => { - try { - const result = await provider.requestAdditionalConnectors?.({ page: 1, pageSize: DEFAULT_BROWSE_PAGE_SIZE }) - return { providerName: provider.name, result } - } catch { - return { providerName: provider.name, result: undefined } - } - })).then(results => { - if (cancelled) return - - setBrowsePaginationByProvider(previous => { - const next = { ...previous } - - for (const { providerName, result } of results) { - next[providerName] = { - loaded: true, - nextPage: result?.nextPage ?? null, - totalCount: result?.totalCount ?? 0, - pageSize: previous[providerName]?.pageSize ?? DEFAULT_BROWSE_PAGE_SIZE, - isLoading: false, - } - } - - return next - }) - }) - - return () => { - cancelled = true - } - }, [isSearching, requestCapableFeaturedProviderNamesKey]) - - useEffect(() => { - if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current) - - if (!isSearching) { - searchRequestSequenceRef.current += 1 - setSearchResults(clearSearchResultsIfNeeded) - setSearchPaginationByProvider(clearPaginationIfNeeded) - return - } - - const requestId = searchRequestSequenceRef.current + 1 - searchRequestSequenceRef.current = requestId - const searchableProviders = featuredProvidersRef.current.filter(canRequestAdditionalConnectors) - - if (searchableProviders.length === 0) { - setSearchResults(clearSearchResultsIfNeeded) - setSearchPaginationByProvider(clearPaginationIfNeeded) - return - } - - setSearchPaginationByProvider(previous => upsertPaginationState(previous, searchableProviders.map(provider => provider.name), SEARCH_PAGE_SIZE)) - - searchDebounceRef.current = setTimeout(async () => { - const query = currentSearchValueRef.current - const results = await Promise.all(searchableProviders.map(async (provider) => { - try { - const result = await provider.requestAdditionalConnectors({ page: 1, pageSize: SEARCH_PAGE_SIZE, query }) - return { providerName: provider.name, result } - } catch { - return { providerName: provider.name, result: undefined } - } - })) - - if (requestId !== searchRequestSequenceRef.current || query !== currentSearchValueRef.current) { - return - } - - setSearchResults(results.flatMap(({ providerName, result }) => withProviderName(providerName, result?.connectors ?? []))) - setSearchPaginationByProvider(previous => { - const next = { ...previous } - - for (const { providerName, result } of results) { - next[providerName] = { - loaded: true, - nextPage: result?.nextPage ?? null, - totalCount: result?.totalCount ?? 0, - pageSize: SEARCH_PAGE_SIZE, - isLoading: false, - } - } - - return next - }) - }, 300) - - return () => { - if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current) - } - }, [currentSearchValue, isSearching, requestCapableFeaturedProviderNamesKey]) - - const { - featuredConnectors, - additionalConnectors, - initialConnectors, - } = useConnectors({ - featuredProviders, - filteredProviders, - searchValue, - recentConnectors, - searchResults: isSearching ? searchResults : [], - }); - - const activePaginationByProvider = isSearching ? searchPaginationByProvider : browsePaginationByProvider - const anyProviderHasMore = featuredProviders.some(provider => activePaginationByProvider[provider.name]?.nextPage != null) - const anyProviderLoadingMore = featuredProviders.some(provider => activePaginationByProvider[provider.name]?.isLoading) - - const loadMoreInFlightRef = useRef(false) - - const loadMore = useCallback(async () => { - if (loadMoreInFlightRef.current) return - loadMoreInFlightRef.current = true - try { - if (isSearchingRef.current) { - const query = currentSearchValueRef.current - const requestId = searchRequestSequenceRef.current - const providersToLoad = featuredProvidersRef.current.filter(provider => { - const state = searchPaginationRef.current[provider.name] - return provider.requestAdditionalConnectors && state?.nextPage != null && !state.isLoading - }) - - if (providersToLoad.length === 0) return - - setSearchPaginationByProvider(previous => upsertPaginationState(previous, providersToLoad.map(provider => provider.name), SEARCH_PAGE_SIZE)) - - const results = await Promise.all(providersToLoad.map(async (provider) => { - const state = searchPaginationRef.current[provider.name] - try { - const result = await provider.requestAdditionalConnectors?.({ - page: state?.nextPage ?? 1, - pageSize: state?.pageSize ?? SEARCH_PAGE_SIZE, - query, - }) - return { providerName: provider.name, result } - } catch { - return { providerName: provider.name, result: undefined } - } - })) - - if (requestId !== searchRequestSequenceRef.current || query !== currentSearchValueRef.current) { - return - } - - setSearchResults(previous => [ - ...previous, - ...results.flatMap(({ providerName, result }) => withProviderName(providerName, result?.connectors ?? [])) - ]) - setSearchPaginationByProvider(previous => applyLoadMoreResults(previous, results, SEARCH_PAGE_SIZE)) - - return - } - - const providersToLoad = featuredProvidersRef.current.filter(provider => { - const state = browsePaginationRef.current[provider.name] - return provider.requestAdditionalConnectors && state?.nextPage != null && !state.isLoading - }) - - if (providersToLoad.length === 0) return - - setBrowsePaginationByProvider(previous => upsertPaginationState(previous, providersToLoad.map(provider => provider.name), DEFAULT_BROWSE_PAGE_SIZE)) - - const results = await Promise.all(providersToLoad.map(async (provider) => { - const state = browsePaginationRef.current[provider.name] - try { - const result = await provider.requestAdditionalConnectors?.({ - page: state?.nextPage ?? 1, - pageSize: state?.pageSize ?? DEFAULT_BROWSE_PAGE_SIZE, - }) - return { providerName: provider.name, result } - } catch { - return { providerName: provider.name, result: undefined } - } - })) - - setBrowsePaginationByProvider(previous => applyLoadMoreResults(previous, results, DEFAULT_BROWSE_PAGE_SIZE)) - } finally { - loadMoreInFlightRef.current = false - } - }, []) - - useEffect(() => { - if (!loadMoreTriggerRef.current) return; - const observer = new IntersectionObserver((entries) => { - if (entries[0].isIntersecting && anyProviderHasMore && !anyProviderLoadingMore) { - void loadMore() - } - }, { threshold: 0.1, rootMargin: '100px' }); - observer.observe(loadMoreTriggerRef.current); - return () => observer.disconnect(); - }, [anyProviderHasMore, anyProviderLoadingMore, loadMore, selectedConnector, selectedMultiChainConnector]); - - if (selectedConnector?.extensionNotFound && !selectedConnector?.showQrCode && !isMobilePlatfrom) { - const provider = featuredProviders.find(p => p.name === selectedConnector?.providerName) - if (!provider) return null - return { connect(connector, provider) }} /> - } - if (selectedConnector?.qr?.state && (!selectedConnector?.hasBrowserExtension || selectedConnector?.showQrCode)) { - return - } - - if (selectedConnector) { - const provider = featuredProviders.find(p => p.name === selectedConnector?.providerName) - // Aztec (Azguard) surfaces an emoji-verification step mid-connection — - // render it inline here instead of as a separate overlay. - if (pendingVerification) { - return { pendingVerification.cancel(); setSelectedConnector(undefined) }} - /> - } - return { (selectedConnector && provider) && connect(selectedConnector, provider) }} - selectedConnector={selectedConnector} - connectionError={connectionError} - /> - } - - if (selectedMultiChainConnector) { - return - } - - return ( - <> -
-
- - { - (!selectedProvider || selectedProvider?.isSelectedFromFilter) && - - } -
-
-
- { - initialConnectors.map(item => { - const provider = featuredProviders.find(p => p.name === item.providerName) - const isRecent = recentConnectors?.some(v => v.connectorName === item.name) - return ( - provider && connect(item, provider)} - connectingConnector={selectedConnector} - isRecent={isRecent} - isProviderReady={provider?.ready} - /> - ) - }) - } -
- {(anyProviderHasMore || anyProviderLoadingMore) && ( -
- -
- )} -
-
- - ) -} - - -export default ConnectorsList \ No newline at end of file diff --git a/apps/app/components/WalletModal/InstalledExtensionNotFound.tsx b/apps/app/components/WalletModal/InstalledExtensionNotFound.tsx deleted file mode 100644 index 76d6b2cd..00000000 --- a/apps/app/components/WalletModal/InstalledExtensionNotFound.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { FC } from "react"; -import { WalletModalConnector } from "."; -import { Download, ScanLine } from "lucide-react"; -import { resolveWalletConnectorIcon } from "../../lib/wallets/utils/resolveWalletIcon"; -import TrainLogoSymbol from "../Icons/TrainLogoSymbol"; - -export const InstalledExtensionNotFound: FC<{ - selectedConnector: WalletModalConnector | undefined, - onConnect: (connector: WalletModalConnector) => void -}> = ({ selectedConnector, onConnect }) => { - const ConnectorIcon = resolveWalletConnectorIcon({ connector: selectedConnector?.name, iconUrl: selectedConnector?.icon }); - return
-
-
-
-
- -
-
-
- -
-
-
-

{selectedConnector?.name} not detected

-

- Install the extension or connect with your phone -

-
-
-
-
- {selectedConnector && selectedConnector.hasBrowserExtension && ( - - )} - {selectedConnector?.installUrl && ( - - )} -
-
-} \ No newline at end of file diff --git a/apps/app/components/WalletModal/LoadingConnect.tsx b/apps/app/components/WalletModal/LoadingConnect.tsx deleted file mode 100644 index baf62c3e..00000000 --- a/apps/app/components/WalletModal/LoadingConnect.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { FC } from "react"; -import { WalletModalConnector } from "."; -import { Link2Off, RotateCw } from "lucide-react"; -import { resolveWalletConnectorIcon } from "../../lib/wallets/utils/resolveWalletIcon"; -import TrainLogoSymbol from "../Icons/TrainLogoSymbol"; -import { isMobile } from "@/lib/wallets/utils/isMobile"; - -export const LoadingConnect: FC<{ onRetry: () => void, selectedConnector: WalletModalConnector, connectionError: string | undefined }> = ({ onRetry, selectedConnector, connectionError }) => { - const ConnectorIcon = resolveWalletConnectorIcon({ connector: selectedConnector?.name, iconUrl: selectedConnector.icon }); - const isMobilePlatform = isMobile(); - - return ( -
- { - selectedConnector && -
-
-
-
- -
- { - connectionError ? - - : -
- } -
- -
-
-
- {connectionError ? ( - <> -

Connection failed

-

{connectionError}

- - ) : ( - <> -

{isMobilePlatform ? 'Approve connection in your wallet' : 'Approve connection in your wallet pop-up'}

-

{isMobilePlatform ? "Don't see the request? Check your wallet app." : "Don't see a pop-up? Check your browser windows."}

- - )} -
-
-
- } - { - connectionError && - - } -
- ) -} \ No newline at end of file diff --git a/apps/app/components/WalletModal/MultichainConnectorPicker.tsx b/apps/app/components/WalletModal/MultichainConnectorPicker.tsx deleted file mode 100644 index 2806a3f3..00000000 --- a/apps/app/components/WalletModal/MultichainConnectorPicker.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { FC } from "react"; -import { WalletModalConnector } from "."; -import { InternalConnector, WalletProvider } from "../../Models/WalletProvider"; -import { resolveWalletConnectorIcon } from "../../lib/wallets/utils/resolveWalletIcon"; -import { ImageWithFallback } from "../Common/ImageWithFallback"; - -type MultichainConnectorModalProps = { - selectedConnector: WalletModalConnector, - allConnectors: InternalConnector[], - providers: WalletProvider[], - connect: (connector: InternalConnector, provider: WalletProvider) => Promise -} - -export const MultichainConnectorPicker: FC = ({ selectedConnector, allConnectors, providers, connect }) => { - const Icon = resolveWalletConnectorIcon({ connector: selectedConnector.id, iconUrl: selectedConnector.icon }) - return ( -
-
-
-
- -
-

- {selectedConnector.name} supports multiple network types. Please select the one you'd like to use. -

-
-
- -
- { - Array.from( - allConnectors - .filter(c => c?.name === selectedConnector.name) - .reduce((map, connector) => { - if (!connector?.providerName) return map; - if (!map.has(connector.providerName)) { - map.set(connector.providerName, connector); - } - return map; - }, new Map()) - .values() - ).map((connector, index) => { - const provider = providers.find(p => p.name === connector?.providerName) - return ( - - ) - }) - } -
-
- ) -} diff --git a/apps/app/components/WalletModal/ProviderPicker.tsx b/apps/app/components/WalletModal/ProviderPicker.tsx deleted file mode 100644 index 3afd4876..00000000 --- a/apps/app/components/WalletModal/ProviderPicker.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC, useMemo, useState } from "react"; -import { WalletProvider } from "../../Models/WalletProvider"; -import clsx from "clsx"; -import { Popover, PopoverContent, PopoverTrigger } from "../shadcn/popover"; -import { Checkbox } from "../shadcn/checkbox"; -import MenuIcon from "@/components/Icons/MenuIcon"; - -export const ProviderPicker: FC<{ providers: WalletProvider[], selectedProviderNames: string[], setSelectedProviderNames: (providerNames: string[]) => void }> = ({ providers, selectedProviderNames, setSelectedProviderNames }) => { - const values = useMemo(() => providers.map(p => p.name).sort(), [providers]) - const [open, setOpen] = useState(false) - - const onSelect = (item: string) => { - if (selectedProviderNames.includes(item)) { - const next = selectedProviderNames.filter(p => p !== item) - setSelectedProviderNames(next) - } else { - setSelectedProviderNames([...selectedProviderNames, item]) - } - } - - const handleClear = () => { - setSelectedProviderNames([]) - setOpen(false) - } - - return ( - setOpen(!open)}> - 0, - })} - > - - {selectedProviderNames.length > 0 && ( -
- {selectedProviderNames.length} -
- )} -
- - { - values.map((item, index) => ( -
onSelect(item)} className="px-2 py-1 text-left flex items-center w-full gap-2.5 hover:bg-secondary-600 rounded-lg transition-colors duration-200 text-secondary-text cursor-pointer"> - e.stopPropagation()} - onCheckedChange={() => onSelect(item)} - /> - -
- )) - } - {selectedProviderNames.length > 0 && ( - - )} -
-
- ) -} \ No newline at end of file diff --git a/apps/app/components/WalletModal/WalletQrCode.tsx b/apps/app/components/WalletModal/WalletQrCode.tsx deleted file mode 100644 index b609cc42..00000000 --- a/apps/app/components/WalletModal/WalletQrCode.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { FC } from "react"; -import { WalletModalConnector } from "."; -import { resolveWalletConnectorIcon } from "../../lib/wallets/utils/resolveWalletIcon"; -import { QRCodeSVG } from "qrcode.react"; -import CopyButton from "../buttons/copyButton"; - -export const WalletQrCode: FC<{ selectedConnector: WalletModalConnector }> = ({ selectedConnector }) => { - const ConnectorIcon = resolveWalletConnectorIcon({ connector: selectedConnector?.name, iconUrl: selectedConnector.icon }); - - return
-
-
- -

{selectedConnector?.name}

-
-
- { - selectedConnector?.qr?.state == 'fetched' ? - - : -
-
- -
- } -
-

Scan with your phone to connect

-
-
- Copy link -
-
-} \ No newline at end of file diff --git a/apps/app/components/WalletModal/index.tsx b/apps/app/components/WalletModal/index.tsx index f4515f77..75927741 100644 --- a/apps/app/components/WalletModal/index.tsx +++ b/apps/app/components/WalletModal/index.tsx @@ -1,137 +1,94 @@ -import { Context, createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react' -import { InternalConnector, Wallet, WalletProvider } from '../../Models/WalletProvider'; +import { createContext, type Dispatch, type ReactNode, type SetStateAction, useCallback, useContext, useEffect, useMemo, useState } from "react"; +import { connectModalStore } from "@layerswap/wallet-core"; +import * as UiKit from "@layerswap/ui-kit"; +import type { ModalWalletProvider } from "@layerswap/ui-kit"; +import type { WalletConnectionProvider, WalletModalConnector } from "@layerswap/wallet-core/types"; +import type { Wallet } from "@layerswap/widget-types"; -export type WalletModalConnector = InternalConnector & { - qr?: ({ - state: 'loading', - value: undefined, - deepLink?: undefined - } | { - state: 'fetched', - value: string, - deepLink?: string - }); - showQrCode?: boolean -} +type ConnectDisplayMode = 'drawer' | 'dialog' -export type ModalWalletProvider = WalletProvider & { - isSelectedFromFilter?: boolean; +type ConnectOptions = { + displayMode?: ConnectDisplayMode; } -export type ConnectDisplayMode = 'drawer' | 'dialog' - -type SharedType = { provider?: WalletProvider, connectCallback: (value: Wallet | undefined) => void, displayMode?: ConnectDisplayMode } - type ConnectModalContextType = { - connect: ({ provider, connectCallback, displayMode }: SharedType) => void; + connect: (provider?: WalletConnectionProvider, options?: ConnectOptions) => Promise; cancel: () => void; selectedProvider: ModalWalletProvider | undefined; - setSelectedProvider: (value: ModalWalletProvider | undefined) => void; - isWalletModalOpen?: boolean; + setSelectedProvider: (provider: ModalWalletProvider | undefined) => void; selectedConnector: WalletModalConnector | undefined; - setSelectedConnector: (value: WalletModalConnector | undefined) => void; - selectedMultiChainConnector: InternalConnector | undefined; - setSelectedMultiChainConnector: (value: InternalConnector | undefined) => void; + setSelectedConnector: Dispatch>; + selectedMultiChainConnector: WalletModalConnector | undefined; + setSelectedMultiChainConnector: (connector: WalletModalConnector | undefined) => void; goBack: () => void; - onFinish: (connectedWallet?: Wallet | undefined) => void; - setOpen: (value: boolean) => void; + onFinish: (wallet?: Wallet) => void; + setOpen: (open: boolean) => void; open: boolean; displayMode: ConnectDisplayMode; }; const ConnectModalContext = createContext(null); -export function WalletModalProvider({ children }) { - const [connectConfig, setConnectConfig] = useState(undefined); +export function WalletModalProvider({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} - const [selectedProvider, setSelectedProvider] = useState(undefined); - const [selectedConnector, setSelectedConnector] = useState(undefined); - const [selectedMultiChainConnector, setSelectedMultiChainConnector] = useState(undefined) +function WalletModalShell({ children }: { children: ReactNode }) { + const { selectedProvider, setSelectedProvider, selectedConnector, setSelectedConnector, + selectedMultiChainConnector, setSelectedMultiChainConnector, start, cancel: cancelFlow, finish, goBack, } = UiKit.useConnectModal(); const [open, setOpen] = useState(false); - const [isWalletModalOpen, setIsWalletModalOpen] = useState(false); - const [displayMode, setDisplayMode] = useState('drawer'); + const [displayMode, setDisplayMode] = useState("drawer"); - const connect = useCallback(async ({ provider, connectCallback, displayMode: mode = 'drawer' }: SharedType) => { + const connect = useCallback(async ( + provider?: WalletConnectionProvider, + options: ConnectOptions = {}, + ) => { const hasConnectorPicker = !!provider?.availableConnectors?.length || !!provider?.additionalConnectors?.length - || !!provider?.requestAdditionalConnectors + || !!provider?.requestAdditionalConnectors; - if (!hasConnectorPicker) { - await provider?.connectWallet() - } - setSelectedProvider(provider); - setDisplayMode(mode) - setOpen(true) - setConnectConfig({ provider, connectCallback }); - return; - }, []) + if (!hasConnectorPicker) await provider?.connectWallet(); + + setDisplayMode(options.displayMode ?? "drawer"); + setOpen(true); + return start(provider); + }, [start]); const cancel = useCallback(() => { - setConnectConfig(prev => { - prev?.connectCallback(undefined); - return undefined; - }); + cancelFlow(); setOpen(false); - }, []) + }, [cancelFlow]); - const onFinish = useCallback((connectedWallet?: Wallet | undefined) => { - setConnectConfig(prev => { - prev?.connectCallback(connectedWallet); - return undefined; - }); + const onFinish = useCallback((wallet?: Wallet) => { + finish(wallet); setOpen(false); - }, []) - - const goBack = useCallback(() => { - if (selectedConnector) { - setSelectedConnector(undefined) - setSelectedMultiChainConnector(undefined) - return; - } else if (selectedMultiChainConnector) { - setSelectedMultiChainConnector(undefined) - return; - } - }, [selectedConnector, selectedMultiChainConnector]) + }, [finish]); useEffect(() => { if (!open && (selectedConnector || selectedMultiChainConnector)) { - setSelectedConnector(undefined) - setSelectedMultiChainConnector(undefined) - setSelectedProvider(undefined) + setSelectedConnector(undefined); + setSelectedMultiChainConnector(undefined); + setSelectedProvider(undefined); } - setIsWalletModalOpen(open) - }, [open]) + connectModalStore._syncOpen(open); + }, [open]); - const contextValue = useMemo(() => ({ + const value = useMemo(() => ({ connect, cancel, selectedProvider, setSelectedProvider, - selectedConnector, setSelectedConnector, - selectedMultiChainConnector, setSelectedMultiChainConnector, - isWalletModalOpen, goBack, onFinish, setOpen, open, displayMode - }), [connect, cancel, selectedProvider, selectedConnector, - selectedMultiChainConnector, isWalletModalOpen, goBack, onFinish, open, displayMode]) + selectedConnector, setSelectedConnector, selectedMultiChainConnector, setSelectedMultiChainConnector, + goBack, onFinish, setOpen, open, displayMode, + }), [cancel, connect, displayMode, goBack, onFinish, open, + selectedConnector, selectedMultiChainConnector, selectedProvider,]) - return ( - - {children} - - ) + return {children}; } -export const useConnectModal = () => { - - const context = useContext(ConnectModalContext as Context); - - if (!context) { - throw new Error('useConnectModal must be used within a ConnectModalProvider'); - } - - const connect = useCallback( - (provider?: WalletProvider, options?: { displayMode?: ConnectDisplayMode }): Promise => - new Promise((res) => { - context.connect({ provider, connectCallback: res, displayMode: options?.displayMode }); - }), - [context.connect] - ); - - return useMemo(() => ({ ...context, connect }), [context, connect]); -}; \ No newline at end of file +export function useConnectModal() { + const context = useContext(ConnectModalContext); + if (!context) throw new Error("useConnectModal must be used within a ConnectModalProvider") + return context; +} diff --git a/apps/app/components/WalletModal/utils.ts b/apps/app/components/WalletModal/utils.ts deleted file mode 100644 index 66118a79..00000000 --- a/apps/app/components/WalletModal/utils.ts +++ /dev/null @@ -1,55 +0,0 @@ -export function removeDuplicatesWithKey(arr: any[], key: string) { - const countMap = {}; - const providerMap = {}; - - // First pass: Count occurrences of each unique key and track unique providers. - arr.forEach(item => { - const identifier = item[key]; - countMap[identifier] = (countMap[identifier] || 0) + 1; - - // Track unique provider names for this connector - if (!providerMap[identifier]) { - providerMap[identifier] = new Set(); - } - if (item.providerName) { - providerMap[identifier].add(item.providerName); - } - }); - - // Second pass: Create a new array with one instance of each object. - const unique: any[] = []; - const seen = new Set(); - - arr.forEach(item => { - const identifier = item[key]; - if (!seen.has(identifier)) { - seen.add(identifier); - // Only mark as multichain if there are duplicates across different providers - const uniqueProviders = providerMap[identifier]?.size || 0; - unique.push({ - ...item, - isMultiChain: countMap[identifier] > 1 && uniqueProviders > 1 - }); - } - }); - return unique; -} - -export function sortRecentConnectors(a: { name: string, type?: string }, b: { name: string, type?: string }, recentConnectors: { connectorName?: string }[]) { - function getIndex(c: { name: string }) { - const idx = recentConnectors?.findIndex(v => v.connectorName === c.name); - return idx === -1 ? Infinity : idx; - } - const indexA = getIndex(a); - const indexB = getIndex(b); - if (indexA !== indexB) { - return indexA - indexB; - } - // Return 0 for non-recents so the stable sort preserves upstream registry - // order. Sorting by `type.localeCompare` here groups wallets by type - // alphabetically, which means a new `other`-type wallet arriving on page 2 - // gets inserted before all already-rendered `walletConnect`-type wallets, - // visibly pushing them down. Upstream ordering (installed → featured → - // registry) is already what we want. - return 0; -} \ No newline at end of file diff --git a/apps/app/components/WalletProviders/AztecWalletProvider.tsx b/apps/app/components/WalletProviders/AztecWalletProvider.tsx index d8f7c6f4..ca4f3dd6 100644 --- a/apps/app/components/WalletProviders/AztecWalletProvider.tsx +++ b/apps/app/components/WalletProviders/AztecWalletProvider.tsx @@ -3,6 +3,7 @@ import type { Wallet as AztecWallet } from "@aztec/aztec.js/wallet"; import type { WalletProvider as AztecSDKWalletProvider, PendingConnection } from "@aztec/wallet-sdk/manager"; import { AZTEC_APP_ID, useAztecCapabilityManifest, useAztecChainInfo } from "@/lib/wallets/aztec/configs"; import { useAztecWalletStore } from "@/stores/aztecWalletStore"; +import { useWalletStore } from "@/stores/walletStore"; import { ActiveAztecAccountProvider } from "./ActiveAztecAccount"; /** @@ -40,6 +41,7 @@ export const AztecWalletProvider: React.FC<{ children: ReactNode }> = ({ childre disconnectUnsubRef.current?.(); disconnectUnsubRef.current = null; setWallet(null); + useWalletStore.getState().disconnectWallet("Aztec"); activeProviderRef.current = null; }, [setWallet]); diff --git a/apps/app/components/WalletProviders/FuelProvider.tsx b/apps/app/components/WalletProviders/FuelProvider.tsx deleted file mode 100644 index 145384ff..00000000 --- a/apps/app/components/WalletProviders/FuelProvider.tsx +++ /dev/null @@ -1,53 +0,0 @@ - -'use client'; - -import { BakoRequestAPI } from '../../lib/wallets/fuel/lib/connectors/bako-safe/Bako'; -import { FuelProvider, type NetworkConfig } from '@fuels/react'; -import { useSettingsState } from '@/context/settings'; -import { useRpcConfigStore } from '@/stores/rpcConfigStore'; -import { useMemo } from 'react'; -import { BakoSafeConnector } from '@/lib/wallets/fuel/lib/connectors/bako-safe'; -import { FuelWalletConnector } from '@/lib/wallets/fuel/lib/connectors/fuel-wallet'; -import { FueletWalletConnector } from '@/lib/wallets/fuel/lib/connectors/fuelet-wallet'; -import { NetworkTypes } from '@/Models/Network'; - -const HOST_URL = 'https://api.bako.global'; - -const FuelProviderWrapper = ({ - children -}: { children: React.ReactNode }) => { - - const { networks } = useSettingsState() - const getEffectiveRpcUrls = useRpcConfigStore(s => s.getEffectiveRpcUrls) - - const fuelConfig = useMemo(() => ({ - connectors: [ - new FuelWalletConnector(), - new BakoSafeConnector({ - api: new BakoRequestAPI(HOST_URL) - }), - new FueletWalletConnector(), - ] - }), []) - - const fuelNetworks = useMemo(() => networks - .filter(network => network.networkType === NetworkTypes.Fuel) - .map((network) => ({ - chainId: Number(network.chainId), - url: getEffectiveRpcUrls(network)[0] - })), [networks, getEffectiveRpcUrls]) - - return ( - - {children} - - ); -}; - - -export default FuelProviderWrapper; diff --git a/apps/app/components/WalletProviders/LayerswapRegistry.tsx b/apps/app/components/WalletProviders/LayerswapRegistry.tsx new file mode 100644 index 00000000..7ebf65b3 --- /dev/null +++ b/apps/app/components/WalletProviders/LayerswapRegistry.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { type FC, type ReactNode, useMemo } from "react"; +import { useConfig } from "wagmi"; +import { DescriptorHydrationBoundary, WalletProvidersRegistryProvider } from "@layerswap/wallet-core"; +import { type WalletProvider, type WalletProviderDescriptor, type WalletWrapper } from "@layerswap/wallet-core/types"; +import { AppSettings as LayerswapAppSettings } from "@layerswap/utils"; +import { useSettingsState } from "@/context/settings"; +import { walletNetworkAdapter } from "@/lib/wallets/layerswap/networkAdapter"; +import { getLayerswapProviders } from "@/lib/wallets/layerswap/getLayerswapProviders"; + +type Provider = WalletProvider | WalletProviderDescriptor | WalletWrapper; + +const Registry = WalletProvidersRegistryProvider as FC<{ + networks: ReturnType["networks"]; + networkAdapter: typeof walletNetworkAdapter; + walletProviders: Provider[]; + children?: ReactNode; +}>; + +const LayerswapRegistry: FC<{ children: ReactNode }> = ({ children }) => { + const { networks } = useSettingsState(); + const wagmiConfig = useConfig(); + const walletProviders = useMemo(() => getLayerswapProviders({ networks, wagmiConfig }), [networks, wagmiConfig]); + + if (typeof window !== "undefined") { + LayerswapAppSettings.ApiVersion = process.env.NEXT_PUBLIC_API_VERSION === "sandbox" ? "testnet" : "mainnet"; + } + + return ( + + {resolvedProviders => {children}} + + ); +}; + +export default LayerswapRegistry; diff --git a/apps/app/components/WalletProviders/SolanaProvider.tsx b/apps/app/components/WalletProviders/SolanaProvider.tsx deleted file mode 100644 index 0754d261..00000000 --- a/apps/app/components/WalletProviders/SolanaProvider.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { clusterApiUrl } from "@solana/web3.js"; -import { - ConnectionProvider, - WalletProvider, -} from "@solana/wallet-adapter-react"; -import AppSettings from "../../lib/AppSettings"; -import { useSettingsState } from "../../context/settings"; -import { useRpcConfigStore } from "../../stores/rpcConfigStore"; -import { - NightlyWalletAdapter, - PhantomWalletAdapter, - SolflareWalletAdapter, - BitgetWalletAdapter, - TrustWalletAdapter, - LedgerWalletAdapter -} from "@solana/wallet-adapter-wallets"; -import { ReactNode, useMemo } from "react"; -import { WalletAdapterNetwork } from "@solana/wallet-adapter-base"; -import { WALLETCONNECT_PROJECT_ID, WALLETCONNECT_METADATA } from "@/lib/walletConnect/config"; -import { SolanaWalletConnectAdapter } from "@/lib/wallets/solana/connectors/SolanaWalletConnectAdapter"; - -function SolanaProvider({ children }: { children: ReactNode }) { - const settings = useSettingsState(); - const { getEffectiveRpcUrl } = useRpcConfigStore(); - const solNetwork = AppSettings.ApiVersion === 'sandbox' ? WalletAdapterNetwork.Devnet : WalletAdapterNetwork.Mainnet; - - // Find Solana network in settings - const solanaNetwork = settings?.networks?.find( - n => n.networkType === "solana" - ); - - // Use custom RPC if configured, otherwise use default - const endpoint = useMemo(() => { - if (solanaNetwork) { - return getEffectiveRpcUrl(solanaNetwork); - } - return clusterApiUrl(solNetwork); - }, [solNetwork, solanaNetwork, getEffectiveRpcUrl]); - - const adapters = [ - new PhantomWalletAdapter(), - new NightlyWalletAdapter(), - new SolflareWalletAdapter(), - new BitgetWalletAdapter(), - new TrustWalletAdapter(), - new LedgerWalletAdapter(), - new SolanaWalletConnectAdapter({ - network: solNetwork, - options: { - projectId: WALLETCONNECT_PROJECT_ID, - metadata: WALLETCONNECT_METADATA, - } - }) - ] - - - return ( - - - {children} - - - ); -} - -export default SolanaProvider; \ No newline at end of file diff --git a/apps/app/components/WalletProviders/StarknetProvider.tsx b/apps/app/components/WalletProviders/StarknetProvider.tsx deleted file mode 100644 index a78535d0..00000000 --- a/apps/app/components/WalletProviders/StarknetProvider.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import { FC, ReactNode, useEffect, useState } from "react"; -import { mainnet, sepolia } from "@starknet-react/chains" -import { Connector, ConnectorNotConnectedError, UserNotConnectedError, StarknetConfig, publicProvider, useConnect, useDisconnect } from '@starknet-react/core'; -import { useSettingsState } from "../../context/settings"; -import { useStarknetStore } from "../../stores/starknetWalletStore"; -import KnownInternalNames from "../../lib/knownIds"; -import useStarknet, { resolveStarknetWallet, starknetNames } from "../../lib/wallets/starknet/useStarknet"; -import { RpcMessage, RequestFnCall, RpcTypeToMessageMap } from "@starknet-io/types-js"; -import { useRpcConfigStore } from "@/stores/rpcConfigStore"; - -let getInjectedWalletById: ((id: string) => unknown) | undefined; -class DiscoveryConnector extends Connector { - #wallet; - #store; - - constructor(wallet, store) { - super(); - this.#wallet = wallet; - this.#store = store; - } - - get id() { - return `${this.#wallet.id}-mobile`; - } - - get icon() { - return { - dark: this.#wallet.icon, - light: this.#wallet.icon - }; - } - - get name() { - return `${this.#wallet.name} (mobile)`; - } - - available() { - return true; - } - - connect(): any { - window.open(this.#wallet.downloads[this.#store], "_blank"); - return undefined - } - - get wallet() { - throw new ConnectorNotConnectedError() - } - - disconnect(): any { - throw new UserNotConnectedError() - } - - account(): any { - throw new ConnectorNotConnectedError() - } - ready(): Promise { - throw new Error("Method not implemented."); - } - chainId(): Promise { - throw new Error("Method not implemented."); - } - request(call: RequestFnCall): Promise { - throw new Error("Method not implemented."); - } - -} - -const StarknetProvider: FC<{ children: ReactNode }> = ({ children }) => { - const [connectors, setConnectors] = useState([]) - - const resolveConnectors = async () => { - // @ts-ignore - const injectedModule = await import("starknetkit/injected"); - // @ts-ignore - const webWalletModule = await import("starknetkit/webwallet"); - // @ts-ignore - const controllerModule = await import("starknetkit/controller"); - - const InjectedConnector = (injectedModule as any).InjectedConnector; - const WebWalletConnector = (webWalletModule as any).WebWalletConnector; - const ControllerConnector = (controllerModule as any).ControllerConnector; - getInjectedWalletById = InjectedConnector?.getInjectedWallet; - - const isSafari = - typeof window !== "undefined" - ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent) - : false - const isAndroid = navigator.userAgent.match(/Android/i); - const isIOS = navigator.userAgent.match(/iPhone|iPad|iPod/i); - - const defaultConnectors: any[] = [] - - if (!isSafari) { - defaultConnectors.push( - new InjectedConnector({ options: { id: "argentX" } }), - ) - defaultConnectors.push( - new InjectedConnector({ options: { id: "keplr" } }), - ) - defaultConnectors.push( - new InjectedConnector({ options: { id: "braavos" } }), - ) - defaultConnectors.push( - new InjectedConnector({ options: { id: "xverse" } }), - ) - } - - if ((isAndroid || isIOS) && !defaultConnectors.some(c => c.id === "braavos")) { - const starknet = (await import('get-starknet-core')).default - - const discoverWallets = (await starknet.getDiscoveryWallets()).filter(w => { - return (isAndroid && w.downloads["android"]) || (isIOS && w.downloads["ios"]); - }) - if (discoverWallets.length) defaultConnectors.push(...discoverWallets.map(w => new DiscoveryConnector(w, isAndroid ? "android" : "ios"))) - } - - defaultConnectors.push( - new ControllerConnector(), - ) - - defaultConnectors.push(new WebWalletConnector()) - - return defaultConnectors - } - - useEffect(() => { - let cancelled = false; - resolveConnectors().then((result) => { - if (!cancelled) setConnectors(result) - }).catch(() => { - if (!cancelled) setConnectors([]) - }); - return () => { cancelled = true }; - }, []) - - const chains = [mainnet, sepolia] - - return ( - - - {children} - - ) -} - -export default StarknetProvider; - -const StarknetWalletInitializer = () => { - const { connectors } = useConnect(); - const { disconnectAsync } = useDisconnect(); - const { networks } = useSettingsState(); - const starknetAccounts = useStarknetStore((state) => state.starknetAccounts) || {}; - const addWallet = useStarknetStore((state) => state.connectWallet); - const removeAccount = useStarknetStore((state) => state.removeAccount); - const { getEffectiveRpcUrl } = useRpcConfigStore() - - const { withdrawalSupportedNetworks, autofillSupportedNetworks, asSourceSupportedNetworks } = useStarknet(); - const [connectorsReady, setConnectorsReady] = useState(false) - const network = networks?.find(network => starknetNames.some(name => name === network.caip2Id)) - const nodeUrl = network ? getEffectiveRpcUrl(network) : undefined - - useEffect(() => { - if (connectors.length === 0 || connectorsReady || Object.keys(starknetAccounts).length == 0) return; - - const checkConnectorsReady = () => { - const hasWallet = connectors.some(connector => { - try { - const wallet = getInjectedWalletById?.(connector.id); - return wallet !== null && wallet !== undefined; - } catch { - return false; - } - }); - - if (hasWallet) { - setConnectorsReady(true); - } - }; - checkConnectorsReady(); - - const interval = setInterval(checkConnectorsReady, 500); - - return () => clearInterval(interval); - }, [connectors, connectorsReady, starknetAccounts]) - - useEffect(() => { - const initializeWallet = async () => { - const starknetNetwork = networks.find( - (n) => - n.caip2Id === KnownInternalNames.Networks.StarkNetMainnet || - n.caip2Id === KnownInternalNames.Networks.StarkNetSepolia - ); - - for (const connector of connectors) { - const address = starknetAccounts[connector.id]; - if (address) { - const wallet = await resolveStarknetWallet({ - name: "Starknet", - connector, - network: starknetNetwork, - disconnectWallets: () => disconnectAsync().then(() => removeAccount(address)), - withdrawalSupportedNetworks, - autofillSupportedNetworks, - asSourceSupportedNetworks, - address, - nodeUrl - }); - - if (wallet?.address) { - addWallet(wallet); - } - } - } - }; - - if (Object.keys(starknetAccounts).length && connectorsReady) { - initializeWallet(); - } - }, [connectors, networks, connectorsReady]); - - return <>; -} diff --git a/apps/app/components/WalletProviders/TronProvider.tsx b/apps/app/components/WalletProviders/TronProvider.tsx deleted file mode 100644 index fec2ea8e..00000000 --- a/apps/app/components/WalletProviders/TronProvider.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useEffect, useState } from 'react'; -import { WalletProvider } from '@tronweb3/tronwallet-adapter-react-hooks'; - -export default function TronProvider({ children }: { children: React.ReactNode }) { - const [adapters, setAdapters] = useState([]); - - useEffect(() => { - let cancelled = false; - - const loadAdapters = async () => { - if (typeof window === 'undefined') return; - - const [ - metamaskModule, - tronLinkModule, - okxModule, - bitkeepModule, - bybitModule, - gateModule - ] = await Promise.all([ - import('@tronweb3/tronwallet-adapter-metamask-tron'), - import('@tronweb3/tronwallet-adapter-tronlink'), - import('@tronweb3/tronwallet-adapter-okxwallet'), - import('@tronweb3/tronwallet-adapter-bitkeep'), - import('@tronweb3/tronwallet-adapter-bybit'), - import('@tronweb3/tronwallet-adapter-gatewallet'), - ]); - - if (cancelled) return; - - const { MetaMaskAdapter } = metamaskModule; - const { TronLinkAdapter } = tronLinkModule; - const { OkxWalletAdapter } = okxModule; - const { BitKeepAdapter } = bitkeepModule; - const { BybitWalletAdapter } = bybitModule; - const { GateWalletAdapter } = gateModule; - - setAdapters([ - new MetaMaskAdapter(), - new TronLinkAdapter(), - new OkxWalletAdapter(), - new BitKeepAdapter(), - new BybitWalletAdapter(), - new GateWalletAdapter(), - ]); - }; - - loadAdapters().catch(() => { - // Keep provider mounted even if adapter loading fails. - setAdapters([]); - }); - - return () => { - cancelled = true; - }; - }, []); - - return ( - - {children} - - ); -} diff --git a/apps/app/components/WalletProviders/Wagmi.tsx b/apps/app/components/WalletProviders/Wagmi.tsx index 14b69e53..85dab873 100644 --- a/apps/app/components/WalletProviders/Wagmi.tsx +++ b/apps/app/components/WalletProviders/Wagmi.tsx @@ -1,17 +1,16 @@ -import { useSettingsState } from "../../context/settings"; -import resolveChain from "../../lib/resolveChain"; +import { useSettingsState } from "@/context/settings"; +import resolveChain from "@/lib/resolveChain"; import React, { useMemo } from "react"; import { WagmiProvider, createConfig, Config } from 'wagmi' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { Chain, http, fallback, Transport } from 'viem'; import { ActiveEvmAccountProvider } from "./ActiveEvmAccount"; import { useRpcConfigStore } from "@/stores/rpcConfigStore"; -import { getNativeToken, NetworkTypes } from "../../Models/Network"; +import { getNativeToken, NetworkTypes } from "@/Models/Network"; import { coinbaseWallet, metaMask, walletConnect } from "@wagmi/connectors"; -import { walletConnect as customWalletConnect } from "../../lib/wallets/evm/connectors/walletConnect"; -import { isMobile } from "../../lib/wallets/utils/isMobile"; -import { WALLETCONNECT_METADATA, WALLETCONNECT_PROJECT_ID } from "@/lib/walletConnect/config"; -import { HIDDEN_WALLETCONNECT_ID } from "@/lib/wallets/evm/constants"; +import { createHiddenWalletConnectConnector } from "@layerswap/wallet-evm"; +import { isMobile } from "@layerswap/utils"; +import { WALLET_CONNECT_CONFIGS } from "@/lib/wallets/layerswap/getLayerswapProviders"; import { browserInjected } from "@/lib/wallets/evm/connectors/browserInjected"; type Props = { @@ -19,28 +18,10 @@ type Props = { } const queryClient = new QueryClient() -const walletConnectConnector = walletConnect({ projectId: WALLETCONNECT_PROJECT_ID, showQrModal: isMobile(), customStoragePrefix: 'walletConnect' }) -const hiddenWalletConnectConnector = customWalletConnect({ - id: HIDDEN_WALLETCONNECT_ID, - name: 'Hidden WalletConnect', - rdns: '', - type: 'other', - mobile: { native: '', universal: '' }, - icon: '', - projectId: WALLETCONNECT_PROJECT_ID, - showQrModal: false, -}) -const metaMaskConnector = metaMask({ - dappMetadata: { - name: WALLETCONNECT_METADATA.name, - url: WALLETCONNECT_METADATA.url, - iconUrl: WALLETCONNECT_METADATA.icons[0] - } -}) -const coinbaseWalletConnector = coinbaseWallet({ - appName: WALLETCONNECT_METADATA.name, - appLogoUrl: WALLETCONNECT_METADATA.icons[0], -}) +const walletConnectConnector = walletConnect({ projectId: WALLET_CONNECT_CONFIGS.projectId, showQrModal: isMobile(), customStoragePrefix: 'walletConnect' }) +const hiddenWalletConnectConnector = createHiddenWalletConnectConnector({ projectId: WALLET_CONNECT_CONFIGS.projectId }) +const metaMaskConnector = metaMask({ dappMetadata: { name: WALLET_CONNECT_CONFIGS.name, url: WALLET_CONNECT_CONFIGS.url, iconUrl: WALLET_CONNECT_CONFIGS.icons[0] } }) +const coinbaseWalletConnector = coinbaseWallet({ appName: WALLET_CONNECT_CONFIGS.name, appLogoUrl: WALLET_CONNECT_CONFIGS.icons[0] }) const browserInjectedConnector = browserInjected() const defaultConnectors = [ metaMaskConnector, diff --git a/apps/app/components/WalletProviders/index.tsx b/apps/app/components/WalletProviders/index.tsx index 5c343fc4..65959ae6 100644 --- a/apps/app/components/WalletProviders/index.tsx +++ b/apps/app/components/WalletProviders/index.tsx @@ -1,36 +1,29 @@ import { FC } from "react" -import SolanaProvider from "./SolanaProvider" import Wagmi from "./Wagmi"; -import StarknetProvider from "./StarknetProvider"; import { WalletModalProvider } from "../WalletModal"; -import { WalletProvidersProvider } from "../../context/walletHookProviders"; import { AztecWalletProvider } from "./AztecWalletProvider"; import { WalletBridges } from "../WalletBridges"; -import TronProvider from "./TronProvider"; import ConnectWalletDrawer from "../WalletModal/ConnectWalletDrawer"; -import FuelProvider from "./FuelProvider"; +import LayerswapRegistry from "./LayerswapRegistry"; +import { AztecWalletAdapterHydrator } from "@/lib/wallets/aztec/adapter"; +import { TrainWalletListAdapters } from "../Wallet/walletListAdapters"; const WalletsProviders: FC<{ children: JSX.Element | JSX.Element[] }> = ({ children }) => { return ( - - - - - - - - - - - {children} - - - - - - - - + + + + + + + + + {children} + + + + + ) } diff --git a/apps/app/components/Widget/Index.tsx b/apps/app/components/Widget/Index.tsx index 5b9a0ed3..450d903d 100644 --- a/apps/app/components/Widget/Index.tsx +++ b/apps/app/components/Widget/Index.tsx @@ -24,7 +24,7 @@ const Widget = ({ children, className, hideMenu, mode = "default" }: Props) => { const handleBack = pathname === "/" ? null : goBack return <> -
= ({ children, wizardId, className }) => { return <> -
+
{!noToolBar && }
diff --git a/apps/app/components/buttons/connectButton.tsx b/apps/app/components/buttons/connectButton.tsx deleted file mode 100644 index 26e57b00..00000000 --- a/apps/app/components/buttons/connectButton.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { ButtonHTMLAttributes, forwardRef } from "react"; -import useWallet from "../../hooks/useWallet"; -import { useConnectModal } from "../WalletModal"; - -type Props = ButtonHTMLAttributes; - -const ConnectButton = forwardRef(function ConnectButton( - { children, className, onClick, ...rest }, - ref -) { - const { providers } = useWallet(); - const filteredProviders = providers.filter(p => !!p.autofillSupportedNetworks) - const { connect } = useConnectModal() - - return ( - - ) -}); - -export default ConnectButton; \ No newline at end of file diff --git a/apps/app/components/buttons/copyButton.tsx b/apps/app/components/buttons/copyButton.tsx deleted file mode 100644 index c6de1d5e..00000000 --- a/apps/app/components/buttons/copyButton.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { Check, Copy } from 'lucide-react' -import { classNames } from '../utils/classNames' -import useCopyClipboard from '../../hooks/useCopyClipboard' -import React, { FC, useState } from 'react' -import { Tooltip, TooltipContent, TooltipTrigger } from '../shadcn/tooltip' -import CopyIcon from '@/components/Icons/CopyIcon' - -interface CopyButtonProps { - className?: string - toCopy: string | number - children?: React.ReactNode - iconSize?: number - iconClassName?: string -} - -const CopyButton: FC = ({ - className, - toCopy, - children, - iconSize, - iconClassName, - disabled = false, -}) => { - const [isCopied, setCopied] = useCopyClipboard() - const [isTooltipOpen, setTooltipOpen] = useState(false); - - const handleCopyClick = () => { - if (disabled) return; - setCopied(toCopy); - setTooltipOpen(true); - }; - - return ( - - -
- {isCopied ? ( - <> - - {children} - - ) : ( - <> - - {children} - - )} -
-
- -

{isCopied ? "Copied" : "Copy"}

-
-
- ); -} - -export default CopyButton \ No newline at end of file diff --git a/apps/app/components/buttons/iconButton.tsx b/apps/app/components/buttons/iconButton.tsx index 952aa19c..b1c2abf2 100644 --- a/apps/app/components/buttons/iconButton.tsx +++ b/apps/app/components/buttons/iconButton.tsx @@ -1,5 +1,5 @@ import React, { ComponentProps, FC, forwardRef } from 'react' -import { classNames } from '../utils/classNames' +import { cn } from '@layerswap/utils' interface IconButtonProps extends Omit, 'color' | 'ref'> { icon?: React.ReactNode @@ -10,7 +10,7 @@ const IconButton = forwardRef - - ) -}) -AccordionTrigger.displayName = "AccordionTrigger" - -interface AccordionItemContextValue { - value: string -} - -const AccordionItemContext = React.createContext(null) - -const AccordionItemProvider = ({ value, children }: { value: string; children: React.ReactNode }) => { - const contextValue = React.useMemo(() => ({ value }), [value]) - return ( - - {children} - - ) -} - -interface AccordionContentProps extends React.HTMLAttributes { - estimatedHeight?: number - itemsCount?: number -} - -const AccordionContent = React.forwardRef( - ({ className, children, estimatedHeight, itemsCount, ...props }, ref) => { - const context = React.useContext(AccordionContext) - const itemContext = React.useContext(AccordionItemContext) - - if (!context) throw new Error("AccordionContent must be used within Accordion") - if (!itemContext) throw new Error("AccordionContent must be used within AccordionItem") - - const { value: accordionValue, type } = context - const { value: itemValue } = itemContext - - const isOpen = React.useMemo(() => { - if (type === "multiple") { - return Array.isArray(accordionValue) && accordionValue.includes(itemValue) - } - return accordionValue === itemValue - }, [accordionValue, itemValue, type]) - - // Calculate dynamic duration based on items count - const heightDuration = React.useMemo(() => { - if (!itemsCount) return 0.15 - - // Base duration: 0.1s - // Add 0.01s per item, max 0.4s - const baseDuration = 0.1 - const perItemDuration = 0.01 - const maxDuration = 0.4 - - return Math.min(baseDuration + (itemsCount * perItemDuration), maxDuration) - }, [itemsCount]) - - return ( - - - {isOpen && ( - -
- {children} -
-
- )} -
-
- ) - } -) -AccordionContent.displayName = "AccordionContent" - -const EnhancedAccordionItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & { value: string } ->(({ value, children, ...props }, ref) => ( - - - {children} - - -)) -EnhancedAccordionItem.displayName = "AccordionItem" - -export { Accordion, EnhancedAccordionItem as AccordionItem, AccordionTrigger, AccordionContent } diff --git a/apps/app/components/shadcn/badge.tsx b/apps/app/components/shadcn/badge.tsx index be8c4750..80efb62c 100644 --- a/apps/app/components/shadcn/badge.tsx +++ b/apps/app/components/shadcn/badge.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" import { Slot } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" const badgeVariants = cva( "group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 rounded-md px-1.5 py-0.5 text-xs font-medium whitespace-nowrap transition-all [&>svg]:pointer-events-none [&>svg]:size-3!", diff --git a/apps/app/components/shadcn/button.tsx b/apps/app/components/shadcn/button.tsx index 59e8eb96..62ecd953 100644 --- a/apps/app/components/shadcn/button.tsx +++ b/apps/app/components/shadcn/button.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" import { Slot } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" const buttonVariants = cva( "group/button inline-flex shrink-0 items-center justify-center rounded-4xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", diff --git a/apps/app/components/shadcn/checkbox.tsx b/apps/app/components/shadcn/checkbox.tsx deleted file mode 100644 index 3178b866..00000000 --- a/apps/app/components/shadcn/checkbox.tsx +++ /dev/null @@ -1,32 +0,0 @@ -"use client" - -import * as React from "react" -import { CheckIcon } from "lucide-react" -import { Checkbox as CheckboxPrimitive } from "radix-ui" - -import { cn } from "@/lib/utils" - -function Checkbox({ - className, - ...props -}: React.ComponentProps) { - return ( - - - - - - ) -} - -export { Checkbox } diff --git a/apps/app/components/shadcn/command.tsx b/apps/app/components/shadcn/command.tsx index d09c8412..8661a18d 100644 --- a/apps/app/components/shadcn/command.tsx +++ b/apps/app/components/shadcn/command.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Command as CommandPrimitive } from "cmdk" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Command({ className, diff --git a/apps/app/components/shadcn/dialog.tsx b/apps/app/components/shadcn/dialog.tsx index 9ea15e88..997e045e 100644 --- a/apps/app/components/shadcn/dialog.tsx +++ b/apps/app/components/shadcn/dialog.tsx @@ -1,157 +1,43 @@ "use client" import * as React from "react" -import { Dialog as DialogPrimitive } from "radix-ui" - -import { cn } from "@/lib/utils" +import { Dialog, DialogClose, DialogContent as BaseDialogContent, DialogDescription as BaseDialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle as BaseDialogTitle, DialogTrigger, } from "@layerswap/ui-kit" +import { cn } from "@layerswap/utils" import { Button } from "@/components/shadcn/button" import { HugeiconsIcon } from "@hugeicons/react" import { Cancel01Icon } from "@hugeicons/core-free-icons" -function Dialog({ - ...props -}: React.ComponentProps) { - return -} - -function DialogTrigger({ - ...props -}: React.ComponentProps) { - return -} - -function DialogPortal({ - ...props -}: React.ComponentProps) { - return -} - -function DialogClose({ - ...props -}: React.ComponentProps) { - return -} - -function DialogOverlay({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - function DialogContent({ className, children, showCloseButton = true, ...props -}: React.ComponentProps & { - showCloseButton?: boolean -}) { - return ( - - - - {children} - {showCloseButton && ( - - - - )} - - - ) -} - -function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ) -} - -function DialogFooter({ - className, - showCloseButton = false, - children, - ...props -}: React.ComponentProps<"div"> & { - showCloseButton?: boolean -}) { +}: React.ComponentProps) { return ( -
{children} {showCloseButton && ( - - - + + + )} -
+ ) } -function DialogTitle({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) +function DialogTitle({ className, ...props }: React.ComponentProps) { + return } -function DialogDescription({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) +function DialogDescription({ className, ...props }: React.ComponentProps) { + return } export { diff --git a/apps/app/components/shadcn/input.tsx b/apps/app/components/shadcn/input.tsx index e32047e3..8070531c 100644 --- a/apps/app/components/shadcn/input.tsx +++ b/apps/app/components/shadcn/input.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Input({ className, type, ...props }: React.ComponentProps<"input">) { return ( diff --git a/apps/app/components/shadcn/popover.tsx b/apps/app/components/shadcn/popover.tsx index 6b07b26a..224d5af8 100644 --- a/apps/app/components/shadcn/popover.tsx +++ b/apps/app/components/shadcn/popover.tsx @@ -1,78 +1,14 @@ "use client" import * as React from "react" -import { Popover as PopoverPrimitive } from "radix-ui" +import { Popover, PopoverAnchor, PopoverContent as BasePopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, } from "@layerswap/ui-kit" +import { cn } from "@layerswap/utils" -import { cn } from "@/lib/utils" - -function Popover({ - ...props -}: React.ComponentProps) { - return -} - -function PopoverTrigger({ - ...props -}: React.ComponentProps) { - return -} - -function PopoverContent({ - className, - align = "center", - sideOffset = 4, - ...props -}: React.ComponentProps) { - return ( - - - - ) -} - -function PopoverAnchor({ - ...props -}: React.ComponentProps) { - return -} - -function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ) -} - -function PopoverTitle({ className, ...props }: React.ComponentProps<"h2">) { - return ( -
- ) -} - -function PopoverDescription({ - className, - ...props -}: React.ComponentProps<"p">) { +function PopoverContent({ className, ...props }: React.ComponentProps) { return ( -

) diff --git a/apps/app/components/shadcn/select.tsx b/apps/app/components/shadcn/select.tsx index dd8a5766..c55ce765 100644 --- a/apps/app/components/shadcn/select.tsx +++ b/apps/app/components/shadcn/select.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Select as SelectPrimitive } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" import { HugeiconsIcon } from "@hugeicons/react" import { UnfoldMoreIcon, Tick02Icon, ArrowUp01Icon, ArrowDown01Icon } from "@hugeicons/core-free-icons" diff --git a/apps/app/components/shadcn/separator.tsx b/apps/app/components/shadcn/separator.tsx index d4570908..9485a210 100644 --- a/apps/app/components/shadcn/separator.tsx +++ b/apps/app/components/shadcn/separator.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Separator as SeparatorPrimitive } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Separator({ className, diff --git a/apps/app/components/shadcn/sheet.tsx b/apps/app/components/shadcn/sheet.tsx index c6c67efd..5293ec09 100644 --- a/apps/app/components/shadcn/sheet.tsx +++ b/apps/app/components/shadcn/sheet.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Dialog as DialogPrimitive } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Sheet({ ...props diff --git a/apps/app/components/shadcn/sidebar.tsx b/apps/app/components/shadcn/sidebar.tsx index 005aaff6..299c37f8 100644 --- a/apps/app/components/shadcn/sidebar.tsx +++ b/apps/app/components/shadcn/sidebar.tsx @@ -5,7 +5,7 @@ import { PanelLeftIcon } from "lucide-react" import { Slot } from "radix-ui" import useWindowDimensions from "@/hooks/useWindowDimensions" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" import { Input } from "@/components/shadcn/input" import { Separator } from "@/components/shadcn/separator" import { diff --git a/apps/app/components/shadcn/skeleton.tsx b/apps/app/components/shadcn/skeleton.tsx index 2374b678..d625e1cb 100644 --- a/apps/app/components/shadcn/skeleton.tsx +++ b/apps/app/components/shadcn/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Skeleton({ className, diff --git a/apps/app/components/shadcn/switch.tsx b/apps/app/components/shadcn/switch.tsx index c3f96491..b6ad8848 100644 --- a/apps/app/components/shadcn/switch.tsx +++ b/apps/app/components/shadcn/switch.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Switch as SwitchPrimitive } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Switch({ className, diff --git a/apps/app/components/shadcn/tabs.tsx b/apps/app/components/shadcn/tabs.tsx index b46bd9b6..d0d54bfc 100644 --- a/apps/app/components/shadcn/tabs.tsx +++ b/apps/app/components/shadcn/tabs.tsx @@ -4,7 +4,7 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" import { Tabs as TabsPrimitive } from "radix-ui" -import { cn } from "@/lib/utils" +import { cn } from "@layerswap/utils" function Tabs({ className, diff --git a/apps/app/components/shadcn/tooltip.tsx b/apps/app/components/shadcn/tooltip.tsx index e4e739e3..ab913c6b 100644 --- a/apps/app/components/shadcn/tooltip.tsx +++ b/apps/app/components/shadcn/tooltip.tsx @@ -1,57 +1,17 @@ "use client" -import * as React from "react" -import { Tooltip as TooltipPrimitive } from "radix-ui" +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, setTooltipDefaults } from "@layerswap/ui-kit" -import { cn } from "@/lib/utils" - -function TooltipProvider({ - delayDuration = 0, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function Tooltip({ - ...props -}: React.ComponentProps) { - return -} - -function TooltipTrigger({ - ...props -}: React.ComponentProps) { - return -} - -function TooltipContent({ - className, - sideOffset = 0, - children, - ...props -}: React.ComponentProps) { - return ( - - - {children} - - - - ) -} +// Applies to ui-kit's internal tooltips too (ExtendedAddress, WalletsList, CopyButton), +// which have no call site here to pass props at. +setTooltipDefaults({ + root: { delayDuration: 500 }, + content: { + container: null, + showArrow: true, + className: "inline-flex w-fit max-w-xs items-center gap-1.5 border-0 bg-foreground text-background", + arrowClasses: "bg-foreground fill-foreground", + }, +}) export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } diff --git a/apps/app/components/utils/RoundDecimals.ts b/apps/app/components/utils/RoundDecimals.ts deleted file mode 100644 index acc7c639..00000000 --- a/apps/app/components/utils/RoundDecimals.ts +++ /dev/null @@ -1,30 +0,0 @@ -export function truncateDecimals(value: number, decimals = 0) { - if (value === 0) return '0'; - - const factor = Math.pow(10, decimals); - const truncated = Math.trunc(value * factor) / factor; - - const formatted = isScientific(truncated) - ? (!isNaN(Number(truncated)) - ? truncated.toFixed(decimals).replace(/\.?0+$/, '') - : '') - : truncated?.toString(); - - return Number(formatted).toLocaleString('en-US', { - minimumFractionDigits: 0, - maximumFractionDigits: decimals - }); -} - -export function isScientific(x) { - const s = String(x); - - // 1) If it’s already a string that “looks like” sci-notation, catch it: - if (/^[+-]?\d+(?:\.\d+)?[eE][+-]?\d+$/.test(s)) { - return true; - } - - // 2) Otherwise, convert to Number (in case it's a numeric string or other) - // and see if toString() uses 'e' (lowercased for consistency): - return Number(s).toString().toLowerCase().includes('e'); -} \ No newline at end of file diff --git a/apps/app/components/utils/ShortenString.tsx b/apps/app/components/utils/ShortenString.tsx deleted file mode 100644 index 47876d8b..00000000 --- a/apps/app/components/utils/ShortenString.tsx +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Shortens a generic string (for transaction hashes, etc.) - * For blockchain addresses, use Address class methods instead - * @param str - String to shorten - * @returns Shortened string (e.g., "0x123...5678") - */ -export default function shortenString(str: string): string { - if (!str || str.length < 13) return str; - return `${str.substring(0, 5)}...${str.substring(str.length - 4)}`; -} diff --git a/apps/app/components/utils/classNames.ts b/apps/app/components/utils/classNames.ts deleted file mode 100644 index 16153de2..00000000 --- a/apps/app/components/utils/classNames.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function classNames(...classes: (string | boolean | undefined)[]): string { - return classes.filter(Boolean).join(' ') -} \ No newline at end of file diff --git a/apps/app/context/snapPointsContext.tsx b/apps/app/context/snapPointsContext.tsx index 52072e5e..e613c221 100644 --- a/apps/app/context/snapPointsContext.tsx +++ b/apps/app/context/snapPointsContext.tsx @@ -67,7 +67,7 @@ const resolveSnapPoints = ({ isMobile, snapPointsCount, childrenHeights, headerH if (typeof window === 'undefined' || childrenHeights.some(ch => ch.fullHeight)) return [{ id: i + 1, height: 1 }]; const pointHeight = childrenHeights?.[i]?.height + result + headerHeight + footerHeight; - const viewportHeight = isMobile ? window.innerHeight : document.getElementById('widget')?.offsetHeight; + const viewportHeight = isMobile ? window.innerHeight : document.getElementById('app-widget')?.offsetHeight; if (!pointHeight || !viewportHeight) return [{ id: i + 1, height: 1 }]; diff --git a/apps/app/context/swapAccounts.tsx b/apps/app/context/swapAccounts.tsx index eed6bdfe..837eb427 100644 --- a/apps/app/context/swapAccounts.tsx +++ b/apps/app/context/swapAccounts.tsx @@ -2,8 +2,8 @@ import { Context, createContext, useCallback, useContext, useMemo, useState } fr import { useQueryState } from '@/context/query' import { SwapDirection } from '@/components/DTOs/SwapFormValues'; import useWallet from '@/hooks/useWallet'; -import { Wallet, WalletProvider } from '@/Models/WalletProvider'; -import AddressIcon from '@/components/AddressIcon'; +import type { Wallet } from "@layerswap/widget-types"; +import { WalletConnectionProvider } from "@layerswap/wallet-core/types"; import { Address } from '@/lib/address'; import { getKey, useBalanceStore } from '@/stores/balanceStore'; @@ -33,8 +33,8 @@ type BaseAccountIdentity = { export type AccountIdentity = BaseAccountIdentity & { displayName: string, addresses: string[], - provider: WalletProvider; - icon: (props: any) => React.JSX.Element; + provider: WalletConnectionProvider; + icon?: string; } @@ -187,8 +187,8 @@ export function useSelectSwapAccount(direction: SwapDirection) { } function hasWallet( - p: WalletProvider -): p is WalletProvider & { activeWallet: { address: string; id: string } } { + p: WalletConnectionProvider +): p is WalletConnectionProvider & { activeWallet: { address: string; id: string } } { return Boolean(p.activeWallet); } @@ -203,7 +203,7 @@ function upsertByProvider(accounts: BaseAccountIdentity[], account: BaseAccountI return [...accounts, account]; } -function ResolveWalletSwapAccount(provider: WalletProvider, wallet: Wallet, address: string): AccountIdentityWithSupportedNetworks { +function ResolveWalletSwapAccount(provider: WalletConnectionProvider, wallet: Wallet, address: string): AccountIdentityWithSupportedNetworks { return { address, provider, @@ -214,11 +214,11 @@ function ResolveWalletSwapAccount(provider: WalletProvider, wallet: Wallet, addr walletAsSourceSupportedNetworks: wallet.asSourceSupportedNetworks, displayName: wallet.displayName || provider.name, addresses: wallet.addresses || [address], - icon: wallet.icon || ((props) => ), + icon: wallet.icon, } } -function ResolveManualSwapAccount(provider: WalletProvider, address: string): AccountIdentity { +function ResolveManualSwapAccount(provider: WalletConnectionProvider, address: string): AccountIdentity { return { address, provider, @@ -226,8 +226,5 @@ function ResolveManualSwapAccount(provider: WalletProvider, address: string): Ac id: 'manually_added', displayName: "Manual", addresses: [address], - icon: (props: any) => ( - - ), }; -} \ No newline at end of file +} diff --git a/apps/app/context/walletHookProviders.tsx b/apps/app/context/walletHookProviders.tsx deleted file mode 100644 index f89b68b1..00000000 --- a/apps/app/context/walletHookProviders.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React, { createContext, useContext, useMemo } from "react"; -import { WalletProvider } from "../Models/WalletProvider"; -import { useSettingsState } from "./settings"; -import useEVM from "../lib/wallets/evm/useEVM"; -import useStarknet from "../lib/wallets/starknet/useStarknet"; -import useSVM from "../lib/wallets/solana/useSVM"; -import useAztec from "../lib/wallets/aztec/useAztec"; -import { isMobile } from "@/lib/wallets/utils/isMobile"; -import useTron from "@/lib/wallets/tron/useTron"; -import useFuel from "@/lib/wallets/fuel/useFuel"; - -const WalletProvidersContext = createContext([]); - -export const WalletProvidersProvider: React.FC = ({ children }) => { - const { networks } = useSettingsState(); - const isMobilePlatform = isMobile(); - - const evm = useEVM(); - const starknet = useStarknet(); - const svm = useSVM(); - const aztec = useAztec() - const tron = useTron() - const fuel = useFuel() - - const providers = useMemo(() => { - const allProviders: WalletProvider[] = [ - evm, starknet, svm, aztec, tron, fuel - ]; - const filteredProviders = allProviders.filter(provider => isMobilePlatform ? !provider.unsupportedPlatforms?.includes('mobile') : !provider.unsupportedPlatforms?.includes('desktop')); - - return filteredProviders - .filter(provider => - networks.some(net => - provider.autofillSupportedNetworks?.includes(net.caip2Id) || - provider.withdrawalSupportedNetworks?.includes(net.caip2Id) || - provider.asSourceSupportedNetworks?.includes(net.caip2Id) - ) - ); - }, [networks, evm, starknet, svm, aztec, tron, fuel, isMobilePlatform]); - - return ( - - {children} - - ); -}; - -export const useWalletProviders = () => useContext(WalletProvidersContext); diff --git a/apps/app/hooks/useConnectors.ts b/apps/app/hooks/useConnectors.ts deleted file mode 100644 index 95542871..00000000 --- a/apps/app/hooks/useConnectors.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { useMemo } from "react"; -import { InternalConnector, WalletProvider } from "../Models/WalletProvider"; -import { removeDuplicatesWithKey } from "../components/WalletModal/utils"; - -type UseConnectorsParams = { - searchValue?: string; - recentConnectors: { providerName?: string; connectorName?: string }[]; - featuredProviders: WalletProvider[]; - filteredProviders: WalletProvider[]; - searchResults?: InternalConnector[]; -}; - -/** Flatten one connector list off each provider, name-filtered and stamped with the provider. */ -function pickConnectors( - providers: WalletProvider[], - key: 'availableConnectors' | 'additionalConnectors', - searchValue?: string, -): InternalConnector[] { - return providers - .filter(g => g[key] && g[key]?.length > 0) - .map((provider) => - provider[key] - ?.filter(v => searchValue ? v.name.toLowerCase().includes(searchValue.toLowerCase()) : true) - .map((connector) => ({ ...connector, providerName: provider.name })) - ) - .flat() as InternalConnector[]; -} - -export function useConnectors({ - featuredProviders, - filteredProviders, - searchValue, - recentConnectors, - searchResults, -}: UseConnectorsParams) { - - const featuredConnectors = useMemo( - () => pickConnectors(featuredProviders, 'availableConnectors', searchValue), - [featuredProviders, searchValue] - ); - - const additionalConnectors = useMemo( - () => pickConnectors(featuredProviders, 'additionalConnectors', searchValue), - [featuredProviders, searchValue] - ); - - - const initialConnectors: InternalConnector[] = useMemo(() => { - const recentNames = new Set(recentConnectors?.map(r => r.connectorName?.toLowerCase()).filter(Boolean)) - const isRecent = (c: InternalConnector) => recentNames.has(c.name.toLowerCase()) - const isInstalled = (c: InternalConnector) => c.type === 'injected' && !c.isLoadable - - // Only the provider's initial connector set should be prioritized. - const recent = featuredConnectors.filter(c => isRecent(c)) - const installed = featuredConnectors.filter(c => !isRecent(c) && isInstalled(c)) - const rest = featuredConnectors.filter(c => !isRecent(c) && !isInstalled(c)) - const orderedConnectors = [...recent, ...installed, ...rest, ...additionalConnectors] as InternalConnector[] - - if (searchResults?.length) { - const existingNames = new Set(orderedConnectors.map(c => c.name.toLowerCase())) - const newResults = searchResults.filter(c => !existingNames.has(c.name.toLowerCase())) - orderedConnectors.push(...newResults) - } - - return removeDuplicatesWithKey(orderedConnectors, 'name'); - }, [featuredConnectors, additionalConnectors, recentConnectors, searchResults]); - - return { - featuredConnectors, - additionalConnectors, - initialConnectors, - featuredProviders, - filteredProviders, - }; -} \ No newline at end of file diff --git a/apps/app/hooks/useWallet.ts b/apps/app/hooks/useWallet.ts index 3bf514bb..9127d9c2 100644 --- a/apps/app/hooks/useWallet.ts +++ b/apps/app/hooks/useWallet.ts @@ -1,146 +1,26 @@ import { Network } from "../Models/Network" -import { Wallet, WalletProvider } from "../Models/WalletProvider"; +import { useWallet as useWalletCore, type WalletPurpose } from "@layerswap/wallet-core"; +import { useSettingsState } from "../context/settings"; +import { toWidgetNetwork } from "@/lib/wallets/layerswap/widgetNetwork"; import { useCallback, useMemo } from "react"; -import { useWalletProviders } from "../context/walletHookProviders"; -export type WalletPurpose = "autofill" | "withdrawal" | "asSource" +export type { WalletPurpose } -export default function useWallet(network?: Network | undefined | null, purpose?: WalletPurpose) { - const walletProviders = useWalletProviders() - - const provider = useMemo(() => network ? resolveProvider(network, walletProviders, purpose) : undefined, [network, purpose, walletProviders]) - - const wallets = useMemo(() => { - let connectedWallets: Wallet[] = []; - walletProviders.forEach((provider) => { - - const w = provider.connectedWallets?.map(wallet => { - return resolveWallet(wallet, network, provider, purpose) - }); - connectedWallets = w ? [...connectedWallets, ...w] : [...connectedWallets]; - }); - return connectedWallets; - }, [walletProviders, network]); - - const unAvailableWallets = useMemo(() => { - return wallets.filter(wallet => wallet.isNotAvailable) - }, [wallets]) - - const availableWallets = useMemo(() => { - return wallets.filter(wallet => !wallet.isNotAvailable) - }, [wallets]) - - const getProvider = useCallback((network: Network, purpose: WalletPurpose) => { - return network && resolveProvider(network, walletProviders, purpose) - }, [walletProviders, purpose]); - - const res = useMemo(() => ({ - wallets: availableWallets, - unAvailableWallets, - provider, - providers: walletProviders, - getProvider - }), [wallets, provider, walletProviders, getProvider]) - - return res -} - -const resolveProvider = (network: Network | undefined, walletProviders: WalletProvider[], purpose?: WalletPurpose) => { - if (!purpose || !network?.caip2Id) return - - let provider: WalletProvider | undefined = undefined - switch (purpose) { - case "withdrawal": - provider = walletProviders.find(provider => provider.withdrawalSupportedNetworks?.includes(network.caip2Id)) - break; - case "autofill": - provider = walletProviders.find(provider => provider.autofillSupportedNetworks?.includes(network.caip2Id)) - break; - case "asSource": - provider = walletProviders.find(provider => provider.asSourceSupportedNetworks?.includes(network.caip2Id)) - break; - } - - if (provider?.isNotAvailableCondition && purpose) { - const availableConnectors = provider.availableConnectors?.filter(connector => (provider.isNotAvailableCondition && network?.caip2Id) ? !provider.isNotAvailableCondition(connector.id, network?.caip2Id, purpose) : true) - const additionalConnectors = provider.additionalConnectors?.filter(connector => (provider.isNotAvailableCondition && network?.caip2Id) ? !provider.isNotAvailableCondition(connector.id, network?.caip2Id, purpose) : true) - const requestAdditionalConnectors = provider.requestAdditionalConnectors - ? async (params) => { - const result = await provider.requestAdditionalConnectors?.(params) - if (!result) { - return { connectors: [], nextPage: null, totalCount: 0 } - } - - return { - ...result, - connectors: result.connectors.filter(connector => (provider.isNotAvailableCondition && network?.caip2Id) ? !provider.isNotAvailableCondition(connector.id, network?.caip2Id, purpose) : true) - } - } - : undefined - const resolvedProvider = { - ...provider, - connectedWallets: provider.connectedWallets?.map(wallet => { - return { - ...wallet, - isNotAvailable: (provider.isNotAvailableCondition && network?.caip2Id && wallet.internalId) ? provider.isNotAvailableCondition(wallet.internalId, network?.caip2Id, purpose) : false, - } - }), - activeWallet: provider.activeWallet ? { - ...provider.activeWallet, - isNotAvailable: (network?.caip2Id) ? provider.isNotAvailableCondition(provider.activeWallet.id, network?.caip2Id, purpose) : false, - } : undefined, - availableConnectors: availableConnectors, - additionalConnectors, - requestAdditionalConnectors, - } - return resolvedProvider - } +type WidgetNetwork = ReturnType> - return provider +const WALLET_OPTIONS = { + getNetworkId: (network: WidgetNetwork) => network.caip2Id, } -const resolveWallet = (wallet: Wallet, network: Network | undefined | null, provider: WalletProvider, purpose?: WalletPurpose) => { - - if (provider.isNotAvailableCondition && network?.caip2Id && wallet.internalId && !purpose) { - return { - ...wallet, - isNotAvailable: provider.isNotAvailableCondition(wallet.internalId, network?.caip2Id), - } - } - - if (purpose === "autofill") { - return { - ...wallet, - isNotAvailable: !supportsNetwork(wallet.autofillSupportedNetworks, network), - } - } else if (purpose === "withdrawal") { - return { - ...wallet, - isNotAvailable: !supportsNetwork(wallet.withdrawalSupportedNetworks, network), - } - } else if (purpose === "asSource") { - return { - ...wallet, - isNotAvailable: !supportsNetwork(wallet.asSourceSupportedNetworks, network), - } - } +export default function useWallet(network?: Network | undefined | null, purpose?: WalletPurpose) { + const { networks } = useSettingsState() + const widgetNetworks = useMemo(() => networks.map(toWidgetNetwork), [networks]) + const widgetNetwork = useMemo(() => network ? toWidgetNetwork(network) : undefined, [network]) - return { - ...wallet, - isNotAvailable: false, - } -} + const { getProvider, ...rest } = useWalletCore(widgetNetworks, widgetNetwork, purpose, WALLET_OPTIONS) -const supportsNetwork = ( - supportedNetworks: string[] | undefined, - network: Network | undefined | null, -): boolean => { - const caip2Id = network?.caip2Id - if (!caip2Id) return false + const getProviderForNetwork = useCallback((network: Network, purpose: WalletPurpose) => + getProvider(toWidgetNetwork(network), purpose), [getProvider]) - const normalizedCaip2Id = caip2Id.toLowerCase() - return supportedNetworks?.some(candidate => - typeof candidate === "string" && - candidate.toLowerCase() === normalizedCaip2Id - ) ?? false + return { ...rest, getProvider: getProviderForNetwork } } diff --git a/apps/app/lib/address/Address.ts b/apps/app/lib/address/Address.ts index a4758ace..c560d52b 100644 --- a/apps/app/lib/address/Address.ts +++ b/apps/app/lib/address/Address.ts @@ -149,16 +149,6 @@ export class Address { }; } - /** - * Get seed number for icon generation (chars 2-10 as hex integer) - * Used by AddressIcon component with Jazzicon - * @returns Integer seed for deterministic icon generation - */ - static toIconSeed(address: string): number { - if (!address || address.length < 10) return 0; - return parseInt(address.slice(2, 10), 16); - } - /** * Convert to string (default: full format) */ diff --git a/apps/app/lib/address/aztec.ts b/apps/app/lib/address/aztec.ts new file mode 100644 index 00000000..7bd68f22 --- /dev/null +++ b/apps/app/lib/address/aztec.ts @@ -0,0 +1,12 @@ +// An Aztec address is a BN254 field element (Fr). Values at or above the modulus +// silently wrap when parsed, so they are not the address the user typed. +const FR_MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n + +const HEX_64 = /^(0x)?[0-9a-fA-F]{64}$/ + +const normalize = (address: string) => (address.startsWith("0x") ? address : `0x${address}`) + +export function isValidAztecAddress(address: string | null | undefined): boolean { + if (!address || !HEX_64.test(address)) return false + return BigInt(normalize(address)) < FR_MODULUS +} diff --git a/apps/app/lib/address/formatter.ts b/apps/app/lib/address/formatter.ts index b73a73e6..f7a1f459 100644 --- a/apps/app/lib/address/formatter.ts +++ b/apps/app/lib/address/formatter.ts @@ -1,6 +1,6 @@ +import { addressFormat as formatWithProviders } from "@layerswap/utils"; import { Network } from "@/Models/Network"; -// import { Address } from "@ton/core"; -import { formatStarknetAddress } from "@train-protocol/starknet"; +import { toWidgetNetwork } from "@/lib/wallets/layerswap/widgetNetwork"; export type AddressFormatProps = { address: string; @@ -8,45 +8,6 @@ export type AddressFormatProps = { providerName?: string } -export function addressFormat(props: AddressFormatProps): string { - const { address, network, providerName } = props - - if ( - network?.caip2Id.toLowerCase().startsWith("starknet") - || network?.caip2Id.toLowerCase().startsWith("paradex") - || providerName?.toLowerCase() == 'paradex' - || providerName?.toLowerCase() == 'starknet' - ) { - try { - return formatStarknetAddress(address); - } - catch { - return address - } - } - // else if ( - // network?.caip2Id.toLowerCase().startsWith("ton") - // || providerName?.toLowerCase() == 'ton' - // ) { - // try { - // return Address.parse(address).toString({ bounceable: false, testOnly: false, urlSafe: true }) - // } catch (error) { - // return address - // } - // } - else if ( - network?.caip2Id.toLowerCase().startsWith("solana") - || network?.caip2Id.toLowerCase().startsWith("eclipse") - || network?.caip2Id.toLowerCase().startsWith("soon") - || network?.caip2Id.toLowerCase().startsWith("tron") - || network?.caip2Id.toLowerCase().startsWith("bitcoin") - || providerName?.toLowerCase() == 'solana' - || providerName?.toLowerCase() == 'tron' - || providerName?.toLowerCase() == 'bitcoin' - ) { - return address - } - else { - return address?.toLowerCase(); - } -} \ No newline at end of file +export function addressFormat({ address, network, providerName }: AddressFormatProps): string { + return formatWithProviders({ address, network: network ? toWidgetNetwork(network) : undefined, providerName }) +} diff --git a/apps/app/lib/address/validator/index.ts b/apps/app/lib/address/validator/index.ts index e9826c84..3e855bb9 100644 --- a/apps/app/lib/address/validator/index.ts +++ b/apps/app/lib/address/validator/index.ts @@ -1,149 +1,11 @@ -import { keccak256 } from "js-sha3"; -import KnownInternalNames from "../../knownIds"; -import { validateAndParseAddress } from "./starkNetAddressValidator"; -import { PublicKey } from '@solana/web3.js' -import { NetworkTypes } from "@/Models/Network"; -// import { Address } from "@ton/core"; +import { isValidAddress as validateWithProviders, EVMAddressUtilsProvider } from "@layerswap/utils"; +import { Network } from "@/Models/Network"; +import { toWidgetNetwork } from "@/lib/wallets/layerswap/widgetNetwork"; -type AddressNetwork = { - displayName?: string - networkType?: string -} - -function getNetworkId(network: AddressNetwork | null | undefined): string | undefined { - return network ? (network.displayName) : undefined; -} - -export function isValidAddress(address?: string, network?: AddressNetwork | null): boolean { - if (!address || isBlacklistedAddress(address)) { - return false - } - const id = getNetworkId(network) ?? ""; - if (id.toLowerCase().startsWith("zksync")) { - if (address?.startsWith("zksync:")) { - return isValidEtherAddress(address.replace("zksync:", "")); - } - return isValidEtherAddress(address); - } - else if (id.toLowerCase().startsWith("starknet") || id.toLowerCase().startsWith("paradex")) { - return validateAndParseAddress(address); - } - // else if (id.toLowerCase().startsWith("ton")) { - // try { - // return !!Address.parse(address).toString({ bounceable: false, testOnly: false, urlSafe: true }) - // } catch (error) { - // return false - // } - // } - else if (id.toLowerCase().startsWith("solana") || id.toLowerCase().startsWith("eclipse")) { - try { - let pubkey = new PublicKey(address) - let isSolana = PublicKey.isOnCurve(pubkey.toBuffer()) - return isSolana - } catch (error) { - return false - } - } - else if (id.toLowerCase().startsWith("tron")) { - const decodedAddress = decodeBase58(address).toUpperCase(); - return decodedAddress.startsWith('41') && decodedAddress.length == 42 - } - else if (network?.networkType === NetworkTypes.Fuel || id.toLowerCase().startsWith("fuel")) { - return /^0x[0-9a-fA-F]{64}$/.test(address); - } - else if (id.toLowerCase().includes("aztec")) { - return true - } - else { - return isValidEtherAddress(address); - } -} - -function isValidEtherAddress(address: string): boolean { - if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { - // check if it has the basic requirements of an address - return false; - } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { - // If it's all small caps or all all caps, return true - return true; - } else { - // Otherwise check each case - return isChecksumAddress(address); - } -} - -function isChecksumAddress(address: string): boolean { - // Check each case - address = address.replace('0x', ''); - var addressHash = keccak256(address.toLowerCase()); - for (var i = 0; i < 40; i++) { - // the nth letter should be uppercase if the nth digit of casemap is 1 - if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) { - return false; - } - } - return true; -}; - -function isBlacklistedAddress(address: string): boolean { - - const BlacklistedAddresses = [ - "0xa9d38c3FB49074c00596a25CcF396402362C92C5", - "0x4d70500858f9705ddbd56d007d13bbc92c9c67d1" - ] - - let account = address - - if (account.includes(":")) { - account = account.split(":")[1] - } - - if (BlacklistedAddresses.find(a => a.toLowerCase() === account.toLowerCase())) return true - else return false -} - -// Function to decode a Base58 string -function decodeBase58(base58Str) { - const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; - const BASE = 58; - - let num = 0n; // Use BigInt for large numbers - - // Decode Base58 string to a BigInt - for (let char of base58Str) { - let charIndex = ALPHABET.indexOf(char); - num = num * BigInt(BASE) + BigInt(charIndex); - } - - // Convert BigInt to a byte array - let hex = num.toString(16); - if (hex.length % 2 !== 0) { - hex = '0' + hex; // Ensure even length for proper byte representation - } - let bytes: number[] = []; - for (let i = 0; i < hex.length; i += 2) { - bytes.push(parseInt(hex.substring(i, i + 2), 16)); - } - - // Add leading zero bytes for each '1' in the original Base58 string - let leadingZeroes = 0; - for (let char of base58Str) { - if (char === '1') { - leadingZeroes++; - } else { - break; - } - } - // Prepend zero bytes for each leading '1' - bytes = new Array(leadingZeroes).fill(0).concat(bytes); - - // Remove the last 4 bytes (checksum) from the decoded data - if (bytes.length > 4) { - bytes = bytes.slice(0, -4); - } - - // Convert byte array to hex string - let resultHex = bytes.map(b => b.toString(16).padStart(2, '0')).join(''); +const evmAddresses = new EVMAddressUtilsProvider(); - return resultHex; +export function isValidAddress(address?: string, network?: Network | null): boolean { + if (!address) return false; + if (!network) return evmAddresses.isValidAddress({ address }); + return validateWithProviders({ address, network: toWidgetNetwork(network) }); } diff --git a/apps/app/lib/address/validator/starkNetAddressValidator.ts b/apps/app/lib/address/validator/starkNetAddressValidator.ts deleted file mode 100644 index a4d81811..00000000 --- a/apps/app/lib/address/validator/starkNetAddressValidator.ts +++ /dev/null @@ -1,65 +0,0 @@ -import BN from 'bn.js'; - -const TWO = toBN(2); -const MASK_251 = TWO.pow(toBN(251)); -const MASK_221 = TWO.pow(toBN(221)); - -type BigNumberish = string | number | BN; - -export function validateAndParseAddress(address: string): boolean { - if (typeof address !== 'string') { - return false; - } - - if (!assertInRange(address, MASK_221, MASK_251)) { - return false; - } - - const result = addAddressPadding(address); - - if (!result.match(/^(0x)?[0-9a-fA-F]{64}$/)) { - return false; - } - - return true; -} - -function addAddressPadding(address: string): string { - return addHexPrefix(removeHexPrefix(address).padStart(64, '0')); -} - -function addHexPrefix(hex: string): string { - return `0x${removeHexPrefix(hex)}`; -} - -function removeHexPrefix(hex: string): string { - return hex.replace(/^0x/, ''); -} - -function assertInRange( - input: BigNumberish, - lowerBound: BigNumberish, - upperBound: BigNumberish) { - - try { - const inputBn = toBN(input); - if (!inputBn.gte(toBN(lowerBound)) || !inputBn.lt(toBN(upperBound))) { - return false; - } - } - catch { - return false; - } - - return true; -} - -function toBN(number: BigNumberish, base?: number | 'hex') { - if (typeof number === 'string' && isHex(number) && !base) - return new BN(removeHexPrefix(number), 'hex'); - return new BN(number, base); -} - -function isHex(hex: string): boolean { - return hex.startsWith('0x'); -} \ No newline at end of file diff --git a/apps/app/lib/balances/providers/fuelBalanceProvider.ts b/apps/app/lib/balances/providers/fuelBalanceProvider.ts index acf896b0..7b3f18f8 100644 --- a/apps/app/lib/balances/providers/fuelBalanceProvider.ts +++ b/apps/app/lib/balances/providers/fuelBalanceProvider.ts @@ -2,7 +2,7 @@ import { BalanceProvider } from "@/Models/BalanceProvider"; import { TokenBalance } from "@/Models/Balance"; import { getNativeToken } from "@/Models/Network"; import { formatUnits } from "viem"; -import { retryWithExponentialBackoff } from "@/lib/retry"; +import { retryWithExponentialBackoff } from "@layerswap/utils"; import { NetworkTypes } from "@/Models/Network"; import { Provider } from "fuels"; diff --git a/apps/app/lib/formatAmount.ts b/apps/app/lib/formatAmount.ts deleted file mode 100644 index 5b404fc0..00000000 --- a/apps/app/lib/formatAmount.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { formatUnits as formatAmount } from 'viem' -export { formatUnits as default } from 'viem' \ No newline at end of file diff --git a/apps/app/lib/gases/providers/solanaGasProvider.ts b/apps/app/lib/gases/providers/solanaGasProvider.ts index 00d9fa82..4e69298f 100644 --- a/apps/app/lib/gases/providers/solanaGasProvider.ts +++ b/apps/app/lib/gases/providers/solanaGasProvider.ts @@ -55,8 +55,8 @@ async function estimateSolanaGas(params: { rpcUrl: params.rpcUrl, signer: { publicKey: params.address, - sendTransaction: async () => { - throw new Error('Gas estimation signer cannot submit transactions') + signTransaction: async () => { + throw new Error('Gas estimation signer cannot sign transactions') }, }, }) diff --git a/apps/app/lib/retry.ts b/apps/app/lib/retry.ts deleted file mode 100644 index a3b1f2a5..00000000 --- a/apps/app/lib/retry.ts +++ /dev/null @@ -1,36 +0,0 @@ -export async function retryWithExponentialBackoff(fn: () => Promise, maxAttempts = 3, baseDelayMs = 1000): Promise { - let attempt = 1; - - const execute = async (): Promise => { - try { - return await fn(); - } catch (error) { - if (attempt >= maxAttempts) { - throw error; - } - - const delayMs = baseDelayMs * 2 ** attempt; - await new Promise((resolve) => setTimeout(resolve, delayMs)); - - attempt++; - return await execute(); - } - }; - - return await execute(); -} - -export async function retryUntilFecth(fn: () => Promise, baseDelayMs = 2000): Promise { - - const execute = async (): Promise => { - try { - return await fn(); - } catch (error) { - await new Promise((resolve) => setTimeout(resolve, baseDelayMs)); - - return await execute(); - } - }; - - return await execute(); -} diff --git a/apps/app/lib/utils.ts b/apps/app/lib/utils.ts deleted file mode 100644 index bd0c391d..00000000 --- a/apps/app/lib/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} diff --git a/apps/app/lib/walletConnect/api.ts b/apps/app/lib/walletConnect/api.ts deleted file mode 100644 index b686a403..00000000 --- a/apps/app/lib/walletConnect/api.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { WALLETCONNECT_PROJECT_ID } from "./config" - -const BASE = 'https://api.web3modal.org' - -export type Web3ModalWallet = { - id: string - name: string - image_id: string - order: number - mobile_link: string | null - desktop_link: string | null - link_mode: string | null - rdns: string | null - chrome_store: string | null - injected: { namespace: string; injected_id: string }[] | null - chains: string[] -} - -export type GetWalletsResponse = { - count: number - data: Web3ModalWallet[] - nextPage: number | null - previousPage: number | null -} - -export type FetchWalletsParams = { - page?: number - entries?: number - chains?: string - search?: string -} - -const EVM_CHAINS = [ - 'eip155:1', 'eip155:10', 'eip155:56', 'eip155:137', - 'eip155:43114', 'eip155:42161', 'eip155:324', 'eip155:8453', -].join(',') - -const SOLANA_CHAINS = [ - 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', -].join(',') - -export function chainsForNamespace(namespace: string): string { - if (namespace === 'eip155') return EVM_CHAINS - if (namespace === 'solana') return SOLANA_CHAINS - return '' -} - -const DANGEROUS_URL_PROTOCOLS = ['javascript:', 'data:', 'vbscript:', 'file:'] - -function isValidHttpUrl(urlStr: string): boolean { - try { - const url = new URL(urlStr) - return ['https:', 'http:'].includes(url.protocol) - } catch { - return false - } -} - -// mobile_link / desktop_link may be a custom wallet scheme (e.g. `binancewallet://`, -// `backpack://`) when the wallet registers as a native-only link_mode. Allow any -// parseable URL except known-dangerous protocols. -function isValidWalletLink(urlStr: string): boolean { - try { - const url = new URL(urlStr) - return !DANGEROUS_URL_PROTOCOLS.includes(url.protocol.toLowerCase()) - } catch { - return false - } -} - -function isValidImageId(id: string): boolean { - return /^[a-zA-Z0-9_-]{1,100}$/.test(id) -} - -export function walletImageUrl(imageId: string): string { - return `https://explorer-api.walletconnect.com/v3/logo/md/${imageId}?projectId=${WALLETCONNECT_PROJECT_ID}` -} - -// Web3Modal explorer API reference: https://docs.reown.com/cloud/explorer -// The `st` / `sv` (source type / source version) params are internal AppKit -// telemetry routing keys required for the API to return results. -export async function fetchWallets(params: FetchWalletsParams): Promise { - const url = new URL(`${BASE}/getWallets`) - url.searchParams.set('projectId', WALLETCONNECT_PROJECT_ID) - url.searchParams.set('st', 'appkit') - url.searchParams.set('sv', 'react-viem') - url.searchParams.set('page', String(params.page ?? 1)) - url.searchParams.set('entries', String(params.entries ?? 40)) - if (params.chains) url.searchParams.set('chains', params.chains) - if (params.search) url.searchParams.set('search', params.search) - - const res = await fetch(url.toString()) - if (!res.ok) throw new Error(`getWallets failed: ${res.status}`) - const data: GetWalletsResponse = await res.json() - - if (!Array.isArray(data?.data)) { - throw new Error('Invalid response: missing data array') - } - for (const wallet of data.data) { - if (typeof wallet.id !== 'string' || typeof wallet.name !== 'string') { - throw new Error('Invalid wallet entry: missing id or name') - } - // Sanitize URLs: strip dangerous schemes and reject malformed URLs - if (wallet.mobile_link && !isValidWalletLink(wallet.mobile_link)) wallet.mobile_link = null - if (wallet.desktop_link && !isValidWalletLink(wallet.desktop_link)) wallet.desktop_link = null - if (wallet.chrome_store && !isValidHttpUrl(wallet.chrome_store)) wallet.chrome_store = null - if (typeof wallet.image_id !== 'string' || !isValidImageId(wallet.image_id)) wallet.image_id = '' - } - - return data -} diff --git a/apps/app/lib/walletConnect/buildDeepLink.ts b/apps/app/lib/walletConnect/buildDeepLink.ts deleted file mode 100644 index 8fbe37b8..00000000 --- a/apps/app/lib/walletConnect/buildDeepLink.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { isIOS, isMobile } from "../wallets/utils/isMobile" -import type { WalletConnectMobile } from "./types" - -const addWc = (url: string): string => { - if (url.endsWith("/wc") || url.endsWith("://wc")) return url - if (url.endsWith("://")) return url + "wc" - if (url.endsWith("/")) return url + "wc" - return url + "/wc" -} - -type BuildDeepLinkInput = { - id: string - mobile: WalletConnectMobile -} - -/** - * Chain-agnostic mobile deep-link builder for a given WC wallet + raw WC URI. - * - Off-mobile: returns the raw URI (used by the QR copy-link button). - * - Mobile: builds a wallet-specific deep link. Returning the bare `wc:` URI - * on Android lets the OS route to whichever WC-capable app is the default - * handler (which is why "pick Backpack, Rainbow opens" happens), so we - * always target the selected wallet explicitly when we can. - * - Slug-specific overrides match rainbowkit's well-known quirks. - */ -export function buildDeepLink({ id, mobile }: BuildDeepLinkInput, uri: string): string { - if (!isMobile()) return uri - - switch (id) { - case "bitkeep": - case "bitget-wallet": - return `bitkeep://wc?uri=${encodeURIComponent(uri)}` - case "metamask": - // MetaMask's native scheme is broken on iOS v6.5.0+, so prefer the universal link - // https://github.com/MetaMask/metamask-mobile/issues/6457 - return `https://metamask.app.link/wc?uri=${encodeURIComponent(uri)}` - case "okx-wallet": - return `okex://main/wc?uri=${encodeURIComponent(uri)}` - case "rainbow": - return isIOS() - ? `rainbow://wc?uri=${encodeURIComponent(uri)}&connector=rainbowkit` - : `https://rnbwapp.com/wc?uri=${encodeURIComponent(uri)}&connector=rainbowkit` - default: { - if (mobile?.native) return `${addWc(mobile.native)}?uri=${encodeURIComponent(uri)}` - if (mobile?.universal) return `${addWc(mobile.universal)}?uri=${encodeURIComponent(uri)}` - return uri - } - } -} diff --git a/apps/app/lib/walletConnect/config.ts b/apps/app/lib/walletConnect/config.ts deleted file mode 100644 index 133e4985..00000000 --- a/apps/app/lib/walletConnect/config.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This is a public, client-side-only project ID for WalletConnect wallet discovery. - -import AppSettings from "../AppSettings" - -// It has no authentication or authorization capability and is safe to expose in bundles. -export const WALLETCONNECT_PROJECT_ID = AppSettings.WalletConnectProjectId - -export const WALLETCONNECT_METADATA = { - name: 'Train Protocol', - description: 'Train Protocol App', - url: 'https://train.tech/', - icons: ['https://app.train.tech/symbol.png'], -} diff --git a/apps/app/lib/walletConnect/createRegistryConnector.ts b/apps/app/lib/walletConnect/createRegistryConnector.ts deleted file mode 100644 index 36fbbe8f..00000000 --- a/apps/app/lib/walletConnect/createRegistryConnector.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { InternalConnector } from "@/Models/WalletProvider" -import { WC_REGISTRY_MARKER, type RegistryAttachedConnector, type WalletConnectWalletBase } from "./types" - -export type RegistryConnector = RegistryAttachedConnector - -export const createRegistryConnector = ( - wallet: WalletConnectWalletBase, - isMobilePlatform: boolean, - providerName: string, -): RegistryConnector => ({ - id: wallet.id, - name: wallet.name, - icon: wallet.icon, - type: 'walletConnect', - order: wallet.order, - isMobileSupported: wallet.isMobileSupported, - hasBrowserExtension: wallet.hasBrowserExtension, - installUrl: wallet.installUrl, - extensionNotFound: wallet.hasBrowserExtension ? !isMobilePlatform : false, - providerName, - [WC_REGISTRY_MARKER]: wallet, -}) diff --git a/apps/app/lib/walletConnect/dynamicMetadata.ts b/apps/app/lib/walletConnect/dynamicMetadata.ts deleted file mode 100644 index bacd12bc..00000000 --- a/apps/app/lib/walletConnect/dynamicMetadata.ts +++ /dev/null @@ -1,108 +0,0 @@ -import type { DynamicWcMetadata } from "./types" - -const STORAGE_KEY = 'ls_walletconnect_dynamic_metadata' - -type Store = Record> - -// In-memory store for metadata captured BEFORE the wallet address is known -// (e.g. between user click and the WC session completing). Keyed by namespace. -const pendingStore = new Map() - -// Cache the parsed localStorage payload so repeated reads from render paths -// (useMemo in useEVM / useSVM) don't hit localStorage synchronously every time. -let _storeCache: Store | null = null - -const readStore = (): Store => { - if (_storeCache !== null) return _storeCache - if (typeof window === 'undefined') return {} - ensureStorageListener() - try { - const stored = localStorage.getItem(STORAGE_KEY) - _storeCache = stored ? JSON.parse(stored) : {} - } catch { - _storeCache = {} - } - return _storeCache as Store -} - -const writeStore = (store: Store): void => { - if (typeof window === 'undefined') return - try { - localStorage.setItem(STORAGE_KEY, JSON.stringify(store)) - _storeCache = store - } catch { - // ignore quota / serialization errors - } -} - -// Cross-tab invalidation: another tab writing to our key must bust this tab's cache. -// Lazily registered on first read/write so we never touch `window` at import time (SSR-safe). -let _storageListenerRegistered = false -const ensureStorageListener = () => { - if (_storageListenerRegistered || typeof window === 'undefined') return - _storageListenerRegistered = true - window.addEventListener('storage', (e) => { - if (e.key === STORAGE_KEY || e.key === null) _storeCache = null - }) -} - -const normalizeAddress = (namespace: string, address: string): string => { - // EVM addresses are case-insensitive; Solana base58 keys are case-sensitive. - return namespace === 'eip155' ? address.toLowerCase() : address -} - -export const getDynamicWcMetadata = (namespace: string, address: string): DynamicWcMetadata | null => { - const store = readStore() - const key = normalizeAddress(namespace, address) - return store[namespace]?.[key] ?? null -} - -export const setDynamicWcMetadata = ( - namespace: string, - address: string, - meta: DynamicWcMetadata, -): void => { - const store = readStore() - const key = normalizeAddress(namespace, address) - const ns = store[namespace] ?? {} - ns[key] = meta - store[namespace] = ns - writeStore(store) -} - -export const setPendingDynamicWcMetadata = (namespace: string, meta: DynamicWcMetadata | null): void => { - if (meta === null) { - pendingStore.delete(namespace) - } else { - pendingStore.set(namespace, meta) - } -} - -export const getPendingDynamicWcMetadata = (namespace: string): DynamicWcMetadata | null => { - return pendingStore.get(namespace) ?? null -} - -export const clearPendingDynamicWcMetadata = (namespace: string): void => { - pendingStore.delete(namespace) -} - -/** - * Convenience helper used by both EVM and Solana connect flows to set/clear - * pending metadata from a registry entry in a single call. - */ -export const setPendingMetadataForRegistry = ( - namespace: string, - registry: { name: string; icon?: string; id: string } | undefined -): DynamicWcMetadata | undefined => { - if (!registry) { - clearPendingDynamicWcMetadata(namespace) - return undefined - } - const meta: DynamicWcMetadata = { - name: registry.name, - icon: registry.icon || '', - id: registry.id, - } - setPendingDynamicWcMetadata(namespace, meta) - return meta -} diff --git a/apps/app/lib/walletConnect/mapConnectError.ts b/apps/app/lib/walletConnect/mapConnectError.ts deleted file mode 100644 index 25700c03..00000000 --- a/apps/app/lib/walletConnect/mapConnectError.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Normalizes errors thrown by the chain-specific WC connect flows into a - * single `Error` with a consistent message. Used by both EVM (wagmi) and - * Solana (`@solana/wallet-adapter-react`) connect paths. - */ -export function mapConnectError(e: unknown): Error { - if (e instanceof Error && e.name === 'ConnectorAlreadyConnectedError') { - return new Error('Wallet is already connected') - } - if (e instanceof Error) { - return new Error(e.message || e.name || 'WalletConnect error') - } - return new Error(typeof e === 'string' ? e : 'WalletConnect error') -} diff --git a/apps/app/lib/walletConnect/mapWallet.ts b/apps/app/lib/walletConnect/mapWallet.ts deleted file mode 100644 index 4d7547f3..00000000 --- a/apps/app/lib/walletConnect/mapWallet.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { resolveWalletConnectorIndex } from "../wallets/utils/resolveWalletIcon" -import type { Web3ModalWallet } from "./api" -import { walletImageUrl } from "./api" -import type { WalletConnectWalletBase } from "./types" - -function slugify(name: string): string { - return name - .toLowerCase() - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/g, '') - .replace(/-+/g, '-') - .replace(/^-|-$/g, '') -} - -// Wallets whose slugified name doesn't match what buildDeepLink expects -const SLUG_OVERRIDES: Record = { - 'bitget-wallet': 'bitkeep', -} - -export function mapWallet(wallet: Web3ModalWallet): WalletConnectWalletBase { - let id = slugify(wallet.name) - if (SLUG_OVERRIDES[id]) id = SLUG_OVERRIDES[id] - - const hasBrowserExtension = wallet.injected != null && wallet.injected.length > 0 - const installUrl = hasBrowserExtension ? (wallet.chrome_store ?? undefined) : undefined - const isMobileSupported = !!wallet.mobile_link - - const knownOrder = resolveWalletConnectorIndex(id) - - return { - id, - name: wallet.name, - icon: walletImageUrl(wallet.image_id), - rdns: wallet.rdns || undefined, - mobile: { - native: wallet.link_mode === 'native' ? (wallet.mobile_link || null) : null, - universal: wallet.link_mode !== 'native' ? (wallet.mobile_link || null) : null, - }, - desktop: wallet.desktop_link - ? { native: null, universal: wallet.desktop_link } - : undefined, - chains: Array.isArray(wallet.chains) ? wallet.chains : [], - hasBrowserExtension, - installUrl, - isMobileSupported, - order: knownOrder >= 0 ? knownOrder : wallet.order, - } -} diff --git a/apps/app/lib/walletConnect/registry.ts b/apps/app/lib/walletConnect/registry.ts deleted file mode 100644 index dd782808..00000000 --- a/apps/app/lib/walletConnect/registry.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { fetchWallets, chainsForNamespace } from "./api" -import { mapWallet } from "./mapWallet" -import type { WalletConnectWalletBase } from "./types" - -// Slugified names of wallets to exclude (duplicates / unwanted entries). -const SLUGS_TO_FILTER = ['okx-wallet-1', 'ready'] - -const SOLANA_MAINNET_CAIP = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' -const SOLANA_DEPRECATED_MAINNET_CAIP = 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' -const SOLANA_DEVNET_CAIP = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1' -const SOLANA_DEPRECATED_DEVNET_CAIP = 'solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K' - -const isSandbox = process.env.NEXT_PUBLIC_API_VERSION === 'sandbox' - -export const SOLANA_CAIP_IDS = isSandbox - ? [SOLANA_DEVNET_CAIP, SOLANA_DEPRECATED_DEVNET_CAIP] - : [SOLANA_MAINNET_CAIP, SOLANA_DEPRECATED_MAINNET_CAIP] - -export type ResolveOptions = { - namespace?: string - chainIds?: string[] - page?: number - entries?: number - search?: string -} - -export type ResolveResult = { - wallets: WalletConnectWalletBase[] - totalCount: number - nextPage: number | null -} - -export async function resolveWalletConnectWallets(opts: ResolveOptions = {}): Promise { - const chains = opts.chainIds?.join(',') - || (opts.namespace ? chainsForNamespace(opts.namespace) : undefined) - - const response = await fetchWallets({ - page: opts.page ?? 1, - entries: opts.entries ?? 40, - chains: chains || undefined, - search: opts.search, - }) - - const wallets = response.data - .map(mapWallet) - .filter(w => !SLUGS_TO_FILTER.includes(w.id)) - - return { - wallets, - totalCount: response.count, - nextPage: response.nextPage, - } -} diff --git a/apps/app/lib/walletConnect/subscribeDisplayUri.ts b/apps/app/lib/walletConnect/subscribeDisplayUri.ts deleted file mode 100644 index 673416e4..00000000 --- a/apps/app/lib/walletConnect/subscribeDisplayUri.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { QrCodeState } from "./types" - -export type DisplayUriListener = (uri: string) => void - -/** - * Minimal contract for anything that emits a WalletConnect `display_uri`. - * The Solana adapter implements this natively; for EVM we adapt wagmi's - * one-shot `provider.once('display_uri', ...)` into the same shape. - */ -export type DisplayUriSource = { - onDisplayUri(listener: DisplayUriListener): () => void -} - -export type SubscribeDisplayUriParams = { - source: DisplayUriSource - /** Converts the raw `wc:` URI into a wallet-specific deep link (mobile). */ - resolveURI?: (uri: string) => string | undefined - /** On mobile with a resolvable deep-link, the helper navigates away instead of emitting `onQr`. */ - isMobilePlatform: boolean - /** Called with each QR state transition (`loading` is emitted by the caller, not here). */ - onQr: (state: QrCodeState) => void -} - -/** - * Bridges a `display_uri` event source to the shared QR state shape, with - * mobile deep-link fallback. Returns an unsubscribe function. - * - * The caller is expected to have already emitted `{ state: 'loading' }` before - * invoking this helper. - */ -export function subscribeDisplayUri(params: SubscribeDisplayUriParams): () => void { - const { source, resolveURI, isMobilePlatform, onQr } = params - - return source.onDisplayUri((uri: string) => { - const deepLink = resolveURI ? resolveURI(uri) : undefined - - if (isMobilePlatform && deepLink) { - try { - const url = new URL(deepLink) - if (url.protocol === 'javascript:' || url.protocol === 'data:') { - console.warn('Blocked navigation to untrusted URL scheme') - onQr({ state: 'fetched', value: uri, deepLink }) - return - } - } catch { - console.warn('Blocked navigation to malformed URL') - onQr({ state: 'fetched', value: uri, deepLink }) - return - } - window.location.href = deepLink - return - } - - onQr({ state: 'fetched', value: uri, deepLink }) - }) -} diff --git a/apps/app/lib/walletConnect/types.ts b/apps/app/lib/walletConnect/types.ts deleted file mode 100644 index 2fd83482..00000000 --- a/apps/app/lib/walletConnect/types.ts +++ /dev/null @@ -1,61 +0,0 @@ -export type WalletConnectMobile = { - native?: string | null - universal?: string | null -} - -export type WalletConnectDesktop = { - native?: string | null - universal?: string | null -} - -/** - * Raw WalletConnect wallet shape resolved from the Web3Modal getWallets API. - * Chain-agnostic — each chain decorates this with chain-specific fields - * (e.g. wagmi's projectId/showQrModal/customStoragePrefix for EVM). - */ -export type WalletConnectWalletBase = { - id: string - name: string - icon: string - rdns?: string - mobile: WalletConnectMobile - desktop?: WalletConnectDesktop - chains: string[] - hasBrowserExtension: boolean - installUrl?: string - isMobileSupported: boolean - order: number - updatedAt?: string -} - -export type DynamicWcMetadata = { - name: string - icon: string - id: string -} - -/** - * Shared QR-modal state used by both EVM and Solana flows. - * `loading` — waiting for the `display_uri` event from the WC provider. - * `fetched` — URI received; `value` is the raw `wc:` URI (for the QR image), - * `deepLink` is the wallet-specific mobile deep-link (for copy/redirect). - */ -export type QrCodeState = - | { state: 'loading'; value: undefined; deepLink?: undefined } - | { state: 'fetched'; value: string; deepLink?: string } - -/** - * Marker attached to UI connector tiles that originated from the WalletConnect - * wallet registry (i.e. not a locally-installed adapter/connector). Both chains - * use this to decide whether to route a connect through the QR / deep-link path. - */ -export const WC_REGISTRY_MARKER = Symbol('wcRegistry') - -export type RegistryAttachedConnector = T & { - [WC_REGISTRY_MARKER]?: WalletConnectWalletBase -} - -export const getRegistryEntry = (c: unknown): WalletConnectWalletBase | undefined => { - if (!c || typeof c !== 'object') return undefined - return (c as Record)[WC_REGISTRY_MARKER] -} diff --git a/apps/app/lib/walletConnect/useAdditionalConnectors.ts b/apps/app/lib/walletConnect/useAdditionalConnectors.ts deleted file mode 100644 index 1565eab4..00000000 --- a/apps/app/lib/walletConnect/useAdditionalConnectors.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { useCallback, useMemo, useState } from 'react' -import type { RequestAdditionalConnectorsParams } from '@/Models/WalletProvider' -import { resolveWalletConnectWallets } from './registry' -import type { WalletConnectWalletBase } from './types' - -type PageCacheEntry = { - page: number - pageSize: number - result: { - wallets: WalletConnectWalletBase[] - totalCount: number - nextPage: number | null - } -} - -type NamespaceCache = Map> -type WalletConnectRequestResult = { - connectors: WalletConnectWalletBase[] - nextPage: number | null - totalCount: number -} - -const cacheByNamespace = new Map() -const inFlightByKey = new Map>() - -const DEFAULT_PAGE_SIZE = 40 -const MAX_CACHED_PAGES_PER_QUERY = 20 -const MAX_CACHED_QUERIES_PER_NAMESPACE = 50 - -const normalizeQuery = (query?: string) => query?.trim() ?? '' - -const getNamespaceCache = (namespace: string): NamespaceCache => { - if (!cacheByNamespace.has(namespace)) { - cacheByNamespace.set(namespace, new Map()) - } - - return cacheByNamespace.get(namespace)! -} - -const getQueryCache = (namespace: string, query: string) => { - const namespaceCache = getNamespaceCache(namespace) - if (!namespaceCache.has(query)) { - if (namespaceCache.size >= MAX_CACHED_QUERIES_PER_NAMESPACE) { - // Evict the oldest non-browse entry (Map iteration is insertion order). - // The browse key ('') backs the default list and stays cached to avoid - // a blank wallet list when the user clears their search. - for (const existingKey of namespaceCache.keys()) { - if (existingKey !== '') { - namespaceCache.delete(existingKey) - break - } - } - } - namespaceCache.set(query, new Map()) - } - - return namespaceCache.get(query)! -} - -const getPageKey = (page: number, pageSize: number) => `${page}:${pageSize}` - -const listCachedPages = (namespace: string, query: string): PageCacheEntry[] => { - return Array.from(getQueryCache(namespace, query).values()) - .sort((left, right) => left.page - right.page) -} - -const mergeRecents = (recents: WalletConnectWalletBase[], connectors: WalletConnectWalletBase[]) => { - if (recents.length === 0) return connectors - - const recentIds = new Set(recents.map(connector => connector.id.toLowerCase())) - return [...recents, ...connectors.filter(connector => !recentIds.has(connector.id.toLowerCase()))] -} - -async function fetchAdditionalConnectorsPage(namespace: string, params: Required) { - const query = normalizeQuery(params.query) - const pageKey = getPageKey(params.page, params.pageSize) - const queryCache = getQueryCache(namespace, query) - const cached = queryCache.get(pageKey) - - if (cached) { - return cached.result - } - - const inFlightKey = `${namespace}:${query}:${pageKey}` - const existingRequest = inFlightByKey.get(inFlightKey) - - if (existingRequest) { - return existingRequest - } - - const request = (async () => { - const result = await resolveWalletConnectWallets({ - namespace, - page: params.page, - entries: params.pageSize, - search: query || undefined, - }) - - if (queryCache.size >= MAX_CACHED_PAGES_PER_QUERY) { - const oldestKey = queryCache.keys().next().value - if (oldestKey) queryCache.delete(oldestKey) - } - - queryCache.set(pageKey, { - page: params.page, - pageSize: params.pageSize, - result, - }) - - return result - })() - - inFlightByKey.set(inFlightKey, request) - - try { - return await request - } finally { - inFlightByKey.delete(inFlightKey) - } -} - -export function useAdditionalConnectors(namespace: string) { - const [recents, setRecents] = useState([]) - const [browseVersion, setBrowseVersion] = useState(0) - - const requestAdditionalConnectors = useCallback(async (params: RequestAdditionalConnectorsParams = {}): Promise => { - const normalizedParams = { - page: params.page ?? 1, - pageSize: params.pageSize ?? DEFAULT_PAGE_SIZE, - query: normalizeQuery(params.query), - } - - const result = await fetchAdditionalConnectorsPage(namespace, normalizedParams) - - if (!normalizedParams.query) { - setBrowseVersion(version => version + 1) - } - - return { - connectors: result.wallets, - nextPage: result.nextPage, - totalCount: result.totalCount, - } - }, [namespace]) - - const addRecentConnector = useCallback((connector: WalletConnectWalletBase) => { - setRecents(previous => { - const deduped = previous.filter(item => item.id.toLowerCase() !== connector.id.toLowerCase()) - return [connector, ...deduped] - }) - }, []) - - const cachedBrowsePages = useMemo(() => listCachedPages(namespace, ''), [namespace, browseVersion]) - - const browseConnectors = useMemo(() => { - const connectors = cachedBrowsePages.flatMap(page => page.result.wallets) - return mergeRecents(recents, connectors) - }, [cachedBrowsePages, recents]) - - const browseMetadata = useMemo(() => { - const lastPage = cachedBrowsePages[cachedBrowsePages.length - 1] - return { - loaded: cachedBrowsePages.length > 0, - nextPage: lastPage?.result.nextPage ?? null, - totalCount: lastPage?.result.totalCount ?? 0, - } - }, [cachedBrowsePages]) - - return { - browseConnectors, - browseMetadata, - requestAdditionalConnectors, - addRecentConnector, - } -} diff --git a/apps/app/lib/wallets/aztec/KnownAztecConnectors.tsx b/apps/app/lib/wallets/aztec/KnownAztecConnectors.tsx index 0228e3e2..70bf5ae4 100644 --- a/apps/app/lib/wallets/aztec/KnownAztecConnectors.tsx +++ b/apps/app/lib/wallets/aztec/KnownAztecConnectors.tsx @@ -1,20 +1,10 @@ -import Azguard from "@/components/Icons/Wallets/Azguard" +import { azguardIconBase64 } from "./azguardIcon" const KnownAztecConnectors = [ { id: 'azguard-wallet', name: 'Azguard', - icon: Azguard - }, - { - id: 'azguard wallet', - name: 'Azguard', - icon: Azguard - }, - { - id: 'azguard', - name: 'Azguard', - icon: Azguard + icon: azguardIconBase64 }, ] diff --git a/apps/app/lib/wallets/aztec/adapter.tsx b/apps/app/lib/wallets/aztec/adapter.tsx new file mode 100644 index 00000000..f2e8db2b --- /dev/null +++ b/apps/app/lib/wallets/aztec/adapter.tsx @@ -0,0 +1,45 @@ +"use client" + +import { createReactHookConnectionAdapter } from "@layerswap/wallet-core" +import type { + WalletConnectionProviderProps, + WalletProvider, +} from "@layerswap/wallet-core/types" +import { useSettingsState } from "@/context/settings" +import type { ExtendedNetwork } from "@/Models/Network" +import { walletNetworkAdapter } from "@/lib/wallets/layerswap/networkAdapter" +import useAztec from "./useAztec" + +function useAztecConnection( + _props: WalletConnectionProviderProps, +) { + return useAztec() +} + +const connectionAdapter = createReactHookConnectionAdapter(useAztecConnection) + +/** + * Adapts Train's Aztec SDK integration to Layerswap's external wallet-store + * contract. Aztec remains app-owned because Layerswap does not ship an Aztec + * wallet package. + */ +export const aztecWalletAdapter: WalletProvider = { + id: "aztec", + createConnection: connectionAdapter.createConnection, +} + +/** + * The Aztec wallet SDK is React/context based, so its provider snapshot is + * hydrated from inside the app tree while the registry consumes the external + * store exposed above. + */ +export function AztecWalletAdapterHydrator() { + const { networks } = useSettingsState() + + return ( + + ) +} diff --git a/apps/app/lib/wallets/aztec/azguardIcon.ts b/apps/app/lib/wallets/aztec/azguardIcon.ts new file mode 100644 index 00000000..5594719d --- /dev/null +++ b/apps/app/lib/wallets/aztec/azguardIcon.ts @@ -0,0 +1,2 @@ +export const azguardIconBase64 = + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzOCIgaGVpZ2h0PSIzOCIgdmlld0JveD0iMCAwIDM4IDM4IiBmaWxsPSJub25lIj48cmVjdCB3aWR0aD0iMzgiIGhlaWdodD0iMzgiIGZpbGw9ImJsYWNrIi8+PHJlY3QgeD0iNCIgeT0iNCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiByeD0iMTUiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTMzLjM5MiAxNC43MDU5TDIzLjk1NDggMTguNDQ1MkwzNCAxOS43MDYxQzMzLjk4OCAxOS45NjQ2IDMzLjk2OTUgMjAuMjIxNCAzMy45NDQ1IDIwLjQ3NjJMMjMuNzM4MSAyMC41SDIzLjUwNDVMMzEuMDEzNiAyOC4wMDA2QzI4LjI3MzkgMzEuNjQzNiAyMy45MTIxIDM0IDE4Ljk5OTUgMzRWMjAuNVYxNkwxNC40OTQ0IDIwLjVIMTQuMjYwN0g0LjA1NjY5QzQuMDMxMzUgMjAuMjQ1IDQuMDEyNCAxOS45ODgzIDQgMTkuNzI5NkwxNC4wNDQxIDE4LjQ0NTJMNC42MDY5IDE0LjcwNTlDNC42ODA1NCAxNC40NTkzIDQuNzYwMzcgMTQuMjE1MyA0Ljg0NjE5IDEzLjk3NDJMMTQuNjg0NCAxNi40ODAzTDcuNTkzODQgOS4yNDIzQzcuNzYxNCA5LjA0NzA0IDcuOTMzOTEgOC44NTYxNSA4LjExMTE4IDguNjY5NzlMMTYuMDcwNyAxNC45NDQ5TDEyLjU0NCA1LjQ1Mjg0QzEyLjc3NTggNS4zNDI0IDEzLjAxMSA1LjIzNzc0IDEzLjI0OTIgNS4xMzkwM0wxNy45NjM1IDE0LjEwNDZMMTguNjEzMSA0LjAwNDg3QzE4Ljc0MTUgNC4wMDE2MyAxOC44NzAzIDQgMTguOTk5NSA0QzE5LjEyODYgNCAxOS4yNTc0IDQuMDAxNjMgMTkuMzg1OCA0LjAwNDg3TDIwLjAzNTQgMTQuMTA0NkwyNC43NDk4IDUuMTM5MDJDMjQuOTg3OSA1LjIzNzc0IDI1LjIyMyA1LjM0MjQgMjUuNDU0OSA1LjQ1MjgzTDIxLjkyODEgMTQuOTQ0OUwyOS44ODc3IDguNjY5NzlDMzAuMDY1IDguODU2MTQgMzAuMjM3NSA5LjA0NzA0IDMwLjQwNSA5LjI0MjI5TDIzLjMxNDUgMTYuNDgwM0wzMy4xNTI4IDEzLjk3NDJDMzMuMjM4NSAxNC4yMTUzIDMzLjMxODQgMTQuNDU5MyAzMy4zOTIgMTQuNzA1OVoiIGZpbGw9ImJsYWNrIi8+PC9zdmc+' diff --git a/apps/app/lib/wallets/aztec/useAztec.ts b/apps/app/lib/wallets/aztec/useAztec.ts index 47e50365..871b737c 100644 --- a/apps/app/lib/wallets/aztec/useAztec.ts +++ b/apps/app/lib/wallets/aztec/useAztec.ts @@ -1,24 +1,24 @@ -import KnownInternalNames from "../../knownIds"; import { useSettingsState } from "@/context/settings"; -import { InternalConnector, Wallet, WalletProvider } from "@/Models/WalletProvider"; -import { resolveWalletConnectorIcon } from "../utils/resolveWalletIcon"; +import type { InternalConnector, Wallet } from "@layerswap/widget-types"; +import type { WalletConnectionProvider } from "@layerswap/wallet-core/types"; +import { normalizeIconSrc } from "@layerswap/wallet-core"; import { extractAztecAddress } from "./utils"; import { useCallback, useMemo } from "react"; import { useAztecWalletContext } from "@/components/WalletProviders/AztecWalletProvider"; import { useActiveAztecAccount } from "@/components/WalletProviders/ActiveAztecAccount"; import { useWalletStore } from "@/stores/walletStore"; import KnownAztecConnectors from "./KnownAztecConnectors"; - -const commonSupportedNetworks = [ - KnownInternalNames.Networks.AztecDevnet, - KnownInternalNames.Networks.AztecTestnet -] +import { NetworkTypes } from "@/Models/Network"; const name = 'Aztec' const id = 'aztec' -export default function useAztec(): WalletProvider { +export default function useAztec(): WalletConnectionProvider { const { networks } = useSettingsState() + const supportedNetworks = useMemo(() => networks + .filter(network => network.networkType === NetworkTypes.Aztec || network.caip2Id.toLowerCase().startsWith('aztec:')) + .map(network => network.caip2Id), [networks]) + const networkIcon = networks.find(network => supportedNetworks.includes(network.caip2Id))?.logoUrl const { connect, disconnect } = useAztecWalletContext(); const { activeAddress: activeSelectedAddress, setActiveAddress } = useActiveAztecAccount(); @@ -48,16 +48,16 @@ export default function useAztec(): WalletProvider { address, providerName: name, isActive: true, - icon: resolveWalletConnectorIcon({ connector: wallet.id, address }), + icon: wallet.icon, disconnect: () => disconnectWallets(), - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, - networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.caip2Id))?.logoUrl + withdrawalSupportedNetworks: supportedNetworks, + asSourceSupportedNetworks: supportedNetworks, + autofillSupportedNetworks: supportedNetworks, + networkIcon, } - }, [wallets, networks, disconnectWallets, activeSelectedAddress]) + }, [wallets, disconnectWallets, activeSelectedAddress, supportedNetworks, networkIcon]) - const connectWallet = async (params?: { connector?: InternalConnector }) => { + const connectWallet = useCallback(async (params?: { connector?: InternalConnector }) => { try { const providerId = params?.connector?.id; if (!providerId) { @@ -90,12 +90,12 @@ export default function useAztec(): WalletProvider { address: primaryAddress, providerName: name, isActive: true, - icon: resolveWalletConnectorIcon({ connector: providerId, address: primaryAddress }), + icon: normalizeIconSrc(params?.connector?.icon), disconnect: () => disconnectWallets(), - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, - networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.caip2Id))?.logoUrl + withdrawalSupportedNetworks: supportedNetworks, + asSourceSupportedNetworks: supportedNetworks, + autofillSupportedNetworks: supportedNetworks, + networkIcon, } addWallet(newWallet) return newWallet; @@ -109,13 +109,14 @@ export default function useAztec(): WalletProvider { console.error(`Error connecting Aztec wallet:`, error); throw error; } - } + }, [addWallet, connect, disconnectWallets, networkIcon, supportedNetworks]) const availableConnectors: InternalConnector[] = useMemo(() => { const azguard = KnownAztecConnectors[0]; return [{ id: azguard.id, name: azguard.name, + icon: azguard.icon, providerName: name, extensionNotFound: false, hasBrowserExtension: true, @@ -127,20 +128,19 @@ export default function useAztec(): WalletProvider { setActiveAddress(address); }, [setActiveAddress]); - const provider: WalletProvider = { + return useMemo(() => ({ connectWallet, disconnectWallets, switchAccount, availableConnectors, connectedWallets: aztecWallet ? [aztecWallet] : undefined, activeWallet: aztecWallet, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, + withdrawalSupportedNetworks: supportedNetworks, + asSourceSupportedNetworks: supportedNetworks, + autofillSupportedNetworks: supportedNetworks, name, id, + providerIcon: networkIcon, ready: true, - } - - return provider + }), [availableConnectors, aztecWallet, connectWallet, disconnectWallets, networkIcon, supportedNetworks, switchAccount]) } diff --git a/apps/app/lib/wallets/evm/KnownEVMConnectors.tsx b/apps/app/lib/wallets/evm/KnownEVMConnectors.tsx deleted file mode 100644 index 2c325906..00000000 --- a/apps/app/lib/wallets/evm/KnownEVMConnectors.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import MetaMaskIcon from "../../../components/Icons/Wallets/MetaMask" -import WalletConnectIcon from "../../../components/Icons/Wallets/WalletConnect" -import BitKeep from "../../../components/Icons/Wallets/BitKeep" -import RainbowIcon from "../../../components/Icons/Wallets/Rainbow" -import CoinbaseIcon from "../../../components/Icons/Wallets/Coinbase" -import Phantom from "../../../components/Icons/Wallets/Phantom" -import { Connector } from "wagmi" -import Argent from "../../../components/Icons/Wallets/Argent" -import BitGetIcon from "../../../components/Icons/Wallets/Bitget" -import BrowserWallet from "../../../components/Icons/Wallets/BrowserWallet" - -const KnownEVMConnectors = [ - { - id: 'metamask', - icon: MetaMaskIcon, - }, - { - id: 'io.metamask', - icon: MetaMaskIcon - }, - { - id: 'metamasksdk', - icon: MetaMaskIcon - }, - { - id: 'walletconnect', - icon: WalletConnectIcon - }, - { - id: 'rainbow', - icon: RainbowIcon - }, - { - id: 'app.rainbow', - icon: RainbowIcon - }, - { - id: 'bitkeep', - icon: BitKeep - }, - { - id: 'bitget', - icon: BitGetIcon - }, - { - id: 'coinbasewalletsdk', - icon: CoinbaseIcon - }, - { - id: 'phantom', - icon: Phantom - }, - { - id: 'app.phantom', - icon: Phantom - }, - { - id: 'argent', - icon: Argent - }, - { - id: 'injected', - icon: BrowserWallet - } -] - -export const evmConnectorNameResolver = (connector: Connector) => { - - const connectorById = KnownEVMConnectors.find(c => c.id === connector.id.toLowerCase()) - const connectorByName = KnownEVMConnectors.find(c => c.id === connector.name.toLowerCase()) - - if (connectorById) return connectorById.id - else if (connectorByName) return connectorByName.id - - return connector.id -} - -export default KnownEVMConnectors \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/connectors/explicitInjectedProviderDetected.ts b/apps/app/lib/wallets/evm/connectors/explicitInjectedProviderDetected.ts deleted file mode 100644 index 4d99457f..00000000 --- a/apps/app/lib/wallets/evm/connectors/explicitInjectedProviderDetected.ts +++ /dev/null @@ -1,84 +0,0 @@ - -export function explicitInjectedProviderDetected() { - const _window = - typeof window !== 'undefined' ? (window as WindowProvider) : undefined; - if (typeof _window === 'undefined' || typeof _window.ethereum === 'undefined') - return false; - return !!_window.ethereum; -} - -export type Evaluate = { [key in keyof type]: type[key] } & unknown; - -export type WalletProvider = Evaluate< - EIP1193Provider & { - [key in WalletProviderFlags]?: true | undefined; - } & { - providers?: any[] | undefined; - /** Only exists in MetaMask as of 2022/04/03 */ - _events?: { connect?: (() => void) | undefined } | undefined; - /** Only exists in MetaMask as of 2022/04/03 */ - _state?: - | { - accounts?: string[]; - initialized?: boolean; - isConnected?: boolean; - isPermanentlyDisconnected?: boolean; - isUnlocked?: boolean; - } - | undefined; - } ->; - -export type WindowProvider = { - coinbaseWalletExtension?: WalletProvider | undefined; - ethereum?: WalletProvider | undefined; - phantom?: { ethereum: WalletProvider } | undefined; - providers?: any[] | undefined; // Adjust the type as needed -}; - -export type WalletProviderFlags = - | 'isApexWallet' - | 'isAvalanche' - | 'isBackpack' - | 'isBifrost' - | 'isBitKeep' - | 'isBitski' - | 'isBlockWallet' - | 'isBraveWallet' - | 'isCoinbaseWallet' - | 'isDawn' - | 'isEnkrypt' - | 'isExodus' - | 'isFrame' - | 'isFrontier' - | 'isGamestop' - | 'isHyperPay' - | 'isImToken' - | 'isKuCoinWallet' - | 'isMathWallet' - | 'isMetaMask' - | 'isNestWallet' - | 'isOkxWallet' - | 'isOKExWallet' - | 'isOneInchAndroidWallet' - | 'isOneInchIOSWallet' - | 'isOpera' - | 'isPhantom' - | 'isPortal' - | 'isRabby' - | 'isRainbow' - | 'isStatus' - | 'isTally' - | 'isTokenPocket' - | 'isTokenary' - | 'isTrust' - | 'isTrustWallet' - | 'isXDEFI' - | 'isZerion' - | 'isTalisman' - | 'isZeal' - | 'isCoin98' - | 'isMEWwallet' - | 'isSafeheron' - | 'isSafePal' - | '__seif'; diff --git a/apps/app/lib/wallets/evm/connectors/types.ts b/apps/app/lib/wallets/evm/connectors/types.ts deleted file mode 100644 index fd05eaed..00000000 --- a/apps/app/lib/wallets/evm/connectors/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Connector } from "wagmi" - -export type LSConnector = Connector & { - resolveURI?: (uri: string) => string - order?: number, - isAvailable?: boolean, - deepLink?: string, -} \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/connectors/useSyncProviders/EthereumProviderTypes.d.ts b/apps/app/lib/wallets/evm/connectors/useSyncProviders/EthereumProviderTypes.d.ts deleted file mode 100644 index 67e882fe..00000000 --- a/apps/app/lib/wallets/evm/connectors/useSyncProviders/EthereumProviderTypes.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -// EthereumProviderTypes.d.ts - -// Interface for provider information following EIP-6963. -interface EIP6963ProviderInfo { - rdns: string; // Reverse-DNS wallet identifier per EIP-6963 (e.g. io.metamask, org.tronlink.www) - uuid: string; // Globally unique ID to differentiate between provider sessions for the lifetime of the page - name: string; // Human-readable name of the wallet - icon: string; // URL to the wallet's icon - } - - // Interface for Ethereum providers based on the EIP-1193 standard. - interface EIP1193Provider { - isStatus?: boolean; // Optional: Indicates the status of the provider - host?: string; // Optional: Host URL of the Ethereum node - path?: string; // Optional: Path to a specific endpoint or service on the host - sendAsync?: (request: { method: string, params?: Array }, callback: (error: Error | null, response: unknown) => void) => void; // For sending asynchronous requests - send?: (request: { method: string, params?: Array }, callback: (error: Error | null, response: unknown) => void) => void; // For sending synchronous requests - request: (request: { method: string, params?: Array }) => Promise; // Standard method for sending requests per EIP-1193 - } - - // Interface detailing the structure of provider information and its Ethereum provider. - interface EIP6963ProviderDetail { - info: EIP6963ProviderInfo; // The provider's info - provider: EIP1193Provider; // The EIP-1193 compatible provider - } - - // Type representing the event structure for announcing a provider based on EIP-6963. - type EIP6963AnnounceProviderEvent = { - detail: { - info: EIP6963ProviderInfo; // The provider's info - provider: EIP1193Provider; // The EIP-1193 compatible provider - } - } \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/connectors/useSyncProviders/index.ts b/apps/app/lib/wallets/evm/connectors/useSyncProviders/index.ts deleted file mode 100644 index b9db3eff..00000000 --- a/apps/app/lib/wallets/evm/connectors/useSyncProviders/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useSyncExternalStore } from "react"; -import { store } from "./store"; - -export const useSyncProviders = ()=> useSyncExternalStore(store.subscribe, store.value, store.value) \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/connectors/useSyncProviders/store.ts b/apps/app/lib/wallets/evm/connectors/useSyncProviders/store.ts deleted file mode 100644 index 0e27627f..00000000 --- a/apps/app/lib/wallets/evm/connectors/useSyncProviders/store.ts +++ /dev/null @@ -1,30 +0,0 @@ -declare global { - interface WindowEventMap { - "eip6963:announceProvider": CustomEvent; - } -} - -let providers: EIP6963ProviderDetail[] = []; - -export const store = { - value: () => providers, - - subscribe: (callback: (providers: EIP6963ProviderDetail[]) => void) => { - - function onAnnouncement(event: EIP6963AnnounceProviderEvent) { - // Prevent adding a provider if it already exists in the list based on its uuid. - if (providers.some(p => p.info.uuid === event.detail.info.uuid)) return; - - // Add the new provider to the list and call the provided callback function. - providers = [...providers, event.detail]; - callback([...providers, event.detail]); - } - - window.addEventListener("eip6963:announceProvider", onAnnouncement as unknown as EventListener); - window.dispatchEvent(new Event("eip6963:requestProvider")); - - return () => { - window.removeEventListener("eip6963:announceProvider", onAnnouncement as unknown as EventListener); - } - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/connectors/walletConnect.ts b/apps/app/lib/wallets/evm/connectors/walletConnect.ts deleted file mode 100644 index 5991b216..00000000 --- a/apps/app/lib/wallets/evm/connectors/walletConnect.ts +++ /dev/null @@ -1,497 +0,0 @@ -import { buildDeepLink } from '@/lib/walletConnect/buildDeepLink' -import { - ChainNotConfiguredError, - type Connector, - ProviderNotFoundError, - createConnector, - extractRpcUrls, -} from '@wagmi/core' -import type { Compute, ExactPartial, Omit } from '@wagmi/core/internal' -import type { EthereumProvider } from '@walletconnect/ethereum-provider' -import { - type AddEthereumChainParameter, - type Address, - type ProviderConnectInfo, - type ProviderRpcError, - type RpcError, - SwitchChainError, - UserRejectedRequestError, - getAddress, - numberToHex, -} from 'viem' - -type WalletConnectConnector = Connector & { - onDisplayUri(uri: string): void - onSessionDelete(data: { topic: string }): void -} - -type EthereumProviderOptions = Parameters<(typeof EthereumProvider)['init']>[0] - -export type WalletConnectParameters = Compute< - { - /** - * If a new chain is added to a previously existing configured connector `chains`, this flag - * will determine if that chain should be considered as stale. A stale chain is a chain that - * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or - * rejected the chain). - * - * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization - * with WalletConnect v2. - * - * If `true` (default), the new chain will be treated as a stale chain. If the user - * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect - * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to - * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain. - * This is the default behavior to avoid an unexpected error upon switching chains which may - * be a confusing user experience (e.g. the user will not know they have to reconnect - * unless the dapp handles these types of errors). - * - * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user - * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully - * auto-connect the user. This comes with the trade-off that the connector will throw an error - * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates. - * This may be useful in cases where a dapp constantly - * modifies their configured chains, and they do not want to disconnect the user upon - * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the - * dapp handles this error and prompts the user to reconnect to the dapp in order to approve - * the newly added chain. - * - * @default true - */ - isNewChainsStale?: boolean - } & Omit< - EthereumProviderOptions, - | 'chains' - | 'events' - | 'optionalChains' - | 'optionalEvents' - | 'optionalMethods' - | 'methods' - | 'rpcMap' - | 'showQrModal' - > & - ExactPartial> -> - -type Params = { - id: string, - name: string, - rdns: string, - type: string, - mobile: { - native: string, - universal: string, - }, - icon: string, -} & WalletConnectParameters -walletConnect.type = 'metamask' -export function walletConnect(parameters: Params) { - const isNewChainsStale = parameters.isNewChainsStale ?? true - const { id, name, rdns, type, mobile, icon } = parameters - - type Provider = Awaited> - type Properties = { - connect(parameters?: { - chainId?: number | undefined - isReconnecting?: boolean | undefined - pairingTopic?: string | undefined - }): Promise<{ - accounts: readonly Address[] - chainId: number - }> - getNamespaceChainsIds(): number[] - getRequestedChainsIds(): Promise - isChainsStale(): Promise - onConnect(connectInfo: ProviderConnectInfo): void - onDisplayUri(uri: string): void - onSessionDelete(data: { topic: string }): void - setRequestedChainsIds(chains: number[]): void - requestedChainsStorageKey: `${string}.requestedChains` - } - type StorageItem = { - [_ in Properties['requestedChainsStorageKey']]: number[] - } - - let provider_: Provider | undefined - let providerPromise: Promise - const NAMESPACE = 'eip155' - - let accountsChanged: WalletConnectConnector['onAccountsChanged'] | undefined - let chainChanged: WalletConnectConnector['onChainChanged'] | undefined - let connect: WalletConnectConnector['onConnect'] | undefined - let displayUri: WalletConnectConnector['onDisplayUri'] | undefined - let sessionDelete: WalletConnectConnector['onSessionDelete'] | undefined - let disconnect: WalletConnectConnector['onDisconnect'] | undefined - - return createConnector((config) => ({ - id: id, - name: name, - rdns: rdns, - type: type, - deepLink: mobile.native || mobile.universal, - icon: icon, - resolveURI: (uri: string) => getResolveUri(id, uri, mobile), - async setup() { - const provider = await this.getProvider().catch(() => null) - if (!provider) return - if (!connect) { - connect = this.onConnect.bind(this) - provider.on('connect', connect) - } - if (!sessionDelete) { - sessionDelete = this.onSessionDelete.bind(this) - provider.on('session_delete', sessionDelete) - } - }, - async connect({ chainId, ...rest } = {} as any) { - try { - const provider = await this.getProvider() - if (!provider) throw new ProviderNotFoundError() - if (!displayUri) { - displayUri = this.onDisplayUri - provider.on('display_uri', displayUri) - } - - let targetChainId = chainId - if (!targetChainId) { - const state = (await config.storage?.getItem('state')) ?? {} - const isChainSupported = config.chains.some( - (x) => x.id === state.chainId, - ) - if (isChainSupported) targetChainId = state.chainId - else targetChainId = config.chains[0]?.id - } - if (!targetChainId) throw new Error('No chains found on connector.') - - const isChainsStale = await this.isChainsStale() - // If there is an active session with stale chains, disconnect current session. - if (provider.session && isChainsStale) await provider.disconnect() - - // If there isn't an active session or chains are stale, connect. - if (!provider.session || isChainsStale) { - const optionalChains = config.chains - .filter((chain) => chain.id !== targetChainId) - .map((optionalChain) => optionalChain.id) - await provider.connect({ - optionalChains: [targetChainId, ...optionalChains], - ...('pairingTopic' in rest - ? { pairingTopic: rest.pairingTopic } - : {}), - }) - - this.setRequestedChainsIds(config.chains.map((x) => x.id)) - } - - // If session exists and chains are authorized, enable provider for required chain - const accounts = (await provider.enable()).map((x: string) => getAddress(x)) - const currentChainId = await this.getChainId() - - if (displayUri) { - provider.removeListener('display_uri', displayUri) - displayUri = undefined - } - if (connect) { - provider.removeListener('connect', connect) - connect = undefined - } - if (!accountsChanged) { - accountsChanged = this.onAccountsChanged.bind(this) - provider.on('accountsChanged', accountsChanged) - } - if (!chainChanged) { - chainChanged = this.onChainChanged.bind(this) - provider.on('chainChanged', chainChanged) - } - if (!disconnect) { - disconnect = this.onDisconnect.bind(this) - provider.on('disconnect', disconnect) - } - if (!sessionDelete) { - sessionDelete = this.onSessionDelete.bind(this) - provider.on('session_delete', sessionDelete) - } - - return { accounts, chainId: currentChainId } - } catch (error) { - if ( - /(user rejected|connection request reset)/i.test( - (error as ProviderRpcError)?.message, - ) - ) { - throw new UserRejectedRequestError(error as Error) - } - throw error - } - }, - async disconnect() { - const provider = await this.getProvider() - try { - await provider?.disconnect() - } catch (error) { - if (!/No matching key/i.test((error as Error).message)) throw error - } finally { - if (chainChanged) { - provider?.removeListener('chainChanged', chainChanged) - chainChanged = undefined - } - if (disconnect) { - provider?.removeListener('disconnect', disconnect) - disconnect = undefined - } - if (!connect) { - connect = this.onConnect.bind(this) - provider?.on('connect', connect) - } - if (accountsChanged) { - provider?.removeListener('accountsChanged', accountsChanged) - accountsChanged = undefined - } - if (sessionDelete) { - provider?.removeListener('session_delete', sessionDelete) - sessionDelete = undefined - } - - this.setRequestedChainsIds([]) - } - }, - async getAccounts() { - const provider = await this.getProvider() - return provider.accounts.map((x: string) => getAddress(x)) - }, - async getProvider({ chainId } = {}) { - if (typeof window === 'undefined') return undefined as unknown as Provider - async function initProvider() { - const optionalChains = config.chains.map((x) => x.id) as [number] - if (!optionalChains.length) return - const { EthereumProvider } = await import( - '@walletconnect/ethereum-provider' - ) - return await EthereumProvider.init({ - ...parameters, - disableProviderPing: true, - optionalChains, - projectId: parameters.projectId, - rpcMap: Object.fromEntries( - config.chains.map((chain) => { - const [url] = extractRpcUrls({ - chain, - transports: config.transports, - }) - return [chain.id, url] - }), - ), - showQrModal: parameters.showQrModal ?? true, - }) - } - - if (!provider_) { - if (!providerPromise) providerPromise = initProvider() - provider_ = await providerPromise - provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY) - } - if (chainId) await this.switchChain?.({ chainId }) - return provider_! - }, - async getChainId() { - const provider = await this.getProvider() - return provider.chainId - }, - async isAuthorized() { - try { - const [accounts, provider] = await Promise.all([ - this.getAccounts(), - this.getProvider(), - ]) - - // If an account does not exist on the session, then the connector is unauthorized. - if (!accounts.length) return false - - // If the chains are stale on the session, then the connector is unauthorized. - const isChainsStale = await this.isChainsStale() - if (isChainsStale && provider.session) { - await provider.disconnect().catch(() => { }) - return false - } - return true - } catch { - return false - } - }, - async switchChain({ addEthereumChainParameter, chainId }) { - const provider = await this.getProvider() - if (!provider) throw new ProviderNotFoundError() - - const chain = config.chains.find((x) => x.id === chainId) - if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) - - try { - await Promise.all([ - new Promise((resolve) => { - const listener = ({ - chainId: currentChainId, - }: { chainId?: number | undefined }) => { - if (currentChainId === chainId) { - config.emitter.off('change', listener) - resolve() - } - } - config.emitter.on('change', listener) - }), - provider.request({ - method: 'wallet_switchEthereumChain', - params: [{ chainId: numberToHex(chainId) }], - }), - ]) - - const requestedChains = await this.getRequestedChainsIds() - this.setRequestedChainsIds([...requestedChains, chainId]) - - return chain - } catch (err) { - const error = err as RpcError - - if (/(user rejected)/i.test(error.message)) - throw new UserRejectedRequestError(error) - - // Indicates chain is not added to provider - try { - let blockExplorerUrls: string[] | undefined - if (addEthereumChainParameter?.blockExplorerUrls) - blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls - else - blockExplorerUrls = chain.blockExplorers?.default.url - ? [chain.blockExplorers?.default.url] - : [] - - let rpcUrls: readonly string[] - if (addEthereumChainParameter?.rpcUrls?.length) - rpcUrls = addEthereumChainParameter.rpcUrls - else rpcUrls = [...chain.rpcUrls.default.http] - - const addEthereumChain = { - blockExplorerUrls, - chainId: numberToHex(chainId), - chainName: addEthereumChainParameter?.chainName ?? chain.name, - iconUrls: addEthereumChainParameter?.iconUrls, - nativeCurrency: - addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency, - rpcUrls, - } satisfies AddEthereumChainParameter - - await provider.request({ - method: 'wallet_addEthereumChain', - params: [addEthereumChain], - }) - - const requestedChains = await this.getRequestedChainsIds() - this.setRequestedChainsIds([...requestedChains, chainId]) - return chain - } catch (error) { - throw new UserRejectedRequestError(error as Error) - } - } - }, - onAccountsChanged(accounts) { - if (accounts.length === 0) this.onDisconnect() - else - config.emitter.emit('change', { - accounts: accounts.map((x) => getAddress(x)), - }) - }, - onChainChanged(chain) { - const chainId = Number(chain) - config.emitter.emit('change', { chainId }) - }, - async onConnect(connectInfo) { - const chainId = Number(connectInfo.chainId) - const accounts = await this.getAccounts() - config.emitter.emit('connect', { accounts, chainId }) - }, - async onDisconnect(_error) { - this.setRequestedChainsIds([]) - config.emitter.emit('disconnect') - - const provider = await this.getProvider() - if (accountsChanged) { - provider.removeListener('accountsChanged', accountsChanged) - accountsChanged = undefined - } - if (chainChanged) { - provider.removeListener('chainChanged', chainChanged) - chainChanged = undefined - } - if (disconnect) { - provider.removeListener('disconnect', disconnect) - disconnect = undefined - } - if (sessionDelete) { - provider.removeListener('session_delete', sessionDelete) - sessionDelete = undefined - } - if (!connect) { - connect = this.onConnect.bind(this) - provider.on('connect', connect) - } - }, - onDisplayUri(uri) { - config.emitter.emit('message', { type: 'display_uri', data: uri }) - }, - onSessionDelete() { - this.onDisconnect() - }, - getNamespaceChainsIds() { - if (!provider_) return [] - const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map( - (account) => Number.parseInt(account.split(':')[1] || ''), - ) - return chainIds ?? [] - }, - async getRequestedChainsIds() { - return ( - (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? [] - ) - }, - /** - * Checks if the target chains match the chains that were - * initially requested by the connector for the WalletConnect session. - * If there is a mismatch, this means that the chains on the connector - * are considered stale, and need to be revalidated at a later point (via - * connection). - * - * There may be a scenario where a dapp adds a chain to the - * connector later on, however, this chain will not have been approved or rejected - * by the wallet. In this case, the chain is considered stale. - */ - async isChainsStale() { - if (!isNewChainsStale) return false - - const connectorChains = config.chains.map((x) => x.id) - const namespaceChains = this.getNamespaceChainsIds() - if ( - namespaceChains.length && - !namespaceChains.some((id: number) => connectorChains.includes(id)) - ) - return false - - const requestedChains = await this.getRequestedChainsIds() - return !connectorChains.every((id) => requestedChains.includes(id)) - }, - async setRequestedChainsIds(chains) { - await config.storage?.setItem(this.requestedChainsStorageKey, chains) - }, - get requestedChainsStorageKey() { - return `${this.id}.requestedChains` as Properties['requestedChainsStorageKey'] - }, - })) -} - -function getResolveUri( - id: string, - uri: string, - mobile: { - native: string, - universal: string, - }, -): string { - return buildDeepLink({ id, mobile }, uri) -} \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/constants.ts b/apps/app/lib/wallets/evm/constants.ts deleted file mode 100644 index fbc9e4a7..00000000 --- a/apps/app/lib/wallets/evm/constants.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const featuredWalletsIds = [ - 'metamask', - 'argent', - 'rainbow', - 'bitkeep', - 'okx-wallet', -] - -export const HIDDEN_WALLETCONNECT_ID = 'hiddenWalletConnect' \ No newline at end of file diff --git a/apps/app/lib/wallets/evm/useEVM.ts b/apps/app/lib/wallets/evm/useEVM.ts deleted file mode 100644 index 92679bd3..00000000 --- a/apps/app/lib/wallets/evm/useEVM.ts +++ /dev/null @@ -1,566 +0,0 @@ -import { useConfig, useConnect, useConnectors, useDisconnect, useSwitchAccount, Connector } from "wagmi" -import { Network, NetworkTypes } from "@/Models/Network" -import { useSettingsState } from "@/context/settings" -import KnownInternalNames from "../../knownIds" -import { resolveWalletConnectorIcon, resolveWalletConnectorIndex } from "../utils/resolveWalletIcon" -import { evmConnectorNameResolver } from "./KnownEVMConnectors" -import { useCallback, useEffect, useMemo } from "react" -import { CreateConnectorFn, getAccount, getConnections } from '@wagmi/core' -import { isMobile } from "../utils/isMobile" -import convertSvgComponentToBase64 from "@/components/utils/convertSvgComponentToBase64" -import { - InternalConnector, - RequestAdditionalConnectorsParams, - RequestAdditionalConnectorsResult, - Wallet, - WalletProvider, -} from "@/Models/WalletProvider" -import { useConnectModal, WalletModalConnector } from "@/components/WalletModal" -import sleep from "../utils/sleep" -import { HIDDEN_WALLETCONNECT_ID, featuredWalletsIds } from "@/lib/wallets/evm/constants" -import { useActiveEvmAccount } from "@/components/WalletProviders/ActiveEvmAccount" -import { - getDynamicWcMetadata, - setDynamicWcMetadata, - getPendingDynamicWcMetadata, - clearPendingDynamicWcMetadata, - setPendingMetadataForRegistry, -} from "@/lib/walletConnect/dynamicMetadata" -import { - DynamicWcMetadata, - getRegistryEntry, - type WalletConnectWalletBase, -} from "@/lib/walletConnect/types" -import { buildDeepLink } from "@/lib/walletConnect/buildDeepLink" -import { subscribeDisplayUri, type DisplayUriSource } from "@/lib/walletConnect/subscribeDisplayUri" -import { mapConnectError } from "@/lib/walletConnect/mapConnectError" -import { useAdditionalConnectors } from "@/lib/walletConnect/useAdditionalConnectors" -import { createRegistryConnector, type RegistryConnector } from "@/lib/walletConnect/createRegistryConnector" -import { LSConnector } from "./connectors/types" -import { explicitInjectedProviderDetected } from "./connectors/explicitInjectedProviderDetected" - -const name = 'EVM' -const id = 'eip155' - -const ethereumNames = [KnownInternalNames.Networks.EthereumMainnet, KnownInternalNames.Networks.EthereumSepolia] - -export default function useEVM(): WalletProvider { - const { networks } = useSettingsState() - const isMobilePlatform = useMemo(() => isMobile(), []); - - const asSourceSupportedNetworks = useMemo(() => [ - ...networks.filter(network => network.networkType === NetworkTypes.EVM).map(l => l.caip2Id), - ], [networks]) - - const withdrawalSupportedNetworks = useMemo(() => [ - ...asSourceSupportedNetworks, - ], [asSourceSupportedNetworks]) - - const autofillSupportedNetworks = useMemo(() => [ - ...asSourceSupportedNetworks, - ], [asSourceSupportedNetworks]) - - const isNotAvailableCondition = useCallback((connectorId: string | undefined, network: string | undefined, purpose?: "withdrawal" | "autofill" | "asSource") => { - if (!network) return false - if (!connectorId) return true - - if (!purpose) { - return resolveSupportedNetworks([network], connectorId).length === 0 - } - - const supportedNetworksByPurpose = resolveSupportedNetworks( - purpose === "withdrawal" ? withdrawalSupportedNetworks : - purpose === "autofill" ? autofillSupportedNetworks : - asSourceSupportedNetworks, - connectorId - ) - - return supportedNetworksByPurpose.length === 0 || !supportedNetworksByPurpose.includes(network) - }, [withdrawalSupportedNetworks, autofillSupportedNetworks, asSourceSupportedNetworks]) - - const { disconnectAsync } = useDisconnect() - const { switchAccountAsync } = useSwitchAccount() - const { activeConnection, setActiveAddress } = useActiveEvmAccount() - const allConnectors = useConnectors() - const config = useConfig() - const { connectAsync } = useConnect(); - - const { setSelectedConnector, isWalletModalOpen } = useConnectModal() - const { - browseConnectors: walletConnectConnectors, - browseMetadata: walletConnectBrowseMetadata, - requestAdditionalConnectors: requestRegistryConnectors, - addRecentConnector: addWalletConnectWallet, - } = useAdditionalConnectors(id) - - useEffect(() => { - if (isWalletModalOpen && !walletConnectBrowseMetadata.loaded) { - requestRegistryConnectors({ page: 1, pageSize: 40 }).catch((error) => console.warn('Failed to load WalletConnect wallets registry', error)) - } - }, [isWalletModalOpen, walletConnectBrowseMetadata.loaded, requestRegistryConnectors]) - - const disconnectWallet = useCallback(async (connectorName: string) => { - - try { - const connections = getConnections(config) - const connector = connections.find(c => c.connector.name.toLowerCase() === connectorName.toLowerCase())?.connector - await disconnectAsync({ - connector: connector - }) - } - catch (e) { - console.log(e) - } - }, [config, disconnectAsync]) - - const disconnectWallets = useCallback(() => { - try { - const connections = getConnections(config) - connections.forEach(async (connection) => { - disconnectWallet(connection.connector.name) - }) - } - catch (e) { - console.log(e) - } - }, [config, disconnectWallet]) - - const configuredConnectors: InternalConnector[] = useMemo(() => { - const activeBrowserWallet = explicitInjectedProviderDetected() && allConnectors.filter(c => c.id !== "com.immutable.passport" && c.type === "injected").length === 1 - const filterConnectors = wallet => ( - (wallet.id === "injected" ? activeBrowserWallet : true) && - wallet.id !== HIDDEN_WALLETCONNECT_ID - ) - - return dedupePreferInjected(allConnectors.filter(filterConnectors)) - .map(w => { - const walletConnectWallet = walletConnectConnectors.find(w2 => w2.name.toLowerCase().includes(w.name.toLowerCase()) || w2.id.toLowerCase() === w.id.toLowerCase()) - const isWalletConnectSupported = w.type === "walletConnect" || w.name === "WalletConnect" - const type = ((w.type == 'injected' && w.id !== 'com.immutable.passport') || w.id === "metaMaskSDK" || isWalletConnectSupported) ? w.type : "other" - return { - ...w, - order: resolveWalletConnectorIndex(w.id), - type: type, - isMobileSupported: isWalletConnectSupported, - installUrl: walletConnectWallet?.installUrl, - hasBrowserExtension: walletConnectWallet?.hasBrowserExtension, - extensionNotFound: walletConnectWallet?.hasBrowserExtension ? (type == 'walletConnect' && !isMobilePlatform) : false, - providerName: name - } - }) - }, [allConnectors, walletConnectConnectors, isMobilePlatform, name]) - - const { featured: featuredDynamicConnectors, additional: additionalConnectors } = useMemo(() => { - return splitRegistryConnectors(configuredConnectors, walletConnectConnectors, isMobilePlatform, name) - }, [configuredConnectors, walletConnectConnectors, isMobilePlatform, name]) - - const availableConnectors = useMemo(() => { - return [...configuredConnectors, ...featuredDynamicConnectors] - }, [configuredConnectors, featuredDynamicConnectors]) - - const requestAdditionalConnectors = useCallback(async (params: RequestAdditionalConnectorsParams = {}): Promise => { - const result = await requestRegistryConnectors(params) - return { - connectors: splitRegistryConnectors(configuredConnectors, result.connectors, isMobilePlatform, name).additional, - nextPage: result.nextPage, - totalCount: result.totalCount, - } - }, [configuredConnectors, requestRegistryConnectors, isMobilePlatform, name]) - - const connectWallet = useCallback(async (props: { connector: WalletModalConnector }) => { - let unsubscribeDisplayUri: (() => void) | undefined - let registryBase = undefined as ReturnType - try { - const internalConnector = props?.connector; - if (!internalConnector) return; - let connector = availableConnectors.find(w => w.id === internalConnector.id) as InternalConnector & LSConnector - let actualConnector = connector - - registryBase = getRegistryEntry(internalConnector) ?? getRegistryEntry(connector) - - if (registryBase) { - addWalletConnectWallet(registryBase) - - const wcConnector = allConnectors.find(c => c.id === HIDDEN_WALLETCONNECT_ID) - if (!wcConnector) throw new Error("Hidden WalletConnect connector not found") - actualConnector = wcConnector as InternalConnector & LSConnector - - const resolveURI = (uri: string) => buildDeepLink({ id: registryBase!.id, mobile: registryBase!.mobile }, uri) - connector = Object.assign({}, wcConnector, { - id: registryBase.id, - name: registryBase.name, - icon: registryBase.icon, - type: 'other', - isMobileSupported: true, - resolveURI, - }) as InternalConnector & LSConnector - } else if (!connector || typeof connector.disconnect !== 'function') { - throw new Error("Connector not found") - } - - const Icon = connector.icon || resolveWalletConnectorIcon({ connector: evmConnectorNameResolver(connector) }) - const base64Icon = typeof Icon == 'string' ? Icon : convertSvgComponentToBase64(Icon) - setSelectedConnector({ ...connector, icon: base64Icon }) - if (actualConnector.id !== "coinbaseWalletSDK" && typeof actualConnector.disconnect === 'function') { - await actualConnector.disconnect() - await disconnectAsync({ connector: actualConnector }) - } - - const resolveURI = connector.resolveURI as ((uri: string) => string | undefined) | undefined - const showQrCode = (internalConnector as any)?.showQrCode - const wantsMobileRedirect = isMobilePlatform && connector.id !== "walletConnect" && !!resolveURI - const wantsQrModal = !isMobilePlatform - && connector.type !== 'injected' - && !!connector.isMobileSupported - && connector.id !== "coinbaseWalletSDK" - && connector.id !== "metaMaskSDK" - - if (wantsQrModal) { - setSelectedConnector({ ...connector, icon: base64Icon, qr: { state: 'loading', value: undefined }, showQrCode }) - } - - if (wantsMobileRedirect || wantsQrModal) { - unsubscribeDisplayUri = subscribeDisplayUri({ - source: wagmiDisplayUriSource(actualConnector), - resolveURI, - isMobilePlatform, - onQr: (qr) => setSelectedConnector({ ...connector, icon: base64Icon, qr, showQrCode }), - }) - } - - // Always prime pending metadata for registry-origin connects so the - // `connectedWallets` re-render that happens between connect start and - // address resolution can render the right wallet name/icon. - const pendingMetadata = setPendingMetadataForRegistry(id, registryBase) - - try { - await connectAsync({ connector: actualConnector }); - } finally { - unsubscribeDisplayUri?.() - unsubscribeDisplayUri = undefined - } - - const activeAccount = await attemptGetAccount(config) - - if (registryBase && pendingMetadata && activeAccount.address) { - setDynamicWalletMetadata(activeAccount.address, pendingMetadata) - } - clearPendingDynamicWcMetadata(id) - - const connections = getConnections(config) - let connection = connections.find(c => c.connector.id === connector?.id) - - if (!connection) { - const accounts = await connector.getAccounts() - if (!accounts?.length) { - throw new Error('No accounts returned from wallet') - } - const chainId = await connector.getChainId() - connection = { - accounts: accounts as readonly [`0x${string}`, ...`0x${string}`[]], - chainId: Number(chainId), - connector - } - } - - const wallet = ResolveWallet({ - activeConnection: (activeAccount.connector && activeAccount.address) ? { - id: activeAccount.connector.id, - address: activeAccount.address - } : undefined, - connection, - disconnect: disconnectWallet, - networks, - supportedNetworks: { - asSource: asSourceSupportedNetworks, - autofill: autofillSupportedNetworks, - withdrawal: withdrawalSupportedNetworks - }, - providerName: name - }) - - return wallet - - } catch (e) { - throw mapConnectError(e) - } finally { - unsubscribeDisplayUri?.() - if (registryBase) clearPendingDynamicWcMetadata(id) - } - }, [availableConnectors, disconnectAsync, networks, asSourceSupportedNetworks, autofillSupportedNetworks, withdrawalSupportedNetworks, name, config, addWalletConnectWallet, allConnectors, connectAsync, isMobilePlatform, setSelectedConnector, disconnectWallet]) - - const connectedWalletsKey = [...config.state.connections.keys()].join('-') - - const resolvedConnectors: Wallet[] = useMemo(() => { - const connections = getConnections(config) - return connections.map((connection): Wallet | undefined => { - const wallet = ResolveWallet({ - activeConnection: (activeConnection?.id && activeConnection.address) ? { - id: activeConnection.id, - address: activeConnection.address - } : undefined, - connection, - disconnect: disconnectWallet, - networks, - supportedNetworks: { - asSource: asSourceSupportedNetworks, - autofill: autofillSupportedNetworks, - withdrawal: withdrawalSupportedNetworks - }, - providerName: name - }) - - return wallet - }).filter(w => w !== undefined) - }, [activeConnection, config, connectedWalletsKey, disconnectWallet, networks, asSourceSupportedNetworks, autofillSupportedNetworks, withdrawalSupportedNetworks, name]) - - const resolveWalletConnector = useCallback((wallet: Wallet) => { - const connections = getConnections(config) - return connections.find(c => c.connector.name === wallet.id)?.connector - ?? connections.find(c => - c.connector.id === HIDDEN_WALLETCONNECT_ID - && c.accounts.some(a => a.toLowerCase() === wallet.address.toLowerCase()) - )?.connector - }, [config]) - - const switchAccount = useCallback(async (wallet: Wallet, address: string) => { - const connector = resolveWalletConnector(wallet) - if (!connector) - throw new Error("Connector not found") - const { accounts } = await switchAccountAsync({ connector }) - const account = accounts.find(a => a.toLowerCase() === address.toLowerCase()) - if (!account) - throw new Error("Account not found") - setActiveAddress(account) - }, [resolveWalletConnector, switchAccountAsync]) - - const switchChain = async (wallet: Wallet, chainId: string | number) => { - const connector = resolveWalletConnector(wallet) - if (!connector) - throw new Error("Connector not found") - - if (connector?.switchChain) { - await connector.switchChain({ chainId: Number(chainId) }); - } else { - throw new Error("Switch chain method is not available on the connector"); - } - } - - const activeWallet = useMemo(() => resolvedConnectors.find(w => w.isActive), [resolvedConnectors]) - const providerIcon = useMemo(() => networks.find(n => ethereumNames.some(name => name === n.caip2Id))?.logoUrl, [networks]) - - const provider = useMemo(() => { - return { - connectWallet, - disconnectWallets, - switchAccount, - switchChain, - isNotAvailableCondition, - connectedWallets: resolvedConnectors, - activeWallet, - autofillSupportedNetworks, - withdrawalSupportedNetworks, - asSourceSupportedNetworks, - availableConnectors, - additionalConnectors, - name, - id, - providerIcon, - ready: allConnectors.length > 0, - requestAdditionalConnectors, - } - }, [connectWallet, disconnectWallets, switchAccount, switchChain, isNotAvailableCondition, resolvedConnectors, activeWallet, autofillSupportedNetworks, withdrawalSupportedNetworks, asSourceSupportedNetworks, availableConnectors, additionalConnectors, name, id, providerIcon, allConnectors.length, requestAdditionalConnectors]); - - return provider -} - - -type ResolveWalletProps = { - connection: { - accounts: readonly [`0x${string}`, ...`0x${string}`[]]; - chainId: number; - connector: Connector; - } | undefined, - networks: Network[], - activeConnection: { - id: string, - address: string - } | undefined, - disconnect: (connectorName: string) => Promise, - supportedNetworks: { - asSource: string[], - autofill: string[], - withdrawal: string[] - }, - providerName: string -} - -const ResolveWallet = (props: ResolveWalletProps): Wallet | undefined => { - const { activeConnection, connection, networks, disconnect, supportedNetworks, providerName } = props - const walletIsActive = activeConnection?.id === connection?.connector.id - const addresses = connection?.accounts as (string[] | undefined); - const activeAddress = activeConnection?.address - const connector = connection?.connector - if (!connector) - return undefined - const address = walletIsActive ? activeAddress : addresses?.[0] - if (!address) return undefined - - // Check if this is a dynamic wallet connected via hidden connector - const isHiddenConnector = connector.id === HIDDEN_WALLETCONNECT_ID - // Try address-based lookup first, fallback to pending metadata (for first connection) - const dynamicMetadata = isHiddenConnector - ? (getDynamicWalletMetadata(address) || getPendingDynamicWcMetadata(id)) - : null - - // Use dynamic metadata if available, otherwise use connector info - const walletName = dynamicMetadata?.name || connector.name - const walletId = dynamicMetadata?.id || connector.id - const walletIcon = dynamicMetadata?.icon || connector.icon - - const walletDisplayName = `${walletName} ${walletId === "com.immutable.passport" ? "" : " - EVM"}` - - const wallet: Wallet = { - id: walletName, - internalId: walletId, - isActive: walletIsActive, - address, - addresses: addresses || [address], - displayName: walletDisplayName, - providerName, - icon: resolveWalletConnectorIcon({ connector: evmConnectorNameResolver(connector), address, iconUrl: walletIcon }), - disconnect: () => disconnect(connector.name), - asSourceSupportedNetworks: resolveSupportedNetworks(supportedNetworks.asSource, walletId), - autofillSupportedNetworks: resolveSupportedNetworks(supportedNetworks.autofill, walletId), - withdrawalSupportedNetworks: resolveSupportedNetworks(supportedNetworks.withdrawal, walletId), - networkIcon: networks.find(n => ethereumNames.some(name => name === n.caip2Id))?.logoUrl, - metadata: { - deepLink: (connector as LSConnector).deepLink - } - } - - return wallet -} - -const resolveSupportedNetworks = (supportedNetworks: string[], connectorId: string) => { - - const specificNetworksConnectors = [ - { - id: "com.immutable.passport", - supportedNetworks: [ - ] - }, - { - id: "com.roninchain.wallet", - supportedNetworks: [ - KnownInternalNames.Networks.EthereumMainnet, - KnownInternalNames.Networks.BaseMainnet, - KnownInternalNames.Networks.ArbitrumMainnet - ] - }, - { - id: "app.phantom", - supportedNetworks: [ - KnownInternalNames.Networks.EthereumMainnet, - KnownInternalNames.Networks.BaseMainnet, - ] - } - ] - - const specificNetworks = specificNetworksConnectors.find(c => c.id === connectorId) - - if (specificNetworks) { - const values = specificNetworks.supportedNetworks.filter(n => supportedNetworks.some(name => name === n)) - return values - } - - return supportedNetworks - -} - -async function attemptGetAccount(config: Parameters[0], maxAttempts = 5) { - for (let attempt = 0; attempt < maxAttempts; attempt++) { - const account = getAccount(config); - - if (account.address) { - return account; - } - await sleep(500); - } - - return getAccount(config); -} -function dedupePreferInjected(arr: Connector[]) { - // Helper to strip off any prefix up to the last dot - const getBaseId = (id: string) => id.includes('.') ? id.split('.').pop()! : id; - - // Group items by normalized base‐id - const groups = arr.reduce[]>>((acc, obj) => { - const key = getBaseId(obj.name); - (acc[key] = acc[key] || []).push(obj); - return acc; - }, {}); - - // Within each group, if any are injected prefer them, otherwise keep all - return Object.values(groups).flatMap(group => { - const injected = group.filter(o => o.type === 'injected'); - return injected.length > 0 ? injected : group; - }); -} - -const isFeaturedRegistryWallet = (wallet: WalletConnectWalletBase) => ( - featuredWalletsIds.includes(wallet.id.toLowerCase()) - || featuredWalletsIds.some(featuredId => wallet.name.toLowerCase().includes(featuredId)) -) - -const splitRegistryConnectors = ( - configuredConnectors: InternalConnector[], - registryWallets: WalletConnectWalletBase[], - isMobilePlatform: boolean, - providerName: string -) => { - const existingConnectorKeys = new Set( - configuredConnectors.flatMap(connector => [connector.id.toLowerCase(), connector.name.toLowerCase()]) - ) - - return registryWallets.reduce<{ featured: RegistryConnector[], additional: RegistryConnector[] }>((acc, wallet) => { - if (existingConnectorKeys.has(wallet.id.toLowerCase()) || existingConnectorKeys.has(wallet.name.toLowerCase())) { - return acc - } - - const connector = createRegistryConnector(wallet, isMobilePlatform, providerName) - - if (isFeaturedRegistryWallet(wallet)) { - acc.featured.push(connector) - } else { - acc.additional.push(connector) - } - - return acc - }, { featured: [], additional: [] }) -} - -type DynamicWalletMetadata = DynamicWcMetadata - -const getDynamicWalletMetadata = (address: string) => getDynamicWcMetadata(id, address) -const setDynamicWalletMetadata = (address: string, metadata: DynamicWalletMetadata) => - setDynamicWcMetadata(id, address, metadata) - -// Adapts a wagmi `Connector` to the shared `DisplayUriSource` contract. -// Subscribes synchronously to the connector's emitter — wagmi connectors -// (including the custom one in ./connectors/resolveConnectors/walletConnect.ts) -// re-emit `display_uri` as a `message` event via `config.emitter.emit('message', -// { type: 'display_uri', data: uri })`. Registering synchronously avoids a race -// where `display_uri` fires before an async `getProvider()` resolves, which -// would leave the QR modal stuck in the `loading` state. -const wagmiDisplayUriSource = (connector: Connector): DisplayUriSource => ({ - onDisplayUri(listener) { - const handler = ({ type, data }: { type: string; data?: unknown }) => { - if (type === 'display_uri' && typeof data === 'string') listener(data) - } - connector.emitter.on('message', handler) - return () => { - try { connector.emitter.off('message', handler) } catch { /* noop */ } - } - }, -}) \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/Bako.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/Bako.ts deleted file mode 100644 index 40b3f27a..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/Bako.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { urlJoin } from "fuels"; - -export class BAKO_STATE { - static state: { last_req?: Date, data: boolean, req_count: number, period_start?: Date } = { data: false, req_count: 0 } - static period_durtion: number = 10_000 -} - -export class BakoRequestAPI { - baseUrl: string; - - constructor(baseUrl: string) { - this.baseUrl = baseUrl; - } - - async get(pathname: string) { - - if (!pathname.includes('/state')) { - const data = await fetch(urlJoin(this.baseUrl, pathname)).then((res) => - res.json(), - ); - return data; - } - - const period_elapsed = BAKO_STATE.state?.period_start && new Date().getTime() - BAKO_STATE.state?.period_start?.getTime() > BAKO_STATE.period_durtion; - const skip = BAKO_STATE.state?.last_req && new Date().getTime() - BAKO_STATE.state?.last_req?.getTime() < 1000 * 60 * 2 && period_elapsed; - - if (skip) - return BAKO_STATE.state?.data; - - const data = await fetch(urlJoin(this.baseUrl, pathname)).then((res) => - res.json(), - ); - const count = BAKO_STATE.state?.req_count || 0; - BAKO_STATE.state = { last_req: new Date(), data, req_count: count + 1, period_start: period_elapsed ? new Date() : BAKO_STATE.state?.period_start || new Date() }; - return data; - } - - async delete(pathname: string) { - await fetch(urlJoin(this.baseUrl, pathname), { - method: 'DELETE', - }); - } -} diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeConnector.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeConnector.ts deleted file mode 100644 index 8d046c06..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeConnector.ts +++ /dev/null @@ -1,394 +0,0 @@ -import { - type Asset, - type FuelABI, - FuelConnector, - FuelConnectorEventTypes, - type Network, - Provider, - type StartConsolidateCoins, - type StorageAbstract, - type TransactionRequestLike, -} from 'fuels'; - -import { BakoStorage } from './BakoSafeStorage'; -import { DAppWindow } from './DAPPWindow'; -import { SocketClient } from './SocketClient'; -import { - APP_DESCRIPTION, - APP_IMAGE_DARK, - APP_IMAGE_LIGHT, - APP_NAME, - APP_NETWORK, - APP_URL, - APP_VERSION, - HAS_WINDOW, - HOST_URL, - IS_SAFARI, - SESSION_ID, - WINDOW, -} from './constants'; -import { RequestAPI } from './request'; -import { - type BakoSafeConnectorConfig, - BakoSafeConnectorEvents, - type IResponseAuthConfirmed, - type IResponseTxCofirmed, -} from './types'; - -export class BakoSafeConnector extends FuelConnector { - name = APP_NAME; - metadata = { - image: { - light: APP_IMAGE_LIGHT, - dark: APP_IMAGE_DARK, - }, - install: { - action: APP_URL, - link: APP_URL, - description: APP_DESCRIPTION, - }, - }; - installed = !IS_SAFARI; - connected = false; - external = false; - - private readonly appUrl: string; - private readonly host: string; - private readonly api: RequestAPI; - private setupReady?: boolean; - private socket?: SocketClient; - private sessionId?: string; - private dAppWindow?: DAppWindow; - private storage?: StorageAbstract; - - constructor(config?: BakoSafeConnectorConfig) { - super(); - this.host = config?.host ?? HOST_URL; - this.appUrl = config?.appUrl ?? APP_URL; - this.api = config?.api ?? new RequestAPI(this.host); - this.storage = this.getStorage(config?.storage); - this.setupReady = false; - } - - // ============================================================ - // Bako Safe application specific methods - // ============================================================ - private getStorage(storage?: StorageAbstract) { - const _storage = storage ?? WINDOW.localStorage ?? new BakoStorage(); - if (!_storage) { - throw new Error('No storage provided'); - } - - return _storage; - } - - private async getSessionId() { - let sessionId: string = (await this.storage?.getItem(SESSION_ID)) || ''; - if (!sessionId) { - sessionId = crypto.randomUUID(); - await this.storage?.setItem(SESSION_ID, sessionId); - } - return sessionId; - } - - private checkWindow() { - // timeout to open - const openInterval = setInterval(() => { - const isOpen = this.dAppWindow?.isOpen; - if (!isOpen) { - this.emit(BakoSafeConnectorEvents.CLIENT_DISCONNECTED, {}); - clearInterval(openInterval); - } - }, 2000); - - // timeout to close - const interval = setInterval(() => { - const isOpen = this.dAppWindow?.opned?.closed; - if (isOpen) { - this.emit(BakoSafeConnectorEvents.CLIENT_DISCONNECTED, {}); - clearInterval(interval); - } - }, 300); - } - - /** - * [important] - * this.socket.emit -> emit message to the server - * this.emit -> emit message to the dApp client - */ - - private async setup() { - if (!HAS_WINDOW) return; - if (this.socket) this.socket.checkConnection(); - if (this.setupReady) return; - - this.setupReady = true; - - const sessionId = await this.getSessionId(); - this.sessionId = sessionId; - - this.socket = SocketClient.create({ - sessionId, - events: this, - }); - - this.dAppWindow = new DAppWindow({ - sessionId, - height: 800, - width: 450, - appUrl: this.appUrl, - request_id: this.socket.request_id, - }); - - await this.requestConnectionState(); - } - - private async requestConnectionState() { - return new Promise((resolve) => { - if (!this.socket) return; - - this.socket.server.emit(BakoSafeConnectorEvents.CONNECTION_STATE); - - this.socket.server.once( - BakoSafeConnectorEvents.CONNECTION_STATE, - async ({ data }: { data: boolean }) => { - this.connected = data; - this.emit(this.events.connection, data); - resolve(); - }, - ); - }); - } - - // ============================================================ - // Connector methods - // ============================================================ - async connect() { - await this.setup(); - - return new Promise((resolve, reject) => { - if (this.connected) { - resolve(true); - return; - } - - this.dAppWindow?.open('/', reject); - this.checkWindow(); - - this.once(BakoSafeConnectorEvents.CLIENT_DISCONNECTED, () => { - this.dAppWindow?.close(); - reject(false); - }); - - this.once( - BakoSafeConnectorEvents.AUTH_CONFIRMED, - async ({ data }: { data: IResponseAuthConfirmed }) => { - await this.requestConnectionState(); - - this.emit(this.events.accounts, await this.accounts()); - this.emit(this.events.currentAccount, await this.currentAccount()); - - this.dAppWindow?.close(); - resolve(data.connected); - }, - ); - }); - } - - /* - * @param {string} address - The address to sign the transaction - * @param {Transaction} transaction - The transaction to send - * - * @returns {string} - The transaction id - */ - async sendTransaction( - _address: string, - _transaction: TransactionRequestLike, - ) { - return new Promise((resolve, reject) => { - this.dAppWindow?.open('/dapp/transaction', reject); - this.checkWindow(); - - const onClientConnected = () => { - this.socket?.server.emit(BakoSafeConnectorEvents.TX_PENDING, { - _transaction, - _address, - }); - }; - - // @ts-ignore - this.on(BakoSafeConnectorEvents.CLIENT_CONNECTED, onClientConnected); - - this.once(BakoSafeConnectorEvents.CLIENT_DISCONNECTED, () => { - this.dAppWindow?.close(); - this.removeListener( - BakoSafeConnectorEvents.CLIENT_CONNECTED, - onClientConnected, - ); - reject(new Error('Client disconnected')); - }); - - this.once(BakoSafeConnectorEvents.TX_TIMEOUT, () => { - this.dAppWindow?.close(); - this.removeListener( - BakoSafeConnectorEvents.CLIENT_CONNECTED, - onClientConnected, - ); - reject(new Error('Transaction timeout')); - }); - - this.once( - BakoSafeConnectorEvents.TX_CONFIRMED, - ({ data }: { data: IResponseTxCofirmed }) => { - this.removeListener( - BakoSafeConnectorEvents.CLIENT_CONNECTED, - onClientConnected, - ); - this.dAppWindow?.close(); - resolve(data.id.startsWith('0x') ? data.id : `0x${data.id}`); - }, - ); - }); - } - - async selectNetwork(_network: Network): Promise { - return new Promise((resolve, reject) => { - this.dAppWindow?.open('/dapp/network', reject); - this.checkWindow(); - - const onClientConnected = () => { - this.socket?.server.emit(BakoSafeConnectorEvents.CHANGE_NETWORK, { - _network, - }); - }; - - // @ts-ignore - this.on(BakoSafeConnectorEvents.CLIENT_CONNECTED, onClientConnected); - - this.once(BakoSafeConnectorEvents.CLIENT_DISCONNECTED, () => { - this.dAppWindow?.close(); - this.removeListener( - BakoSafeConnectorEvents.CLIENT_CONNECTED, - onClientConnected, - ); - reject(new Error('Client disconnected')); - }); - - this.once(BakoSafeConnectorEvents.NETWORK_CHANGED, async () => { - const network = await this.currentNetwork(); - - this.emit(this.events.networks, [network]); - this.emit(this.events.currentNetwork, network); - - this.dAppWindow?.close(); - this.removeListener( - BakoSafeConnectorEvents.CLIENT_CONNECTED, - onClientConnected, - ); - - resolve(true); - }); - }); - } - - async ping() { - if (IS_SAFARI) { - return false; - } - await this.setup(); - return this.setupReady ?? false; - } - - async version() { - return { - app: APP_VERSION, - network: APP_NETWORK, - }; - } - - async isConnected() { - await this.setup(); - return this.connected; - } - - async accounts() { - const data = await this.api.get(`/connections/${this.sessionId}/accounts`); - - const acc = Array.isArray(data) ? data : []; - return acc; - } - - async currentAccount() { - const data = await this.api.get( - `/connections/${this.sessionId}/currentAccount`, - ); - - const isInvalid = data && JSON.stringify(data) === JSON.stringify({}); - - return isInvalid ? null : data; - } - - async disconnect() { - await this.api.delete(`/connections/${this.sessionId}`); - await this.requestConnectionState(); - this.emit(this.events.accounts, []); - this.emit(this.events.currentAccount, null); - return false; - } - - async currentNetwork(): Promise { - const data = await this.api.get( - `/connections/${this.sessionId}/currentNetwork`, - ); - - const provider = new Provider(data); - - return { - url: provider.url, - chainId: await provider.getChainId(), - }; - } - - async networks(): Promise> { - return [await this.currentNetwork()]; - } - - async assets(): Promise { - return []; - } - - async signMessage(_address: string, _message: string): Promise { - throw new Error('Method not implemented.'); - } - - async addAssets(_assets: Asset[]): Promise { - throw new Error('Method not implemented.'); - } - - async addAsset(_assets: Asset): Promise { - throw new Error('Method not implemented.'); - } - - async addNetwork(_networkUrl: string): Promise { - throw new Error('Method not implemented.'); - } - - async addABI(_contractId: string, _abi: FuelABI): Promise { - throw new Error('Method not implemented.'); - } - - async getABI(_id: string): Promise { - throw new Error('Method not implemented.'); - } - - async hasABI(_id: string): Promise { - throw new Error('Method not implemented.'); - } - - /** - * @inheritdoc - */ - async startConsolidation(opts: StartConsolidateCoins): Promise { - this.emit(FuelConnectorEventTypes.consolidateCoins, opts); - } -} diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeStorage.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeStorage.ts deleted file mode 100644 index b8000b59..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/BakoSafeStorage.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { StorageAbstract } from 'fuels'; - -export class BakoStorage extends StorageAbstract { - data: { [key: string]: string } = {}; - - async getItem(key: string): Promise { - return this.data[key]; - } - - async setItem(key: string, value: string): Promise { - this.data[key] = value; - - return; - } - - async removeItem(key: string): Promise { - delete this.data[key]; - } - - async clear(): Promise { - this.data = {}; - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/DAPPWindow.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/DAPPWindow.ts deleted file mode 100644 index 2e99a876..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/DAPPWindow.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { WINDOW } from './constants'; - -type PopupConfig = { - appUrl: string; - height: number; - width: number; - sessionId: string; - request_id: string; -}; - -export class DAppWindow { - isMobile: boolean = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); - isSafariBrowser: boolean = /^((?!chrome|android).)*safari/i.test( - navigator.userAgent, - ); - request_id: string; - isOpen = false; - opned: Window | null = null; - - constructor(private config: PopupConfig) { - this.request_id = config.request_id; - } - - private get popupConfig() { - const { height, width } = this.config; - return { - top: WINDOW.innerHeight / 2 - height / 2, - left: WINDOW.innerWidth / 2 - width / 2, - width, - height: - !this.isMobile && WINDOW.innerHeight >= height - ? height - : WINDOW.innerHeight, - }; - } - - open(method: string, reject: (e: Error) => void) { - if (this.isOpen) reject(new Error('Window is already open')); - - if (!this.isSafariBrowser) { - // if is not safari, we can use popup for both cases - this.makePopup(method); - } - // if (this.isSafariBrowser && isConnection) { - // // to use webauthn, we need a new WINDOW - // this.makeLink(method); - // } - if (this.isSafariBrowser) { - // && !isConnection) { - // to confirm tx, we need a new popup - this.makeFrame(method, true); - } - - return; - } - - close() { - const frame = document.getElementById(`${this.config.sessionId}-iframe`); - const backdrop = document.getElementById( - `${this.config.sessionId}-backdrop`, - ); - if (frame) document.body.removeChild(frame); - if (backdrop) document.body.removeChild(backdrop); - if (this.opned) this.opned.close(); - this.isOpen = false; - } - - makeLink(method: string) { - const link = `${this.config.appUrl}${method}${this.queryString}`; - const a = document.createElement('a'); - a.setAttribute('href', link); - a.setAttribute('target', '_blank'); - a.click(); - this.isOpen = true; - } - - makeFrame(method: string, isSafari = false) { - const w = this.small; - //bako frame - const frame = document.createElement('iframe'); - frame.id = `${this.config.sessionId}-iframe`; - frame.src = `${this.config.appUrl}${method}${this.queryString}${ - isSafari ? '&byConnector=true' : '' - }`; - frame.style.position = 'fixed'; - frame.style.zIndex = '99999999'; - frame.style.top = `${w.top}`; - frame.style.left = `${w.left}`; - frame.style.width = w.width; - frame.style.height = w.height; - frame.style.borderRadius = '16px'; - - //backdrop - const backdrop = document.createElement('div'); - backdrop.id = `${this.config.sessionId}-backdrop`; - backdrop.style.position = 'fixed'; - backdrop.style.top = '0'; - backdrop.style.left = '0'; - backdrop.style.width = '100%'; - backdrop.style.height = '100%'; - backdrop.style.backgroundColor = 'rgba(0,0,0,0.5)'; - backdrop.style.zIndex = '99999998'; - backdrop.addEventListener('click', () => this.close()); // if user click on backdrop, close the frame - - document.body.appendChild(backdrop); - document.body.appendChild(frame); - this.isOpen = true; - } - - makePopup(method: string) { - const link = `${this.config.appUrl}${method}${this.queryString}`; - const popup = WINDOW.open( - link, - 'popup', - `width=${this.popupConfig.width}, height=${this.popupConfig.height}, top=${this.popupConfig.top}, left=${this.popupConfig.left}`, - ); - if (popup) this.opned = popup; - this.isOpen = true; - return popup; - } - - private get queryString() { - const { sessionId } = this.config; - return `?sessionId=${sessionId}&origin=${WINDOW.location.origin}&name=${WINDOW.document.title}&request_id=${this.request_id}`; - } - - private get small() { - // todo: update this to calculate by screen size changes - const breakponint = { - md: { - top: 0, - left: 0, - limit: 650, - width: '100%', - height: '100%', - }, // 100% - lg: { - top: `${(WINDOW.innerHeight - WINDOW.innerHeight * 0.7) / 2}px`, - left: `${(WINDOW.innerWidth - WINDOW.innerWidth * 0.5) / 2}px`, - limit: 1024, - width: '50%', - height: '70%', - }, // 75% - xl: { - top: `${(WINDOW.innerHeight - 650) / 2}px`, - left: `${(WINDOW.innerWidth - 500) / 2}px`, - limit: 1440, - height: '650px', - width: '500px', - }, // 400px - }; - return WINDOW.innerWidth < breakponint.md.limit - ? breakponint.md - : WINDOW.innerWidth < breakponint.lg.limit - ? breakponint.lg - : breakponint.xl; - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/SocketClient.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/SocketClient.ts deleted file mode 100644 index 96a4150d..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/SocketClient.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { type Socket, io } from 'socket.io-client'; -import type { BakoSafeConnector } from './BakoSafeConnector'; -import { APP_URL, SOCKET_URL } from './constants'; -import { WINDOW } from './constants'; -import { - BakoSafeConnectorEvents, - BakoSafeUsernames, - type ICreateClientSocket, - type IResponseAuthConfirmed, - type IResponseTxCofirmed, - type ISocketAuth, - type ISocketMessage, -} from './types'; - -const DEFAULT_SOCKET_AUTH: Omit = { - username: BakoSafeUsernames.CONNECTOR, - data: new Date(), - origin: WINDOW.origin ?? APP_URL, -}; - -export class SocketClient { - private static instance: SocketClient | null = null; - private connecting = false; - server: Socket; - events: BakoSafeConnector; - request_id: string; - - private constructor({ sessionId, events }: ICreateClientSocket) { - this.request_id = crypto.randomUUID(); - - this.server = io(SOCKET_URL, { - auth: { - ...DEFAULT_SOCKET_AUTH, - sessionId, - request_id: this.request_id, - }, - autoConnect: false, - reconnection: true, - reconnectionAttempts: 5, - reconnectionDelay: 1000, - }); - - this.events = events; - this.setupEventListeners(); - this.connect(); - } - - private setupEventListeners(): void { - this.server.on('connect', () => { - this.connecting = false; - }); - - this.server.on('connect_error', () => { - this.connecting = false; - }); - - this.server.on( - BakoSafeConnectorEvents.DEFAULT, - (data: ISocketMessage) => { - if (data.to === DEFAULT_SOCKET_AUTH.username) { - this.events.emit(data.type, { - from: data.username, - data: data.data, - }); - } - }, - ); - } - - static create(options: ICreateClientSocket) { - if (!SocketClient.instance) { - SocketClient.instance = new SocketClient(options); - } - - return SocketClient.instance; - } - - connect(): void { - if (this.isConnected || this.connecting) return; - - this.connecting = true; - this.server.connect(); - } - - get isConnected(): boolean { - return this.server.connected; - } - - checkConnection(): void { - if (this.isConnected || this.connecting) return; - this.connect(); - } -} diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/constants.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/constants.ts deleted file mode 100644 index 6df2bacd..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/constants.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const APP_VERSION = '0.0.0'; -export const APP_NETWORK = '0.0.0'; -export const APP_NAME = 'Bako Safe'; -export const APP_DESCRIPTION = - 'Bako Safe is a connector to safe.bako.global, a non-custodial vault for your crypto assets.'; -export const APP_IMAGE_DARK = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEzMjQ5XzE2MjI4MCkiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzMjQ5XzE2MjI4MCkiPgo8cGF0aCBkPSJNMTMgMjUuOTE2N0wzNyAzNy44NjcxTDI1LjAwMjQgMTguOTg5M0wxMyAyNS45MTY3WiIgZmlsbD0iI0Y1RjVGNSIvPgo8cGF0aCBkPSJNMzMuODg2NCAyMi4yMTgyTDI0Ljk5NzYgMTcuMDg2NVY1LjEzNTc0TDEzIDEyLjA2MjhWMjUuOTE2TDI0Ljk5NzYgMTguOTg4OVYzMC45Mzk2TDEzIDM3Ljg2NjhMMjQuOTk3NiA0NC43OTM4TDM2Ljk5NTIgMzcuODY2OFYyNy42MDMzQzM2Ljk5NTIgMjUuMzgxNiAzNS44MDk4IDIzLjMyOTEgMzMuODg2NCAyMi4yMTgyWiIgZmlsbD0iIzFFMUYyMiIvPgo8L2c+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMTMyNDlfMTYyMjgwIiB4MT0iMCIgeTE9IjAiIHgyPSI1Mi4zMjg1IiB5Mj0iNDcuNDMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkMwMTAiLz4KPHN0b3Agb2Zmc2V0PSIwLjQ4IiBzdG9wLWNvbG9yPSIjRUJBMzEyIi8+CjxzdG9wIG9mZnNldD0iMC43MSIgc3RvcC1jb2xvcj0iI0QzODAxNSIvPgo8c3RvcCBvZmZzZXQ9IjAuOTkiIHN0b3AtY29sb3I9IiNCMjRGMTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMzI0OV8xNjIyODAiPgo8cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iNDAiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMyA1KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo='; -export const APP_IMAGE_LIGHT = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEzMjQ5XzE2MjI4MCkiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzMjQ5XzE2MjI4MCkiPgo8cGF0aCBkPSJNMTMgMjUuOTE2N0wzNyAzNy44NjcxTDI1LjAwMjQgMTguOTg5M0wxMyAyNS45MTY3WiIgZmlsbD0iI0Y1RjVGNSIvPgo8cGF0aCBkPSJNMzMuODg2NCAyMi4yMTgyTDI0Ljk5NzYgMTcuMDg2NVY1LjEzNTc0TDEzIDEyLjA2MjhWMjUuOTE2TDI0Ljk5NzYgMTguOTg4OVYzMC45Mzk2TDEzIDM3Ljg2NjhMMjQuOTk3NiA0NC43OTM4TDM2Ljk5NTIgMzcuODY2OFYyNy42MDMzQzM2Ljk5NTIgMjUuMzgxNiAzNS44MDk4IDIzLjMyOTEgMzMuODg2NCAyMi4yMTgyWiIgZmlsbD0iIzFFMUYyMiIvPgo8L2c+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMTMyNDlfMTYyMjgwIiB4MT0iMCIgeTE9IjAiIHgyPSI1Mi4zMjg1IiB5Mj0iNDcuNDMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkMwMTAiLz4KPHN0b3Agb2Zmc2V0PSIwLjQ4IiBzdG9wLWNvbG9yPSIjRUJBMzEyIi8+CjxzdG9wIG9mZnNldD0iMC43MSIgc3RvcC1jb2xvcj0iI0QzODAxNSIvPgo8c3RvcCBvZmZzZXQ9IjAuOTkiIHN0b3AtY29sb3I9IiNCMjRGMTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMzI0OV8xNjIyODAiPgo8cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iNDAiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMyA1KSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo='; - -export const APP_URL = 'https://safe.bako.global'; -export const HOST_URL = 'https://api.bako.global'; -export const SOCKET_URL = 'https://api.bako.global'; - -// Window object -export const HAS_WINDOW = typeof window !== 'undefined'; -// biome-ignore lint/suspicious/noExplicitAny: -export const WINDOW: any = HAS_WINDOW ? window : {}; -export const IS_SAFARI = /^((?!chrome|android).)*safari/i.test( - WINDOW.navigator?.userAgent ?? '', -); -//storage -export const SESSION_ID = 'sessionId'; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/index.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/index.ts deleted file mode 100644 index 0e6ed6ca..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './BakoSafeConnector'; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/request.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/request.ts deleted file mode 100644 index 1a3353c2..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/request.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { urlJoin } from 'fuels'; - -export class RequestAPI { - baseUrl: string; - - constructor(baseUrl: string) { - this.baseUrl = baseUrl; - } - - async get(pathname: string) { - const data = await fetch(urlJoin(this.baseUrl, pathname)).then((res) => - res.json(), - ); - return data; - } - - async delete(pathname: string) { - await fetch(urlJoin(this.baseUrl, pathname), { - method: 'DELETE', - }); - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/types.ts b/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/types.ts deleted file mode 100644 index e4ac0234..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/bako-safe/types.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type { StorageAbstract, TransactionRequestLike } from 'fuels'; -import type { BakoSafeConnector } from './BakoSafeConnector'; -import type { RequestAPI } from './request'; - -export enum BakoSafeConnectorEvents { - //default - DEFAULT = 'message', - - //client - CLIENT_DISCONNECTED = '[CLIENT_DISCONNECTED]', - CLIENT_CONNECTED = '[CONNECTED]', - - //transactions - TX_PENDING = '[TX_EVENT_REQUESTED]', - TX_CONFIRMED = '[TX_EVENT_CONFIRMED]', - TX_TIMEOUT = '[TX_EVENT_TIMEOUT]', - - //switchNetwork - CHANGE_NETWORK = '[CHANGE_NETWORK]', - NETWORK_CHANGED = '[NETWORK_CHANGED]', - - //auth - AUTH_CONFIRMED = '[AUTH_CONFIRMED]', - - CONNECTION_STATE = '[CONNECTION_STATE]', - DISCONNECT = '[DISCONNECT]', -} - -export enum BakoSafeUsernames { - CONNECTOR = '[CONNECTOR]', - CLIENT = '[UI]', - SERVER = '[API]', -} - -export type BakoSafeConnectorConfig = { - host?: string; - appUrl?: string; - storage?: StorageAbstract; - api?: RequestAPI; -}; - -export interface ISocketAuth { - username: string; - data: Date; - origin: string; - sessionId: string; -} - -export interface ISocketMessage { - username: BakoSafeUsernames; - room: string; - to: BakoSafeUsernames; - type: BakoSafeConnectorEvents; - data: T; -} - -export interface ICreateClientSocket { - sessionId: string; - events: BakoSafeConnector; -} - -export interface IRequestTxPending { - _transaction: TransactionRequestLike; - _address: string; -} - -export interface IResponseTxCofirmed { - id: string; -} - -export interface IResponseAuthConfirmed { - connected: boolean; -} \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/FuelWalletConnector.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/FuelWalletConnector.ts deleted file mode 100644 index 07e4479f..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/FuelWalletConnector.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { - Address, - type Asset, - type AssetFuel, - type ConnectorMetadata, - type FuelABI, - FuelConnector, - FuelConnectorEventType, - FuelConnectorEventTypes, - type Network, - Provider, - type SelectNetworkArguments, - type TransactionRequestLike, - type Version, - transactionRequestify, - } from 'fuels'; - import type { JSONRPCRequest } from 'json-rpc-2.0'; - import { JSONRPCClient } from 'json-rpc-2.0'; - - import { - APP_IMAGE, - CONNECTOR_SCRIPT, - CONTENT_SCRIPT_NAME, - EVENT_MESSAGE, - } from './constants'; - import { - type CommunicationMessage, - type EventMessage, - MessageTypes, - type ResponseMessage, - } from './types'; - - export class FuelWalletConnector extends FuelConnector { - name = ''; - connected = false; - installed = false; - external = false; - events = FuelConnectorEventTypes; - metadata: ConnectorMetadata = { - image: APP_IMAGE, - install: { - action: 'Install', - description: - 'To connect your Fuel Wallet, install the browser extension.', - link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok', - }, - }; - - readonly client: JSONRPCClient; - - constructor(name = 'Fuel Wallet') { - super(); - this.name = name; - this.setMaxListeners(100); - this.client = new JSONRPCClient( - this.sendRequest.bind(this), - this.createRequestId, - ); - this.setupListener(); - this.setupConnector(); - } - - /** - * ============================================================ - * Application communication methods - * ============================================================ - */ - private async setupConnector() { - if (typeof window !== 'undefined') { - this.ping() - .then(() => { - window.dispatchEvent( - new CustomEvent(FuelConnectorEventType, { detail: this }), - ); - }) - .catch(() => {}); - } - } - - private acceptMessage(message: MessageEvent): boolean { - const { data: event } = message; - return ( - message.origin === window.origin && - event.type !== MessageTypes.request && - event.connectorName === this.name && - event.target === CONNECTOR_SCRIPT - ); - } - - private setupListener() { - if (typeof window === 'undefined') return; - window.addEventListener(EVENT_MESSAGE, this.onMessage.bind(this)); - } - - private createRequestId(): string { - return crypto.randomUUID(); - } - - private postMessage(message: CommunicationMessage, origin?: string) { - window.postMessage(message, origin || window.origin); - } - - private async sendRequest(request: JSONRPCRequest | null) { - if (!request) return; - this.postMessage({ - type: MessageTypes.request, - target: CONTENT_SCRIPT_NAME, - connectorName: this.name, - request, - }); - } - - private onResponse(message: ResponseMessage): void { - this.client.receive(message.response); - } - - private onEvent(message: EventMessage): void { - message.events.forEach((eventData) => { - if (eventData.event === 'start') { - this.setupConnector(); - } else { - this.emit(eventData.event, ...eventData.params); - } - }); - } - - private onMessage = (message: MessageEvent) => { - const messageFroze = Object.freeze(message); - if (!this.acceptMessage(messageFroze)) return; - const { data: event } = messageFroze; - this.onCommunicationMessage(event); - }; - - private onCommunicationMessage = (message: CommunicationMessage) => { - switch (message.type) { - case MessageTypes.response: - this.onResponse(message); - break; - case MessageTypes.event: - this.onEvent(message); - break; - default: - } - }; - - /** - * ============================================================ - * Connector methods - * ============================================================ - */ - async ping(): Promise { - return this.client.timeout(800).request('ping', {}); - } - - async isConnected(): Promise { - // If the wallet not exists or not connected, return false - try { - return await this.client.request('isConnected', {}); - } catch { - return false; - } - } - - async connect(): Promise { - return this.client.request('connect', {}); - } - - async disconnect(): Promise { - return this.client.request('disconnect', {}); - } - - async accounts(): Promise> { - const accounts = await this.client.request('accounts', {}); - return accounts; - } - - async currentAccount(): Promise { - const account = await this.client.request('currentAccount', {}); - if (!account) return null; - return Address.fromDynamicInput(account).toString(); - } - - async signMessage(address: string, message: string): Promise { - if (!message.trim()) { - throw new Error('Message is required'); - } - return this.client.request('signMessage', { - address, - message, - }); - } - - async sendTransaction( - address: string, - transaction: TransactionRequestLike, - ): Promise { - if (!transaction) { - throw new Error('Transaction is required'); - } - // Transform transaction object to a transaction request - const txRequest = transactionRequestify(transaction); - - /** - * @todo We should remove this once the chainId standard start to be used and chainId is required - * to be correct according to the network the transaction wants to target. - */ - const network = await this.currentNetwork(); - const provider = { - url: network.url, - }; - - return this.client.request('sendTransaction', { - address, - transaction: JSON.stringify(txRequest), - provider, - }); - } - - async assets(): Promise> { - return this.client.request('assets', {}); - } - - async addAsset(asset: Asset): Promise { - return this.addAssets([asset]); - } - - async addAssets(assets: Asset[]): Promise { - /** - * @todo: Remove this once Fuel Wallet supports assets with multiple networks - */ - const assetsData = assets.map((asset) => { - const fuelNetworkAsset = asset.networks.find( - (n) => n.type === 'fuel', - ) as AssetFuel; - if (!fuelNetworkAsset) { - throw new Error('Asset for Fuel Network not found!'); - } - return { - ...asset, - imageUrl: asset.icon, - decimals: fuelNetworkAsset.decimals, - assetId: fuelNetworkAsset.assetId, - }; - }); - return this.client.request('addAssets', { - assets: assetsData, - }); - } - - async addABI(contractId: string, abi: FuelABI): Promise { - return this.client.request('addAbi', { - abiMap: { - [contractId]: abi, - }, - }); - } - - async getABI(contractId: string): Promise { - return this.client.request('getAbi', { - contractId, - }); - } - - async hasABI(contractId: string): Promise { - const abi = await this.getABI(contractId); - return !!abi; - } - - async currentNetwork(): Promise { - return this.client.request('network', {}); - } - - async selectNetwork(network: SelectNetworkArguments): Promise { - return this.client.request('selectNetwork', { - network, - }); - } - - async networks(): Promise { - return this.client.request('networks', {}); - } - - async addNetwork(networkUrl: string): Promise { - /** - * @todo: Remove fetch provider once Fuel Wallet supports adding networks - * by URL - */ - const provider = new Provider(networkUrl); - return this.client.request('addNetwork', { - network: { - url: provider.url, - name: (await provider.getChain()).name, - }, - }); - } - - async version(): Promise { - return this.client.request('version', { - app: '0.0.0', - network: '0.0.0', - }); - } - } \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/constants.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/constants.ts deleted file mode 100644 index e2b876a2..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/constants.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const CONNECTOR_SCRIPT = 'FuelConnectorScript'; -export const CONTENT_SCRIPT_NAME = 'FuelContentScript'; -export const EVENT_MESSAGE = 'message'; - -export const APP_IMAGE = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0OTEgNDk2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRoZW1lPSJkYXJrIj48dGl0bGU+RnVlbCBXYWxsZXQgSWNvbjwvdGl0bGU+PHJlY3QgeD0iNDIuNTUzNSIgeT0iMjguMzQzOCIgd2lkdGg9IjM5Ny4xNTQiIGhlaWdodD0iNDI1LjE0MyIgZmlsbD0iIzA4MDgwOCI+PC9yZWN0PjxwYXRoIGQ9Ik0zMi42MTc4IDBDMTQuNTY5NyAwIDAgMTQuNzMyNyAwIDMyLjk4MjZWNDk2SDQwNS44NTJDNDE5LjU2OCA0OTYgNDMyLjc1OSA0OTAuNDkyIDQ0Mi40NzMgNDgwLjY3TDQ3NS4zNTMgNDQ3LjQyMkM0ODUuMDY2IDQzNy42IDQ5MC41MTMgNDI0LjI2MSA0OTAuNTEzIDQxMC4zOTFWMEgzMi42MTc4Wk0zMjAuMjcxIDYzLjc3NTJMMTYwLjcyNiAyMjUuMTA1QzE1Ni43ODggMjI5LjA4NiAxNTEuNDA3IDIzMS4zNDMgMTQ1LjgyOCAyMzEuMzQzQzEzNy42OSAyMzEuMzQzIDEzMC4yMDggMjI2LjU2NSAxMjYuNzMgMjE5LjEzMkw2NC45MDc0IDg3LjAwMjRDNTkuODUzOSA3Ni4xODUyIDY3LjY2MzggNjMuNzc1MiA3OS40NzcxIDYzLjc3NTJIMzIwLjI3MVpNNjMuMDY5NyA0MzIuMjI1VjI3NS4yNzVDNjMuMDY5NyAyNjYuOTE0IDY5Ljc2MzkgMjYwLjE0NSA3OC4wMzMyIDI2MC4xNDVIMjMzLjI0Nkw2My4wNjk3IDQzMi4yMjVaTTI0Ni4xMSAyMzEuMzQzSDE5NC43MjJMMzQ5LjM0NSA3NC45OTA2QzM1Ni40MzMgNjcuODIzNCAzNjYuMDggNjMuNzc1MiAzNzYuMTIxIDYzLjc3NTJINDI3LjUwOUwyNzIuODg3IDIyMC4xMjdDMjY1Ljc5OSAyMjcuMjk1IDI1Ni4xNTEgMjMxLjM0MyAyNDYuMTEgMjMxLjM0M1oiIGZpbGw9IiMwMEY1OEMiPjwvcGF0aD48L3N2Zz4='; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/index.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/index.ts deleted file mode 100644 index c105d1e1..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './constants'; -export { FuelWalletConnector } from './FuelWalletConnector'; -export * from './types'; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/types.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/types.ts deleted file mode 100644 index 9da73f87..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuel-wallet/types.ts +++ /dev/null @@ -1,62 +0,0 @@ -import type { JSONRPCRequest, JSONRPCResponse } from 'json-rpc-2.0'; - -export enum MessageTypes { - ping = 'ping', - uiEvent = 'uiEvent', - event = 'event', - request = 'request', - response = 'response', - removeConnection = 'removeConnection', -} - -export interface MessageSender { - id?: string | undefined; - origin?: string | undefined; - tab?: { - id?: number | undefined; - index?: number | undefined; - windowId?: number | undefined; - url?: string | undefined; - title?: string | undefined; - favIconUrl?: string | undefined; - }; -} - -type BaseEvent = { - readonly target: string; - readonly connectorName?: string; - readonly id?: string; - readonly sender?: MessageSender; -} & T; - -export type EventMessageEvents = Array<{ - event: string; - params: Array; -}>; - -export type UIEventMessage = BaseEvent<{ - readonly type: MessageTypes.uiEvent; - readonly ready: boolean; - readonly session: string; -}>; - -export type RequestMessage = BaseEvent<{ - readonly type: MessageTypes.request; - readonly request: JSONRPCRequest; -}>; - -export type ResponseMessage = BaseEvent<{ - readonly type: MessageTypes.response; - readonly response: JSONRPCResponse; -}>; - -export type EventMessage = BaseEvent<{ - readonly type: MessageTypes.event; - readonly events: T; -}>; - -export type CommunicationMessage = - | UIEventMessage - | RequestMessage - | ResponseMessage - | EventMessage; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/FueletWalletConnector.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/FueletWalletConnector.ts deleted file mode 100644 index bd0c33d8..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/FueletWalletConnector.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { ConnectorMetadata } from 'fuels'; -import { APP_IMAGE_DARK, APP_IMAGE_LIGHT } from './constants'; -import { FuelWalletConnector } from '../fuel-wallet'; - -export class FueletWalletConnector extends FuelWalletConnector { - name = 'Fuelet Wallet'; - metadata: ConnectorMetadata = { - image: { - light: APP_IMAGE_LIGHT, - dark: APP_IMAGE_DARK, - }, - install: { - action: 'Install', - description: 'Install Fuelet Wallet in order to connect it.', - link: 'https://fuelet.app/download/', - }, - }; - - constructor() { - super('Fuelet Wallet'); - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/constants.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/constants.ts deleted file mode 100644 index 8276ecfe..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const APP_IMAGE_DARK = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RnVlbGV0IEljb248L3RpdGxlPjxwYXRoIGQ9Ik0yMCA0MEMxNC45MzU1IDQwIDEwLjMxNDUgMzguMTE0IDYuNzkwNSAzNS4wMTA1TDE4LjE0NiAyNi45MDdDMTguODQ1IDI2LjQwODUgMTkuODA2NSAyNi45NjQ1IDE5LjcyMiAyNy44MTk1TDE5LjI3NDUgMzIuMzYwNUMxOS4xODIgMzMuMjk1IDIwLjMxMjUgMzMuODI5NSAyMC45NzY1IDMzLjE2NTVMMjcuMDcxIDI3LjA3MUMzMS4wNjIgMjMuMDggMzAuOTc0NSAxNi41NTU1IDI2LjgwODUgMTIuNjc1NUMyMi44NDA1IDguOTggMTYuNTkzNSA5LjI2NCAxMi43NTk1IDEzLjA5ODVMNi44NTMgMTkuMDA0NUM2LjE4NyAxOS42NzEgNi43Mjc1IDIwLjgwNDUgNy42NjQ1IDIwLjcwNjVMMTIuMjA5IDIwLjIzMUMxMy4wNjU1IDIwLjE0MTUgMTMuNjI3NSAyMS4xMDUgMTMuMTI3IDIxLjgwNjVMNC45ODk1IDMzLjIwOTVDMS44ODYgMjkuNjg1NSAwIDI1LjA2NDUgMCAyMEMwIDguOTU0NSA4Ljk1NDUgMCAyMCAwQzMxLjA0NTUgMCA0MCA4Ljk1NDUgNDAgMjBDNDAgMzEuMDQ1NSAzMS4wNDU1IDQwIDIwIDQwWiIgZmlsbD0id2hpdGUiPjwvcGF0aD48L3N2Zz4='; -export const APP_IMAGE_LIGHT = - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RnVlbGV0IEljb248L3RpdGxlPjxwYXRoIGQ9Ik0yMCA0MEMxNC45MzU1IDQwIDEwLjMxNDUgMzguMTE0IDYuNzkwNSAzNS4wMTA1TDE4LjE0NiAyNi45MDdDMTguODQ1IDI2LjQwODUgMTkuODA2NSAyNi45NjQ1IDE5LjcyMiAyNy44MTk1TDE5LjI3NDUgMzIuMzYwNUMxOS4xODIgMzMuMjk1IDIwLjMxMjUgMzMuODI5NSAyMC45NzY1IDMzLjE2NTVMMjcuMDcxIDI3LjA3MUMzMS4wNjIgMjMuMDggMzAuOTc0NSAxNi41NTU1IDI2LjgwODUgMTIuNjc1NUMyMi44NDA1IDguOTggMTYuNTkzNSA5LjI2NCAxMi43NTk1IDEzLjA5ODVMNi44NTMgMTkuMDA0NUM2LjE4NyAxOS42NzEgNi43Mjc1IDIwLjgwNDUgNy42NjQ1IDIwLjcwNjVMMTIuMjA5IDIwLjIzMUMxMy4wNjU1IDIwLjE0MTUgMTMuNjI3NSAyMS4xMDUgMTMuMTI3IDIxLjgwNjVMNC45ODk1IDMzLjIwOTVDMS44ODYgMjkuNjg1NSAwIDI1LjA2NDUgMCAyMEMwIDguOTU0NSA4Ljk1NDUgMCAyMCAwQzMxLjA0NTUgMCA0MCA4Ljk1NDUgNDAgMjBDNDAgMzEuMDQ1NSAzMS4wNDU1IDQwIDIwIDQwWiIgZmlsbD0iIzI4MjgyRiI+PC9wYXRoPjwvc3ZnPg=='; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/index.ts b/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/index.ts deleted file mode 100644 index fa048585..00000000 --- a/apps/app/lib/wallets/fuel/lib/connectors/fuelet-wallet/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { FueletWalletConnector } from './FueletWalletConnector'; \ No newline at end of file diff --git a/apps/app/lib/wallets/fuel/useFuel.ts b/apps/app/lib/wallets/fuel/useFuel.ts deleted file mode 100644 index a3081623..00000000 --- a/apps/app/lib/wallets/fuel/useFuel.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { - useConnectors, - useFuel as useGlobalFuel, -} from '@fuels/react'; -import { - FuelConnector, - FuelConnectorEventTypes, - Address, -} from 'fuels'; -import { resolveWalletConnectorIcon } from "../utils/resolveWalletIcon"; -import { InternalConnector, Wallet, WalletProvider } from "@/Models/WalletProvider"; -import { useEffect, useMemo } from "react"; -import { useSettingsState } from "@/context/settings"; -import { BAKO_STATE } from "./lib/connectors/bako-safe/Bako"; -import sleep from "../utils/sleep"; -import { useWalletStore } from "@/stores/walletStore"; -import { NetworkTypes } from "@/Models/Network"; - -const name = 'Fuel' -const id = 'fuel' - -export default function useFuel(): WalletProvider { - const { connectors } = useConnectors() - const { fuel } = useGlobalFuel() - const { networks } = useSettingsState() - const commonSupportedNetworks = useMemo( - () => networks - .filter(network => network.networkType === NetworkTypes.Fuel) - .map(network => network.caip2Id) - .filter((caip2Id): caip2Id is string => - typeof caip2Id === 'string' && caip2Id.length > 0 - ), - [networks], - ) - - const wallets = useWalletStore((state) => state.connectedWallets) - const addWallet = useWalletStore((state) => state.connectWallet) - const removeWallet = useWalletStore((state) => state.disconnectWallet) - const connectedWallets = wallets.filter(wallet => wallet.providerName === name) - - const connectWallet = async ({ connector }: { connector: InternalConnector }) => { - const attemptConnection = async (isRetry: boolean = false): Promise => { - try { - - const fuelConnector = connectors.find(w => w.name === connector.name) - - BAKO_STATE.state.last_req = undefined - BAKO_STATE.period_durtion = 120_000 - await fuelConnector?.connect() - - const addresses = (await fuelConnector?.accounts())?.map(a => new Address(a).toB256()) - - if (addresses?.length && fuelConnector) { - - const result = await resolveFuelWallet({ - address: addresses[0], - addresses: addresses, - connector: fuelConnector, - disconnectWallet, - name, - commonSupportedNetworks, - networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.caip2Id))?.logoUrl - }) - - addWallet(result) - await switchAccount(result) - return result - } - - } - catch (e) { - // For Bako Safe, retry once if error is 'false' (connection timeout/user closed popup) - if (connector.name === 'Bako Safe' && e === false && !isRetry) { - console.log('Bako Safe connection failed with false, retrying once...') - await sleep(1000) - return await attemptConnection(true) - } - console.log(e) - throw e instanceof Error ? e : new Error(String(e)) - } - } - - return await attemptConnection() - } - - const disconnectWallet = async (connectorName: string) => { - try { - const fuelConnector = connectors.find(c => c.name === connectorName) - - if (!fuelConnector) throw new Error('Connector not found') - - await fuelConnector.disconnect() - } - catch (e) { - console.log(e) - } finally { - removeWallet(name, connectorName) - } - } - - const disconnectWallets = async () => { - try { - BAKO_STATE.state.last_req = undefined - BAKO_STATE.period_durtion = 10_000 - for (const connector of connectors.filter(c => c.connected)) { - await connector.disconnect() - removeWallet(name) - } - } - catch (e) { - console.log(e) - } - } - - const switchAccount = async (wallet: Wallet) => { - try { - const res = await fuel.selectConnector(wallet.id) - - if (!res) throw new Error('Could not switch account') - } catch (e) { - console.log(e) - } - } - - const switchChain = async (connector: Wallet, chainId: string | number) => { - try { - const fuelConnector = connectors.find(c => c.name === connector.id) - - if (!fuelConnector) throw new Error('Connector not found') - - const res = await fuelConnector.selectNetwork({ chainId: Number(chainId) }) - - if (!res) throw new Error('Could not switch chain') - } catch (e) { - console.log(e) - } - } - - const connectedConnectors = useMemo(() => connectors.filter(w => w.connected), [connectors]) - - useEffect(() => { - (async () => { - resolveWallet() - })() - }, [connectedConnectors]) - - const resolveWallet = async () => { - for (const connector of connectedConnectors) { - try { - const addresses = (await connector.accounts()).map(a => Address.fromAddressOrString(a).toB256()) - if (connector.connected && addresses.length > 0) { - const w = await resolveFuelWallet({ - address: addresses?.[0], - addresses, - connector, - disconnectWallet, - name, - commonSupportedNetworks: commonSupportedNetworks, - networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.caip2Id))?.logoUrl - }) - addWallet(w) - } - - } catch (e) { - console.log(e) - } - } - }; - - useEffect(() => { - const disposers = connectors.map((c) => { - const handler = async () => { - await resolveWallet() - }; - - c.on(FuelConnectorEventTypes.currentNetwork, handler); - return { connector: c, handler }; - }); - - return () => { - disposers.forEach(({ connector, handler }) => { - connector.off(FuelConnectorEventTypes.currentNetwork, handler); - }); - }; - }, [connectors]); - - const availableConnectors: InternalConnector[] = connectors.map(c => { - const isInstalled = c.installed && !('dAppWindow' in c) - return { - name: c.name, - id: c.name, - type: isInstalled ? 'injected' : 'other', - installUrl: c.metadata.install.link, - extensionNotFound: !c.installed, - providerName: name - } - }) - - const provider: WalletProvider = { - connectWallet, - disconnectWallets, - switchAccount, - switchChain, - availableConnectors, - autofillSupportedNetworks: commonSupportedNetworks, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - activeWallet: connectedWallets?.[0], - connectedWallets, - name, - id, - ready: connectors.length > 0 - } - - return provider -} - -type ResolveWalletProps = { - address: string, - addresses: string[], - connector: FuelConnector, - disconnectWallet: (connectorName: string) => Promise, - name: string, - commonSupportedNetworks: string[], - networkIcon?: string, -} - -const resolveFuelWallet = async ({ address, addresses, commonSupportedNetworks, connector, disconnectWallet, name, networkIcon }: ResolveWalletProps) => { - const network = await connector.currentNetwork() - const chainId = network.chainId ?? (network.url.toLowerCase().includes('testnet') ? 0 : 9889) - - const w: Wallet = { - id: connector.name, - address: address, - addresses: addresses, - isActive: true, - chainId: chainId, - disconnect: () => disconnectWallet(connector.name), - displayName: `${connector.name} - Fuel`, - providerName: name, - icon: resolveWalletConnectorIcon({ connector: connector.name, address: address, iconUrl: typeof connector.metadata.image === 'string' ? connector.metadata.image : (connector.metadata.image?.light.startsWith('data:') ? connector.metadata.image.light : `data:image/svg+xml;base64,${connector.metadata.image && btoa(connector.metadata.image.light)}`) }), - autofillSupportedNetworks: commonSupportedNetworks, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - networkIcon - } - - return w -} diff --git a/apps/app/lib/wallets/layerswap/getLayerswapProviders.ts b/apps/app/lib/wallets/layerswap/getLayerswapProviders.ts new file mode 100644 index 00000000..324041f0 --- /dev/null +++ b/apps/app/lib/wallets/layerswap/getLayerswapProviders.ts @@ -0,0 +1,99 @@ +import type { Config } from "wagmi"; +import { createEVMProvider } from "@layerswap/wallet-evm/base"; +import type { WalletProvider, WalletProviderDescriptor, WalletWrapper } from "@layerswap/wallet-core/types"; +import { NetworkTypes, type ExtendedNetwork } from "@/Models/Network"; +import AppSettings from "@/lib/AppSettings"; +import { aztecWalletAdapter } from "@/lib/wallets/aztec/adapter"; + +// This is a public, client-side-only project ID for WalletConnect wallet discovery. +// It has no authentication or authorization capability and is safe to expose in bundles. +export const WALLET_CONNECT_CONFIGS = { + projectId: AppSettings.WalletConnectProjectId, + name: 'Train Protocol', + description: 'Train Protocol App', + url: 'https://train.tech/', + icons: ['https://app.train.tech/symbol.png'], +}; + +type Provider = WalletProvider | WalletProviderDescriptor | WalletWrapper; + +export type DefaultWalletConfig = { + networks: ExtendedNetwork[]; + wagmiConfig: Config; + walletConnect?: typeof WALLET_CONNECT_CONFIGS; +}; + +function hasStorageKey(key: string) { + try { + return typeof window !== "undefined" && window.localStorage.getItem(key) !== null; + } catch { + return false; + } +} + +function readStorageJson(key: string): unknown { + try { + const raw = typeof window === "undefined" ? null : window.localStorage.getItem(key); + return raw ? JSON.parse(raw) : undefined; + } catch { + return undefined; + } +} + +export function getLayerswapProviders(config: DefaultWalletConfig) { + const { networks, wagmiConfig, walletConnect: walletConnectConfigs = WALLET_CONNECT_CONFIGS } = config; + + const networkIdsOfType = (matches: (network: ExtendedNetwork) => boolean) => networks.filter(matches).map(network => network.caip2Id); + const FUEL_NETWORKS = networkIdsOfType(network => network.networkType.toLowerCase() === "fuel"); + const SVM_NETWORKS = networkIdsOfType(network => network.networkType === NetworkTypes.Solana); + const STARKNET_NETWORKS = networkIdsOfType(network => network.networkType === NetworkTypes.Starknet); + const TRON_NETWORKS = networkIdsOfType(network => network.networkType.toLowerCase() === "tron"); + + return [ + createEVMProvider({ + walletConnectConfigs, + wagmiConfig, + ethereumChainIds: [1, 11155111], + }), + aztecWalletAdapter, + { + id: "fuel", + name: "Fuel", + autofillSupportedNetworks: FUEL_NETWORKS, + withdrawalSupportedNetworks: FUEL_NETWORKS, + asSourceSupportedNetworks: FUEL_NETWORKS, + hasPersistedSession: () => hasStorageKey("fuel-current-connector"), + loadProvider: async () => (await import("@layerswap/wallet-fuel")).createFuelProvider(), + }, + { + id: "solana", + name: "Solana", + autofillSupportedNetworks: SVM_NETWORKS, + withdrawalSupportedNetworks: SVM_NETWORKS, + asSourceSupportedNetworks: SVM_NETWORKS, + hasPersistedSession: () => hasStorageKey("walletAdapterPreviouslySelectedName"), + loadProvider: async () => (await import("@layerswap/wallet-svm")).createSVMProvider({ walletConnectConfigs }), + }, + { + id: "starknet", + name: "Starknet", + autofillSupportedNetworks: STARKNET_NETWORKS, + withdrawalSupportedNetworks: STARKNET_NETWORKS, + asSourceSupportedNetworks: STARKNET_NETWORKS, + hasPersistedSession: () => { + const state = readStorageJson("ls-starknet-accounts") as { state?: { activeWalletAddress?: string; starknetAccounts?: Record } } | undefined; + return !!state?.state?.activeWalletAddress || Object.keys(state?.state?.starknetAccounts ?? {}).length > 0; + }, + loadProvider: async () => (await import("@layerswap/wallet-starknet")).createStarknetProvider(), + }, + { + id: "tron", + name: "Tron", + autofillSupportedNetworks: TRON_NETWORKS, + withdrawalSupportedNetworks: TRON_NETWORKS, + asSourceSupportedNetworks: TRON_NETWORKS, + hasPersistedSession: () => typeof readStorageJson("tronAdapterName") === "string", + loadProvider: async () => (await import("@layerswap/wallet-tron")).createTronProvider(), + }, + ] satisfies Provider[]; +} diff --git a/apps/app/lib/wallets/layerswap/networkAdapter.ts b/apps/app/lib/wallets/layerswap/networkAdapter.ts new file mode 100644 index 00000000..d1eb792e --- /dev/null +++ b/apps/app/lib/wallets/layerswap/networkAdapter.ts @@ -0,0 +1,28 @@ +import { defineNetworkAdapter } from "@layerswap/utils"; +import { getNativeToken, NetworkTypes, type ExtendedNetwork } from "@/Models/Network"; +import { getNetworkRpcUrls } from "@/lib/rpc/resolveNetworkRpcUrl"; +import { isValidAztecAddress } from "@/lib/address/aztec"; + +export const walletNetworkAdapter = defineNetworkAdapter({ + getId: network => network.caip2Id, + getDisplayName: network => network.displayName, + getChainId: network => network.chainId, + getRpcUrls: network => getNetworkRpcUrls(network), + getIcon: network => network.logoUrl, + getTransactionExplorerUrl: network => network.explorerUrlTemplate?.transaction?.replace("{hash}", "{0}"), + getAccountExplorerUrl: network => network.explorerUrlTemplate?.address?.replace("{address}", "{0}"), + getNativeCurrency: network => { + const token = getNativeToken(network); + return token && { symbol: token.symbol, decimals: token.decimals }; + }, + getMulticallAddress: network => network.contracts?.find(contract => contract.type === "Multicall")?.address, + isEvmNetwork: network => network.networkType === NetworkTypes.EVM, + isSolanaNetwork: network => network.networkType === NetworkTypes.Solana, + isStarknetNetwork: network => network.networkType === NetworkTypes.Starknet, + isTronNetwork: network => network.networkType.toLowerCase() === "tron", + isBitcoinNetwork: network => network.networkType.toLowerCase() === "bitcoin", + isTonNetwork: network => network.networkType === NetworkTypes.TON, + isFuelNetwork: network => network.networkType.toLowerCase() === "fuel", + validateAddress: (network, address) => network.networkType === NetworkTypes.Aztec ? isValidAztecAddress(address) : undefined, + formatAddress: (network, address) => network.networkType === NetworkTypes.Aztec ? address?.toLowerCase() : undefined, +}); diff --git a/apps/app/lib/wallets/layerswap/widgetNetwork.ts b/apps/app/lib/wallets/layerswap/widgetNetwork.ts new file mode 100644 index 00000000..29669f02 --- /dev/null +++ b/apps/app/lib/wallets/layerswap/widgetNetwork.ts @@ -0,0 +1,12 @@ +import { Network as WidgetNetwork, NetworkType } from "@layerswap/widget-types"; +import { Network, NetworkTypes, type ExtendedNetwork } from "@/Models/Network"; + +type TrainNetwork = Network & Partial>; + +export function toWidgetNetwork(network: T) { + const { nodes, ...rest } = network; + return Object.assign(new WidgetNetwork(), rest, { + type: network.networkType === NetworkTypes.EVM ? NetworkType.EVM : (network.networkType as NetworkType), + nodes: nodes?.map(node => node.url), + }); +} diff --git a/apps/app/lib/wallets/solana/KnownSolanaConnectors.tsx b/apps/app/lib/wallets/solana/KnownSolanaConnectors.tsx deleted file mode 100644 index bbeb96fe..00000000 --- a/apps/app/lib/wallets/solana/KnownSolanaConnectors.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import CoinbaseIcon from "../../../components/Icons/Wallets/Coinbase" -import Phantom from "../../../components/Icons/Wallets/Phantom" -import Solflare from "../../../components/Icons/Wallets/Solflare" -import WalletConnectIcon from "../../../components/Icons/Wallets/WalletConnect" - -const KnownSolanaConnectors = [ - { - id: 'solflare', - icon: Solflare - }, - { - id: 'phantom', - icon: Phantom - }, - { - id: 'walletconnect', - icon: WalletConnectIcon - }, - { - id: 'coinbase', - icon: CoinbaseIcon - } -] - -export default KnownSolanaConnectors \ No newline at end of file diff --git a/apps/app/lib/wallets/solana/connectors/SolanaWalletConnectAdapter.ts b/apps/app/lib/wallets/solana/connectors/SolanaWalletConnectAdapter.ts deleted file mode 100644 index ecc660f3..00000000 --- a/apps/app/lib/wallets/solana/connectors/SolanaWalletConnectAdapter.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { - BaseSignerWalletAdapter, - WalletAdapterNetwork, - WalletDisconnectionError, - WalletName, - WalletNotConnectedError, - WalletNotReadyError, - WalletReadyState, - WalletSignMessageError, - WalletSignTransactionError, - isVersionedTransaction, -} from "@solana/wallet-adapter-base" -import { PublicKey, Transaction, VersionedTransaction, TransactionVersion } from "@solana/web3.js" -import type { UniversalProvider as UniversalProviderClass } from "@walletconnect/universal-provider" -import type { SessionTypes, SignClientTypes } from "@walletconnect/types" -import { parseAccountId } from "@walletconnect/utils" -import base58 from "bs58" - -type UniversalProviderType = InstanceType - -const Methods = { - signTransaction: "solana_signTransaction", - signMessage: "solana_signMessage", - signAndSendTransaction: "solana_signAndSendTransaction", - signAllTransactions: "solana_signAllTransactions", -} as const - -const ChainIDs = { - Mainnet: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - Devnet: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", - DeprecatedMainnet: "solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ", - DeprecatedDevnet: "solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K", -} as const - -const WALLET_CONNECT_ICON = - 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE4NSIgdmlld0JveD0iMCAwIDMwMCAxODUiIHdpZHRoPSIzMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTYxLjQzODU0MjkgMzYuMjU2MjYxMmM0OC45MTEyMjQxLTQ3Ljg4ODE2NjMgMTI4LjIxMTk4NzEtNDcuODg4MTY2MyAxNzcuMTIzMjA5MSAwbDUuODg2NTQ1IDUuNzYzNDE3NGMyLjQ0NTU2MSAyLjM5NDQwODEgMi40NDU1NjEgNi4yNzY1MTEyIDAgOC42NzA5MjA0bC0yMC4xMzY2OTUgMTkuNzE1NTAzYy0xLjIyMjc4MSAxLjE5NzIwNTEtMy4yMDUzIDEuMTk3MjA1MS00LjQyODA4MSAwbC04LjEwMDU4NC03LjkzMTE0NzljLTM0LjEyMTY5Mi0zMy40MDc5ODE3LTg5LjQ0Mzg4Ni0zMy40MDc5ODE3LTEyMy41NjU1Nzg4IDBsLTguNjc1MDU2MiA4LjQ5MzYwNTFjLTEuMjIyNzgxNiAxLjE5NzIwNDEtMy4yMDUzMDEgMS4xOTcyMDQxLTQuNDI4MDgwNiAwbC0yMC4xMzY2OTQ5LTE5LjcxNTUwMzFjLTIuNDQ1NTYxMi0yLjM5NDQwOTItMi40NDU1NjEyLTYuMjc2NTEyMiAwLTguNjcwOTIwNHptMjE4Ljc2Nzc5NjEgNDAuNzczNzQ0OSAxNy45MjE2OTcgMTcuNTQ2ODk3YzIuNDQ1NTQ5IDIuMzk0Mzk2OSAyLjQ0NTU2MyA2LjI3NjQ3NjkuMDAwMDMxIDguNjcwODg5OWwtODAuODEwMTcxIDc5LjEyMTEzNGMtMi40NDU1NDQgMi4zOTQ0MjYtNi40MTA1ODIgMi4zOTQ0NTMtOC44NTYxNi4wMDAwNjItLjAwMDAxLS4wMDAwMTAtLjAwMDAyMi0uMDAwMDIyLS4wMDAwMzItLjAwMDAzMmwtNTcuMzU0MTQzLTU2LjE1NDU3MmMtLjYxMTM5LS41OTg2MDItMS42MDI2NS0uNTk4NjAyLTIuMjE0MDQgMC0uMDAwMDA0LjAwMDAwNC0uMDAwMDA3LjAwMDAwOC0uMDAwMDExLjAwMDAxMWwtNTcuMzUyOTIxMiA1Ni4xNTQ1MzFjLTIuNDQ1NTM2OCAyLjM5NDQzMi02LjQxMDU3NTUgMi4zOTQ0NzItOC44NTYxNjEyLjAwMDA4Ny0uMDAwMDE0My0uMDAwMDE0LS4wMDAwMjk2LS4wMDAwMjgtLjAwMDA0NDktLjAwMDA0NGwtODAuODEyNDE5NDMtNzkuMTIyMTg1Yy0yLjQ0NTU2MDIxLTIuMzk0NDA4LTIuNDQ1NTYwMjEtNi4yNzY1MTE1IDAtOC42NzA5MTk3bDE3LjkyMTcyOTYzLTE3LjU0Njg2NzNjMi40NDU1NjAyLTIuMzk0NDA4MiA2LjQxMDU5ODktMi4zOTQ0MDgyIDguODU2MTYwMiAwbDU3LjM1NDk3NzUgNTYuMTU1MzU3Yy42MTEzOTA4LjU5ODYwMiAxLjYwMjY0OS41OTg2MDIgMi4yMTQwMzk4IDAgLjAwMDAwOTItLjAwMDAwOS4wMDAwMTc0LS4wMDAwMTcuMDAwMDI2NS0uMDAwMDI0bDU3LjM1MjEwMzEtNTYuMTU1MzMzYzIuNDQ1NTA1LTIuMzk0NDYzMyA2LjQxMDU0NC0yLjM5NDU1MzEgOC44NTYxNjEtLjAwMDIuMDAwMDM0LjAwMDAzMzYuMDAwMDY4LjAwMDA2NzMuMDAwMTAxLjAwMDEwMWw1Ny4zNTQ5MDIgNTYuMTU1NDMyYy42MTEzOS41OTg2MDEgMS42MDI2NS41OTg2MDEgMi4yMTQwNCAwbDU3LjM1Mzk3NS01Ni4xNTQzMjQ5YzIuNDQ1NTYxLTIuMzk0NDA5MiA2LjQxMDU5OS0yLjM5NDQwOTIgOC44NTYxNiAweiIgZmlsbD0iIzNiOTlmYyIvPjwvc3ZnPg==' - -export const SolanaWalletConnectWalletName = "WalletConnect" as WalletName<"WalletConnect"> - -export type SolanaWalletConnectAdapterConfig = { - network: WalletAdapterNetwork.Mainnet | WalletAdapterNetwork.Devnet - options: SignClientTypes.Options -} - -type DisplayUriListener = (uri: string) => void - -export class SolanaWalletConnectAdapter extends BaseSignerWalletAdapter { - name = SolanaWalletConnectWalletName - url = "https://walletconnect.org" - icon = WALLET_CONNECT_ICON - - readonly supportedTransactionVersions: ReadonlySet = new Set(["legacy" as TransactionVersion, 0 as TransactionVersion]) - - private _publicKey: PublicKey | null - private _connecting: boolean - private _provider: UniversalProviderType | undefined - private _providerInitPromise: Promise | undefined - private _session: SessionTypes.Struct | undefined - private _config: SolanaWalletConnectAdapterConfig - private _readyState: WalletReadyState - private _network: string - private _onSessionDelete: () => void - private _displayUriListeners: Set = new Set() - private _internalDisplayUriHandler: ((uri: string) => void) | undefined - - constructor(config: SolanaWalletConnectAdapterConfig) { - super() - this._config = config - this._publicKey = null - this._connecting = false - this._readyState = typeof window === "undefined" ? WalletReadyState.Unsupported : WalletReadyState.Loadable - this._network = config.network === WalletAdapterNetwork.Mainnet ? ChainIDs.Mainnet : ChainIDs.Devnet - this._onSessionDelete = () => { - this.disconnect() - } - } - - get publicKey(): PublicKey | null { - return this._publicKey - } - - get connecting(): boolean { - return this._connecting - } - - get readyState(): WalletReadyState { - return this._readyState - } - - onDisplayUri(listener: DisplayUriListener): () => void { - this._displayUriListeners.add(listener) - return () => this._displayUriListeners.delete(listener) - } - - /** - * Fire-and-forget hint that the user is about to connect — eagerly runs - * the `UniversalProvider.init()` so the actual `connect()` doesn't block - * on a cold import + init when the user clicks a WC wallet tile. - */ - warmup(): void { - if (this._readyState !== WalletReadyState.Loadable) return - if (this._provider || this._providerInitPromise) return - this.getProvider().catch(() => { /* next connect() will surface the real error */ }) - } - - private async getProvider(): Promise { - if (this._provider) return this._provider - if (!this._providerInitPromise) { - this._providerInitPromise = (async () => { - try { - const { UniversalProvider: UP } = await import("@walletconnect/universal-provider") - const provider = await UP.init(this._config.options) - this._provider = provider - if (!this._internalDisplayUriHandler) { - this._internalDisplayUriHandler = (uri: string) => { - for (const cb of this._displayUriListeners) { - try { cb(uri) } catch (e) { /* swallow listener errors */ } - } - } - provider.on("display_uri", this._internalDisplayUriHandler) - } - return provider - } finally { - this._providerInitPromise = undefined - } - })() - } - return this._providerInitPromise - } - - /** - * Override the base `autoConnect` so we never start a NEW WC pairing from - * wallet-adapter-react's auto-reconnect path. A new pairing requires the - * user to scan a QR, which isn't available during auto-reconnect; calling - * `provider.connect()` there hangs with `_connecting = true` until the - * internal timeout, blocking any subsequent user-initiated connect - * (`connect()` early-returns on `this.connecting`). Only resume an - * existing session here; a real connect always goes through `connect()`. - */ - async autoConnect(): Promise { - if (this._readyState !== WalletReadyState.Loadable) return - try { - const provider = await this.getProvider() - if (provider.session) await this.connect() - } catch { /* silent — the user can still connect manually */ } - } - - async connect(): Promise { - try { - if (this.connected || this.connecting) return - if (this._readyState !== WalletReadyState.Loadable) throw new WalletNotReadyError() - - this._connecting = true - const provider = await this.getProvider() - - // Reuse existing session when available - const existing = provider.session - if (existing) { - this._session = existing - provider.setDefaultChain(this._network) - this._publicKey = this.publicKeyFromSession(existing) - this.bindSessionListeners() - this.emit("connect", this._publicKey) - return - } - - const chains = this._network === ChainIDs.Mainnet - ? [ChainIDs.Mainnet, ChainIDs.DeprecatedMainnet] - : [ChainIDs.Devnet, ChainIDs.DeprecatedDevnet] - - const session = await provider.connect({ - optionalNamespaces: { - solana: { - chains, - methods: [ - Methods.signTransaction, - Methods.signMessage, - Methods.signAndSendTransaction, - Methods.signAllTransactions, - ], - events: [], - }, - }, - }) - - if (!session) throw new Error("WalletConnect Solana: empty session") - this._session = session - provider.setDefaultChain(this._network) - this._publicKey = this.publicKeyFromSession(session) - this.bindSessionListeners() - this.emit("connect", this._publicKey) - } catch (error: any) { - throw error - } finally { - this._connecting = false - } - } - - private bindSessionListeners() { - if (!this._provider) return - // Avoid duplicate listeners — re-bind cleanly each connect cycle - try { this._provider.client.off("session_delete", this._onSessionDelete) } catch { /* no-op */ } - this._provider.client.on("session_delete", this._onSessionDelete) - } - - private publicKeyFromSession(session: SessionTypes.Struct): PublicKey { - const account = session.namespaces["solana"]?.accounts?.[0] - if (!account) throw new Error("WalletConnect Solana: no Solana account in session") - const { address } = parseAccountId(account) - return new PublicKey(address) - } - - async disconnect(): Promise { - const provider = this._provider - let providerDisconnectThrew = false - if (provider) { - try { provider.client.off("session_delete", this._onSessionDelete) } catch { /* no-op */ } - try { - if (provider.session) await provider.disconnect() - } catch (error: any) { - providerDisconnectThrew = true - this.emit("error", new WalletDisconnectionError(error?.message, error)) - } - } - this._publicKey = null - this._session = undefined - - // Keep `_provider` warm across the disconnect → reconnect path. UP's - // `disconnect()` awaits `cleanup()` which clears `provider.session`, so - // the next `connect()` will take the fresh-pairing branch and emit - // `display_uri` immediately — no cold `UP.init()` to wait for, which - // is what previously made the QR spinner hang on the first reconnect. - // Only tear down the provider if its own `disconnect()` threw, because - // then `provider.session` may still be set. - if (providerDisconnectThrew && provider) { - if (this._internalDisplayUriHandler) { - try { provider.off("display_uri", this._internalDisplayUriHandler) } catch { /* no-op */ } - } - this._provider = undefined - this._providerInitPromise = undefined - this._internalDisplayUriHandler = undefined - if (this._readyState === WalletReadyState.Loadable) { - this.getProvider().catch(() => { /* next connect() will surface the real error */ }) - } - } - - this.emit("disconnect") - } - - async signTransaction(transaction: T): Promise { - try { - if (!this._provider || !this._session || !this._publicKey) throw new WalletNotConnectedError() - try { - const isVersioned = isVersionedTransaction(transaction) - const serialized = this.serialize(transaction) - const result = await this._provider.client.request<{ signature: string, transaction?: string }>({ - chainId: this._network, - topic: this._session.topic, - request: { - method: Methods.signTransaction, - params: { - ...(isVersioned ? {} : (transaction as any).toJSON?.() ?? {}), - transaction: serialized, - }, - }, - }) - if (result.transaction) { - return this.deserialize(result.transaction, isVersioned) as T - } - // Legacy WC wallets return only the signature. `Transaction.addSignature` has a - // different contract than `VersionedTransaction.addSignature` (and blind-attaching - // a single signature to a v0 tx can silently drop required co-signers), so we - // refuse the partial result and surface a clear error. - if (isVersioned) { - throw new WalletSignTransactionError( - "Wallet returned only a signature for a versioned transaction; full signed transaction required", - ) - } - ;(transaction as Transaction).addSignature(this._publicKey, Buffer.from(base58.decode(result.signature))) - return transaction - } catch (error: any) { - throw new WalletSignTransactionError(error?.message, error) - } - } catch (error: any) { - this.emit("error", error) - throw error - } - } - - async signMessage(message: Uint8Array): Promise { - try { - if (!this._provider || !this._session || !this._publicKey) throw new WalletNotConnectedError() - try { - const result = await this._provider.client.request<{ signature: string }>({ - chainId: this._network, - topic: this._session.topic, - request: { - method: Methods.signMessage, - params: { - pubkey: this._publicKey.toString(), - message: base58.encode(message), - }, - }, - }) - return base58.decode(result.signature) - } catch (error: any) { - throw new WalletSignMessageError(error?.message, error) - } - } catch (error: any) { - this.emit("error", error) - throw error - } - } - - async signAndSendTransaction(transaction: T): Promise { - try { - if (!this._provider || !this._session) throw new WalletNotConnectedError() - try { - const result = await this._provider.client.request<{ signature: string }>({ - chainId: this._network, - topic: this._session.topic, - request: { - method: Methods.signAndSendTransaction, - params: { transaction: this.serialize(transaction) }, - }, - }) - return result.signature - } catch (error: any) { - throw new WalletSignTransactionError(error?.message, error) - } - } catch (error: any) { - this.emit("error", error) - throw error - } - } - - async signAllTransactions(transactions: T[]): Promise { - if (!this._provider || !this._session) { - const error = new WalletNotConnectedError() - this.emit("error", error) - throw error - } - try { - const serialized = transactions.map(t => this.serialize(t)) - const result = await this._provider.client.request<{ transactions: string[] }>({ - chainId: this._network, - topic: this._session.topic, - request: { - method: Methods.signAllTransactions, - params: { transactions: serialized }, - }, - }) - return transactions.map((t, i) => { - const isVersioned = isVersionedTransaction(t) - return this.deserialize(result.transactions[i] ?? "", isVersioned) as T - }) - } catch (batchError: any) { - // Only fall back to per-transaction signing when the wallet genuinely - // doesn't support the batch method. For user rejections or other - // failures, surface the original error — otherwise a declined batch - // would re-prompt the user once per transaction. - const msg = (batchError?.message ?? '').toLowerCase() - const isUnsupported = - batchError?.code === 4200 || - msg.includes('not supported') || - msg.includes('method not found') || - msg.includes('unsupported') - if (!isUnsupported) { - this.emit("error", batchError) - throw batchError - } - // signTransaction handles its own "error" emission, so we don't - // re-emit here to avoid firing listeners twice for the same failure. - return await Promise.all(transactions.map(t => this.signTransaction(t))) - } - } - - private serialize(transaction: Transaction | VersionedTransaction): string { - return Buffer.from(transaction.serialize({ verifySignatures: false } as any)).toString("base64") - } - - private deserialize(serializedTransaction: string, versioned = false): Transaction | VersionedTransaction { - if (versioned) { - return VersionedTransaction.deserialize(Buffer.from(serializedTransaction, "base64")) - } - return Transaction.from(Buffer.from(serializedTransaction, "base64")) - } -} \ No newline at end of file diff --git a/apps/app/lib/wallets/solana/useSVM.tsx b/apps/app/lib/wallets/solana/useSVM.tsx deleted file mode 100644 index 861902e8..00000000 --- a/apps/app/lib/wallets/solana/useSVM.tsx +++ /dev/null @@ -1,334 +0,0 @@ -import KnownInternalNames from "../../knownIds" -import { useWallet } from "@solana/wallet-adapter-react" -import { resolveWalletConnectorIcon, resolveWalletConnectorIndex } from "../utils/resolveWalletIcon" -import { NetworkTypes } from "@/Models/Network" -import { - InternalConnector, - RequestAdditionalConnectorsParams, - RequestAdditionalConnectorsResult, - Wallet, - WalletProvider, -} from "@/Models/WalletProvider" -import { useCallback, useEffect, useMemo, useRef } from "react" -import { useSettingsState } from "@/context/settings" -import { useConnectModal, WalletModalConnector } from "@/components/WalletModal" -import { - getRegistryEntry, -} from "@/lib/walletConnect/types" -import { buildDeepLink } from "@/lib/walletConnect/buildDeepLink" -import { subscribeDisplayUri } from "@/lib/walletConnect/subscribeDisplayUri" -import { mapConnectError } from "@/lib/walletConnect/mapConnectError" -import { - getDynamicWcMetadata, - setDynamicWcMetadata, - getPendingDynamicWcMetadata, - clearPendingDynamicWcMetadata, - setPendingMetadataForRegistry, -} from "@/lib/walletConnect/dynamicMetadata" -import { SolanaWalletConnectAdapter } from "./connectors/SolanaWalletConnectAdapter" -import { useAdditionalConnectors } from "@/lib/walletConnect/useAdditionalConnectors" -import { createRegistryConnector } from "@/lib/walletConnect/createRegistryConnector" -import { isMobile } from "../utils/isMobile" - -const SOLANA_WC_ADAPTER_NAME = 'WalletConnect' -const name = 'Solana' -const id = 'solana' -const solanaNames = [KnownInternalNames.Networks.SolanaMainnet, KnownInternalNames.Networks.SolanaDevnet, KnownInternalNames.Networks.SolanaTestnet] - -export default function useSVM(): WalletProvider { - const { networks } = useSettingsState() - const isMobilePlatform = useMemo(() => isMobile(), []) - - const commonSupportedNetworks = useMemo(() => [ - ...networks.filter(network => network.networkType === NetworkTypes.Solana).map(l => l.caip2Id) - ], [networks]) - - const { disconnect, select, wallets, wallet: solanaWallet } = useWallet() - const walletsRef = useRef(wallets) - walletsRef.current = wallets - const connectedWallet = solanaWallet?.adapter.connected === true ? solanaWallet : undefined - const connectedAddress = connectedWallet?.adapter.publicKey?.toBase58() - const connectedAdapterName = connectedWallet?.adapter.name - - const { setSelectedConnector, isWalletModalOpen } = useConnectModal() - const { - browseConnectors: walletConnectConnectors, - browseMetadata: walletConnectBrowseMetadata, - requestAdditionalConnectors: requestRegistryConnectors, - addRecentConnector: addWalletConnectWallet, - } = useAdditionalConnectors(id) - - useEffect(() => { - if (isWalletModalOpen && !walletConnectBrowseMetadata.loaded) { - requestRegistryConnectors({ page: 1, pageSize: 40 }).catch((error) => console.warn('Failed to load Solana WalletConnect wallets registry', error)) - } - // Pre-warm the WC provider so the user's first wallet click doesn't wait - // for UP.init() — the cold init is what makes recent-wallet reconnects - // after a refresh spin on "QR loading" for several seconds. - if (isWalletModalOpen) { - const wcAdapterEntry = walletsRef.current.find(w => w.adapter.name === SOLANA_WC_ADAPTER_NAME) - const wcAdapter = wcAdapterEntry?.adapter as unknown as SolanaWalletConnectAdapter | undefined - wcAdapter?.warmup?.() - } - }, [isWalletModalOpen, walletConnectBrowseMetadata.loaded, requestRegistryConnectors]) - - const connectedWallets = useMemo(() => { - - if (solanaWallet?.adapter.connected === true) { - const isWalletConnect = connectedAdapterName === SOLANA_WC_ADAPTER_NAME - const dynamicMeta = (isWalletConnect && connectedAddress) - ? (getDynamicWcMetadata(id, connectedAddress) || getPendingDynamicWcMetadata(id)) - : null - - const displayName = dynamicMeta?.name || connectedAdapterName - const displayIcon = dynamicMeta?.icon || connectedWallet?.adapter.icon - const displayId = dynamicMeta?.id || (connectedAdapterName ? String(connectedAdapterName) : undefined) - - const wallet: Wallet | undefined = (connectedAddress && displayId) ? { - id: displayId, - address: connectedAddress, - displayName: `${displayName} - Solana`, - providerName: name, - icon: resolveWalletConnectorIcon({ connector: displayId, address: connectedAddress, iconUrl: displayIcon }), - disconnect, - isActive: true, - addresses: [connectedAddress], - asSourceSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - autofillSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - withdrawalSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - networkIcon: networks.find(n => solanaNames.some(name => name === n.caip2Id))?.logoUrl - } : undefined - - if (wallet) { - return [wallet] - } - } - - }, [connectedAddress, connectedAdapterName, solanaWallet, disconnect, commonSupportedNetworks, networks]) - - const connectWallet = useCallback(async ({ connector }: { connector: WalletModalConnector }) => { - let unsubscribeDisplayUri: (() => void) | undefined - const registry = getRegistryEntry(connector) - try { - const isRegistryWallet = !!registry - const isBareWcTile = connector.name === SOLANA_WC_ADAPTER_NAME - const currentWallets = walletsRef.current - const installedAdapter = currentWallets.find(w => w.adapter.name === connector.name) || - currentWallets.find(w => w.adapter.name.includes(connector.name)) - const walletConnectAdapter = currentWallets.find(w => w.adapter.name === SOLANA_WC_ADAPTER_NAME) - - // Decide which adapter actually performs the connect: - // - Registry WC wallets and the bare WC tile always go through the WC adapter - // - Installed adapters that explicitly want a QR (showQrCode) or are missing on mobile fall back to WC - const useWalletConnect = isRegistryWallet || isBareWcTile - || (connector.hasBrowserExtension && (connector.showQrCode || (isMobilePlatform && connector.extensionNotFound))) - - const targetAdapterEntry = useWalletConnect ? walletConnectAdapter : installedAdapter - if (!targetAdapterEntry) throw new Error('Connector not found') - - if (connectedWallet) { - try { await targetAdapterEntry.adapter.disconnect() } catch { /* noop */ } - } - - const resolveURI = registry - ? (uri: string) => buildDeepLink({ id: registry.id, mobile: registry.mobile }, uri) - : undefined - - if (useWalletConnect && walletConnectAdapter) { - const wcAdapter = walletConnectAdapter.adapter as unknown as SolanaWalletConnectAdapter - - // Track display metadata so connectedWallets can render the right name/icon after success - setPendingMetadataForRegistry(id, registry) - - // Only pre-render the QR screen when we actually want the user to see it: - // - Desktop → QR modal. - // - Mobile WITHOUT a resolvable deeplink (e.g. bare WC tile) → QR fallback so - // the user isn't stuck on a spinner. - // On mobile WITH a deeplink, leave `qr` unset so ConnectorsList renders the - // neutral LoadingConnect screen; `subscribeDisplayUri` will then navigate via - // `window.location.href = deepLink` as soon as the URI arrives. - const wantsQrModal = !isMobilePlatform || !resolveURI - - if (wantsQrModal) { - setSelectedConnector({ ...connector, qr: { state: 'loading', value: undefined }, showQrCode: true }) - } else { - setSelectedConnector({ ...connector }) - } - - unsubscribeDisplayUri = subscribeDisplayUri({ - source: wcAdapter, - resolveURI, - isMobilePlatform, - onQr: (qr) => setSelectedConnector({ ...connector, qr, showQrCode: true }), - }) - - // Track recent registry wallets so they can be re-surfaced - if (registry) addWalletConnectWallet(registry) - } - - try { - select(targetAdapterEntry.adapter.name) - await targetAdapterEntry.adapter.connect() - } finally { - unsubscribeDisplayUri?.() - unsubscribeDisplayUri = undefined - } - - // Prefer the adapter we just connected — `wallets.find(connected)` can - // return a stale entry (e.g. a previously-connected Phantom that sits - // earlier in the array) and yield the wrong address. Fall back to the - // scan only if our target somehow isn't reporting connected. - const newConnectedWallet = targetAdapterEntry.adapter.connected === true - ? targetAdapterEntry - : walletsRef.current.find(w => w.adapter.connected === true) - const newAddress = newConnectedWallet?.adapter.publicKey?.toBase58() - - // Persist display metadata for reconnects after refresh - if (newAddress && useWalletConnect && registry) { - setDynamicWcMetadata(id, newAddress, { - name: registry.name, - icon: registry.icon || '', - id: registry.id, - }) - } - - const displayId = registry?.id || (newConnectedWallet?.adapter.name ? String(newConnectedWallet.adapter.name) : undefined) - const displayName = registry?.name || newConnectedWallet?.adapter.name - const displayIconRaw = registry?.icon || newConnectedWallet?.adapter.icon - - const wallet: Wallet | undefined = newAddress && newConnectedWallet && displayId ? { - id: displayId, - address: newAddress, - displayName: `${displayName} - Solana`, - providerName: name, - icon: resolveWalletConnectorIcon({ connector: displayId, address: newAddress, iconUrl: displayIconRaw }), - disconnect, - isActive: true, - addresses: [newAddress], - asSourceSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - autofillSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - withdrawalSupportedNetworks: resolveSupportedNetworks(commonSupportedNetworks, displayId), - networkIcon: networks.find(n => solanaNames.some(name => name === n.caip2Id))?.logoUrl - } : undefined - - return wallet - } catch (e) { - throw mapConnectError(e) - } finally { - unsubscribeDisplayUri?.() - if (registry) clearPendingDynamicWcMetadata(id) - } - }, [connectedWallet, disconnect, select, isMobilePlatform, setSelectedConnector, addWalletConnectWallet, commonSupportedNetworks, networks, name]) - - const disconnectWallet = useCallback(async () => { - try { - await disconnect() - } - catch (e) { - console.log(e) - } - }, [disconnect]) - - const { availableConnectors, additionalConnectors } = useMemo(() => { - const installed: InternalConnector[] = [] - const registry: InternalConnector[] = [] - const seenIds = new Set() - const seenNames = new Set() - - for (const wallet of wallets) { - const isWcAdapter = wallet.adapter.name === SOLANA_WC_ADAPTER_NAME - const isInstalled = wallet.readyState === 'Installed' || wallet.readyState === 'Loadable' || wallet.adapter.name === 'Coinbase Wallet' - const internalConnector: InternalConnector = { - name: wallet.adapter.name.trim(), - id: wallet.adapter.name.trim(), - icon: wallet.adapter.icon, - type: isInstalled ? 'injected' : 'other', - installUrl: wallet.adapter?.url, - hasBrowserExtension: !isWcAdapter, - extensionNotFound: isWcAdapter ? false : !isInstalled, - isLoadable: wallet.readyState === 'Loadable' && wallet.adapter.name !== 'Coinbase Wallet', - providerName: name, - order: resolveWalletConnectorIndex(wallet.adapter.name.trim().toLowerCase()), - } - installed.push(internalConnector) - seenIds.add(internalConnector.id.toLowerCase()) - seenNames.add(internalConnector.name.toLowerCase()) - } - - for (const reg of walletConnectConnectors) { - if (seenIds.has(reg.id.toLowerCase())) continue - if (seenNames.has(reg.name.toLowerCase())) continue - registry.push(createRegistryConnector(reg, isMobilePlatform, name)) - } - - return { availableConnectors: installed, additionalConnectors: registry } - }, [wallets, walletConnectConnectors, isMobilePlatform]) - - const isNotAvailableCondition = useCallback((connectorId: string | undefined, network: string | undefined, purpose?: "withdrawal" | "autofill" | "asSource") => { - if (!network) return false - if (!connectorId) return true - - if (!purpose) { - return resolveSupportedNetworks([network], connectorId).length === 0 - } - - const supportedNetworksByPurpose = resolveSupportedNetworks(commonSupportedNetworks, connectorId) - return supportedNetworksByPurpose.length === 0 || !supportedNetworksByPurpose.includes(network) - }, [commonSupportedNetworks]) - - const requestAdditionalConnectors = useCallback(async (params: RequestAdditionalConnectorsParams = {}): Promise => { - const result = await requestRegistryConnectors(params) - const installedConnectorIds = new Set(availableConnectors.map(connector => connector.id.toLowerCase())) - const installedConnectorNames = new Set(availableConnectors.map(connector => connector.name.toLowerCase())) - - return { - connectors: result.connectors - .filter(connector => !installedConnectorIds.has(connector.id.toLowerCase()) && !installedConnectorNames.has(connector.name.toLowerCase())) - .map(connector => createRegistryConnector(connector, isMobilePlatform, name)), - nextPage: result.nextPage, - totalCount: result.totalCount, - } - }, [requestRegistryConnectors, availableConnectors, isMobilePlatform, name]) - - const providerIcon = useMemo(() => networks.find(n => solanaNames.some(name => name === n.caip2Id))?.logoUrl, [networks]) - - const provider: WalletProvider = useMemo(() => ({ - connectedWallets: connectedWallets, - activeWallet: connectedWallets?.[0], - connectWallet, - disconnectWallets: disconnectWallet, - isNotAvailableCondition, - availableConnectors, - additionalConnectors, - withdrawalSupportedNetworks: commonSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - name, - id, - providerIcon, - ready: wallets.length > 0, - requestAdditionalConnectors, - }), [connectedWallets, connectWallet, disconnectWallet, isNotAvailableCondition, availableConnectors, additionalConnectors, commonSupportedNetworks, name, id, providerIcon, wallets.length, requestAdditionalConnectors]) - - return provider -} - -const networkSupport = { - soon: ["okx wallet", "tokenpocket", "nightly"], - eclipse: ["nightly", "backpack"], -}; - -function resolveSupportedNetworks(supportedNetworks: string[], connectorId: string): string[] { - const supportedNetworksForWallet: string[] = []; - - supportedNetworks.forEach((network) => { - const lowerCaseName = network.split(/[_:]/)[0].toLowerCase(); - if (lowerCaseName === "solana") { - supportedNetworksForWallet.push(network); - } else if (networkSupport[lowerCaseName] && networkSupport[lowerCaseName].includes(connectorId?.toLowerCase())) { - supportedNetworksForWallet.push(network); - } - }); - - return supportedNetworksForWallet; -} \ No newline at end of file diff --git a/apps/app/lib/wallets/starknet/KnownStarknetConnectors.tsx b/apps/app/lib/wallets/starknet/KnownStarknetConnectors.tsx deleted file mode 100644 index cfc95973..00000000 --- a/apps/app/lib/wallets/starknet/KnownStarknetConnectors.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import Argent from "@/components/Icons/Wallets/Argent" -import ArgentX from "@/components/Icons/Wallets/ArgentX" -import Braavos from "@/components/Icons/Wallets/Braavos" -import Controller from "@/components/Icons/Wallets/Controller" -import Keplr from "@/components/Icons/Wallets/Keplr" -import Xverse from "@/components/Icons/Wallets/Xverse" - -const KnownStarknetConnectors = [ - { - id: 'ready x', - icon: ArgentX - }, - { - id: 'ready (formerly argent)', - icon: Argent - }, - { - id: 'braavos', - icon: Braavos - }, - { - id: 'keplr', - icon: Keplr - }, - { - id: 'xverse wallet', - icon: Xverse - }, - { - id: 'cartridge controller', - icon: Controller - } -] - -export default KnownStarknetConnectors \ No newline at end of file diff --git a/apps/app/lib/wallets/starknet/useStarknet.ts b/apps/app/lib/wallets/starknet/useStarknet.ts deleted file mode 100644 index 822bc3fe..00000000 --- a/apps/app/lib/wallets/starknet/useStarknet.ts +++ /dev/null @@ -1,224 +0,0 @@ -import KnownInternalNames from "../../knownIds" -import { resolveWalletConnectorIcon } from "../utils/resolveWalletIcon" -import { useSettingsState } from "../../../context/settings"; -import { Connector, useConnect, useDisconnect } from "@starknet-react/core"; -import { InternalConnector, Wallet, WalletProvider } from "../../../Models/WalletProvider"; -import { useRpcConfigStore } from "../../../stores/rpcConfigStore"; -import { useStarknetStore } from "@/stores/starknetWalletStore"; -import { Network } from "@/Models/Network"; - -export const starknetNames = [KnownInternalNames.Networks.StarkNetGoerli, KnownInternalNames.Networks.StarkNetMainnet, KnownInternalNames.Networks.StarkNetSepolia] -export default function useStarknet(): WalletProvider { - const commonSupportedNetworks = [ - KnownInternalNames.Networks.StarkNetMainnet, - KnownInternalNames.Networks.StarkNetGoerli, - KnownInternalNames.Networks.StarkNetSepolia - ] - - const withdrawalSupportedNetworks = [ - ...commonSupportedNetworks - ] - - const name = 'Starknet' - const id = 'starknet' - const { networks } = useSettingsState() - const { getEffectiveRpcUrl } = useRpcConfigStore() - - const { connectors } = useConnect(); - const { disconnectAsync } = useDisconnect() - - const starknetWallets = useStarknetStore((state) => state.connectedWallets) - const addWallet = useStarknetStore((state) => state.connectWallet) - const removeAccount = useStarknetStore((state) => state.removeAccount) - const addAccount = useStarknetStore((state) => state.addAccount) - - const activeWalletAddress = useStarknetStore((state) => state.activeWalletAddress); - const setActiveWallet = useStarknetStore((state) => state.setActiveWallet); - - const activeWallet = starknetWallets.find(wallet => wallet.address === activeWalletAddress); - const isMainnet = networks?.some(network => network.caip2Id === KnownInternalNames.Networks.StarkNetMainnet) - const network = networks?.find(network => starknetNames.some(name => name === network.caip2Id)) - const nodeUrl = network ? getEffectiveRpcUrl(network) : undefined - - const connectWallet = async ({ connector }) => { - try { - const starknetConnector = connectors.find(c => c.id === connector.id) - - let result = await starknetConnector?.connect({}) - - const walletChain = `0x${result?.chainId?.toString(16)}` - const isWalletOnMainnet = walletChain === '0x534e5f4d41494e' - const wrongChain = isWalletOnMainnet !== isMainnet - const starknetNetwork = networks.find(n => n.caip2Id === KnownInternalNames.Networks.StarkNetMainnet || n.caip2Id === KnownInternalNames.Networks.StarkNetSepolia) - - if (result?.account && wrongChain) { - const wallet = (starknetConnector as any)?._wallet || (starknetConnector as any)?.wallet - if (wallet?.request) { - const targetChainId = isMainnet ? 'SN_MAIN' : 'SN_SEPOLIA' - try { - await wallet.request({ - type: "wallet_switchStarknetChain", - params: { chainId: targetChainId } - }) - result = await starknetConnector?.connect({}) - } catch (switchError) { - console.log('Chain switch failed:', switchError) - await disconnectWallets(connector?.name, result?.account) - throw new Error(`Failed to switch network. Please switch manually to ${isMainnet ? 'Mainnet' : 'Sepolia'} in your wallet.`) - } - } else { - await disconnectWallets(connector?.name, result?.account) - throw new Error(`Please switch the network in your wallet to ${isMainnet ? 'Mainnet' : 'Sepolia'} and connect again.`) - } - } - - if (result?.account && starknetConnector) { - const resolvedWallet = await resolveStarknetWallet({ - name, - connector: starknetConnector, - network: starknetNetwork, - nodeUrl: nodeUrl, - disconnectWallets: () => disconnectWallets(starknetConnector.id, result?.account), - address: result?.account, - withdrawalSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - }); - - addAccount(starknetConnector.id, result.account); - if (resolvedWallet) { - addWallet(resolvedWallet); - setActiveWallet(resolvedWallet.address) - return resolvedWallet; - } - } - } - catch (e) { - console.log(e) - throw e - } - } - - const disconnectWallets = async (connectorName?: string, address?: string) => { - try { - await disconnectAsync() - if (address) removeAccount(address) - } - catch (e) { - console.log(e) - } - } - - const availableConnectors: InternalConnector[] = connectors.map(connector => { - - const configuredName = connectorsConfigs.find(c => c.id === connector.id)?.name - const name = configuredName ?? connector.name - - return { - name: name, - id: connector.id, - icon: typeof connector.icon === 'string' ? connector.icon : (connector.icon.light.startsWith('data:') ? connector.icon.light : `data:image/svg+xml;base64,${btoa(connector.icon.light.replaceAll('currentColor', '#FFFFFF'))}`), - type: connector?.["_wallet"] ? 'injected' : 'other', - installUrl: connectorsConfigs.find(c => c.id === connector.id)?.installLink, - extensionNotFound: !connector?.["_wallet"] && connectorsConfigs.find(c => c.id === connector.id)?.installLink !== undefined, - providerName: name - } - }) - - const switchAccount = async (connector: Wallet, address: string): Promise => { - setActiveWallet(address); - }; - const provider: WalletProvider = { - connectWallet, - switchAccount, - connectedWallets: starknetWallets, - activeWallet, - withdrawalSupportedNetworks, - autofillSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - availableConnectors, - name, - id, - providerIcon: networks.find(n => starknetNames.some(name => name === n.caip2Id))?.logoUrl, - ready: connectors.length > 0, - } - - return provider -} - - -type ResolveStarknetWalletProps = { - name: string, - connector: Connector; - network: Network | undefined; - nodeUrl: string | undefined; - disconnectWallets: (connectorName?: string, address?: string) => Promise; - address: string, - withdrawalSupportedNetworks: string[] - autofillSupportedNetworks?: string[], - asSourceSupportedNetworks?: string[] -} - -export async function resolveStarknetWallet(props: ResolveStarknetWalletProps): Promise { - const { name, connector, network, nodeUrl, disconnectWallets, address, withdrawalSupportedNetworks, autofillSupportedNetworks, asSourceSupportedNetworks } = props; - try { - const walletChain = network?.chainId; - const { RpcProvider, WalletAccount } = await import('starknet') - const rpcProvider = new RpcProvider({ nodeUrl: nodeUrl }) - - const walletAccount = new WalletAccount({ provider: rpcProvider, walletProvider: (connector as any).wallet, address }) - - const accounts = await walletAccount.requestAccounts(true) - const account = accounts?.[0]; - - const configuredName = connectorsConfigs.find(c => c.id === connector.id)?.name - const connectorName = configuredName ?? connector.name - - const wallet: Wallet = { - id: connectorName, - displayName: `${connectorName} - Starknet`, - address: account, - addresses: [account], - chainId: walletChain || '', - icon: resolveWalletConnectorIcon({ connector: connectorName, address: account }), - providerName: name, - metadata: { - starknetAccount: walletAccount, - }, - isActive: true, - withdrawalSupportedNetworks, - disconnect: () => disconnectWallets(connector.name, account), - networkIcon: starknetNames.includes(network?.caip2Id || '') ? network?.logoUrl : undefined, - autofillSupportedNetworks, - asSourceSupportedNetworks - }; - - return wallet; - } catch (e) { - console.warn(`Failed to initialize wallet for ${connector.name}:`, e); - return null; - } -} - -const connectorsConfigs = [ - { - id: "braavos", - name: "Braavos", - installLink: "https://chromewebstore.google.com/detail/braavos-starknet-wallet/jnlgamecbpmbajjfhmmmlhejkemejdma" - }, - { - id: "argentX", - name: 'Ready X', - installLink: "https://chromewebstore.google.com/detail/argent-x-starknet-wallet/dlcobpjiigpikoobohmabehhmhfoodbb" - }, - { - id: "keplr", - name: 'Keplr', - installLink: "https://chromewebstore.google.com/detail/keplr/dmkamcknogkgcdfhhbddcghachkejeap" - }, - { - id: "xverse", - name: 'Xverse Wallet', - installLink: "https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg" - } -] diff --git a/apps/app/lib/wallets/tron/useTron.ts b/apps/app/lib/wallets/tron/useTron.ts deleted file mode 100644 index 83278304..00000000 --- a/apps/app/lib/wallets/tron/useTron.ts +++ /dev/null @@ -1,125 +0,0 @@ -import KnownInternalNames from "../../knownIds"; -import { useWallet } from '@tronweb3/tronwallet-adapter-react-hooks'; -import { InternalConnector, Wallet, WalletProvider } from "@/Models/WalletProvider"; -import { resolveWalletConnectorIcon } from "../utils/resolveWalletIcon"; -import { useSettingsState } from "@/context/settings"; -import { useMemo } from "react"; -import { useSyncProviders } from "../evm/connectors/useSyncProviders"; - -const name = 'Tron' -const id = 'tron' - -const commonSupportedNetworks = [ - KnownInternalNames.Networks.TronMainnet, - KnownInternalNames.Networks.TronNile -] - -export default function useTron(): WalletProvider { - const { networks } = useSettingsState() - const network = networks.find(n => commonSupportedNetworks.includes(n.caip2Id)) - const { wallets, wallet: tronWallet, disconnect, select } = useWallet(); - const eip6963Providers = useSyncProviders(); - const isMetaMaskAnnounced = eip6963Providers.some(p => p.info.rdns === 'io.metamask'); - const isTronLinkAnnounced = eip6963Providers.some(p => p.info.rdns === 'org.tronlink.www'); - - const address = tronWallet?.adapter.address - - const wallet: Wallet | undefined = address ? { - id: tronWallet.adapter.name, - addresses: [address], - address, - displayName: `${tronWallet.adapter.name} - Tron`, - networkIcon: network?.logoUrl, - providerName: name, - isActive: true, - icon: resolveWalletConnectorIcon({ connector: name, address, iconUrl: tronWallet.adapter.icon }), - disconnect: () => disconnectWallet(), - autofillSupportedNetworks: commonSupportedNetworks, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - } : undefined - - const getWallet = () => { - if (wallet) { - return [wallet] - } - return undefined - } - - const connectWallet = async ({ connector }: { connector: InternalConnector }) => { - const tronConnector = wallets.find(w => w.adapter.name === connector.name) - if (!tronConnector) throw new Error('Connector not found') - try { - select(tronConnector.adapter.name) - await tronConnector.adapter.connect() - - const connectedWallet = wallets.find(w => w.adapter.connected === true) - const connectedAddress = connectedWallet?.adapter.address - - const wallet: Wallet | undefined = connectedAddress ? { - address: connectedAddress, - providerName: name, - id: connectedWallet?.adapter.name, - displayName: `${connectedWallet.adapter.name} - Tron`, - networkIcon: network?.logoUrl, - icon: resolveWalletConnectorIcon({ connector: String(connectedWallet?.adapter.name), address: connectedAddress, iconUrl: connectedWallet?.adapter.icon }), - disconnect, - isActive: true, - addresses: [connectedAddress], - autofillSupportedNetworks: commonSupportedNetworks, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - } : undefined - return wallet - } - catch (e) { - const error = e - throw new Error(e.message || e); - } - } - - const disconnectWallet = async () => { - try { - await disconnect() - } - catch (e) { - console.log(e) - } - } - - const availableConnectors: InternalConnector[] = useMemo(() => wallets.map(wallet => { - const adapterName = wallet.adapter.name - const isLoading = wallet.state === 'Loading' - - const isMetaMaskMissing = adapterName === 'MetaMask' && !isMetaMaskAnnounced - const isTronLinkMissing = adapterName === 'TronLink' && !isTronLinkAnnounced - const isNotInstalled = wallet.state == 'NotFound' || isMetaMaskMissing || isTronLinkMissing - return { - id: adapterName, - name: adapterName, - icon: wallet.adapter.icon, - type: isNotInstalled ? 'other' : 'injected', - installUrl: wallet.adapter?.url, - extensionNotFound: isNotInstalled, - isLoadable: isLoading, - providerName: name - } - }), [wallets]) - - const provider: WalletProvider = { - connectWallet, - disconnectWallets: disconnectWallet, - availableConnectors, - connectedWallets: getWallet(), - activeWallet: wallet, - autofillSupportedNetworks: commonSupportedNetworks, - withdrawalSupportedNetworks: commonSupportedNetworks, - asSourceSupportedNetworks: commonSupportedNetworks, - name, - id, - providerIcon: network?.logoUrl, - ready: wallets.length > 0 - } - - return provider -} \ No newline at end of file diff --git a/apps/app/lib/wallets/utils/isMobile.ts b/apps/app/lib/wallets/utils/isMobile.ts deleted file mode 100644 index c06c5a1a..00000000 --- a/apps/app/lib/wallets/utils/isMobile.ts +++ /dev/null @@ -1,28 +0,0 @@ -//scrapped from rainbowkit -export function isAndroid(): boolean { - return ( - typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent) - ); - } - - export function isSmallIOS(): boolean { - return ( - typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent) - ); - } - - export function isLargeIOS(): boolean { - return ( - typeof navigator !== 'undefined' && - (/iPad/.test(navigator.userAgent) || - (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) - ); - } - - export function isIOS(): boolean { - return isSmallIOS() || isLargeIOS(); - } - - export function isMobile(): boolean { - return isAndroid() || isIOS(); - } \ No newline at end of file diff --git a/apps/app/lib/wallets/utils/resolveWalletIcon.tsx b/apps/app/lib/wallets/utils/resolveWalletIcon.tsx deleted file mode 100644 index 9a0cb75d..00000000 --- a/apps/app/lib/wallets/utils/resolveWalletIcon.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import AddressIcon from "../../../components/AddressIcon"; -import SVGWithImg from "../../../components/Icons/SvgWithImg"; -import WalletIcon from "../../../components/Icons/WalletIcon"; -import KnownAztecConnectors from "../aztec/KnownAztecConnectors"; -import KnownEVMConnectors from "../evm/KnownEVMConnectors"; -import KnownSolanaConnectors from "../solana/KnownSolanaConnectors"; -import KnownStarknetConnectors from "../starknet/KnownStarknetConnectors"; - -const connectors = [ - ...KnownEVMConnectors, - ...KnownSolanaConnectors, - ...KnownStarknetConnectors, - ...KnownAztecConnectors, -] - -export const resolveWalletConnectorIcon = ({ connector, address, iconUrl }: { connector?: string, address?: string, iconUrl?: string }) => { - const knownConnector = connectors.find(c => c.id === connector?.toLowerCase()) - - if (knownConnector && knownConnector.icon) return knownConnector.icon - else if (iconUrl) return SVGIconWrapper(iconUrl) - - if (address) return AddressIconWrapper(address) - else return WalletIcon -} - -export const resolveWalletConnectorIndex = (id: string) => { - return connectors.findIndex(c => c.id === id?.toLowerCase()) -} - -const AddressIconWrapper = (address: string) => (props: typeof AddressIcon) => { - return -} - -const SVGIconWrapper = (iconUrl: string) => (props) => { - return -} diff --git a/apps/app/lib/wallets/utils/sleep.ts b/apps/app/lib/wallets/utils/sleep.ts deleted file mode 100644 index a29e7df0..00000000 --- a/apps/app/lib/wallets/utils/sleep.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default function sleep(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); -} \ No newline at end of file diff --git a/apps/app/package.json b/apps/app/package.json index 0206ad26..8f39e5aa 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -7,7 +7,6 @@ "dev": "next dev", "build": "next build", "start": "next start", - "analyze": "cross-env ANALYZE=true next build", "build:workers": "tsc -p tsconfig.worker.json" }, "dependencies": { @@ -16,15 +15,22 @@ "@aztec/standard-contracts": "^5.1.0", "@aztec/stdlib": "^5.1.0", "@aztec/wallet-sdk": "^5.1.0", - "@cartridge/controller": "^0.10.7", "@coral-xyz/anchor": "catalog:", "@eth-optimism/contracts-ts": "^0.17.2", - "@fuels/react": "^0.43.2", "@grafana/faro-react": "^2.5.0", "@grafana/faro-web-sdk": "^2.5.0", "@grafana/faro-web-tracing": "^2.5.0", "@hugeicons/core-free-icons": "^4.0.0", "@hugeicons/react": "^1.1.6", + "@layerswap/ui-kit": "2.0.0-next.0", + "@layerswap/utils": "2.0.0-next.0", + "@layerswap/widget-types": "1.0.0-next.0", + "@layerswap/wallet-core": "2.0.0-next.0", + "@layerswap/wallet-evm": "2.0.0-next.0", + "@layerswap/wallet-fuel": "2.0.0-next.0", + "@layerswap/wallet-starknet": "2.0.0-next.0", + "@layerswap/wallet-svm": "2.0.0-next.0", + "@layerswap/wallet-tron": "2.0.0-next.0", "@noble/hashes": "^2.0.1", "@number-flow/react": "^0.5.11", "@radix-ui/react-accordion": "^1.1.2", @@ -36,17 +42,10 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.0.7", "@solana/spl-token": "catalog:", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-adapter-react": "^0.15.39", - "@solana/wallet-adapter-wallets": "^0.19.37", "@solana/web3.js": "catalog:", - "@starknet-io/types-js": "^0.10.0", - "@starknet-react/chains": "^5.0.3", - "@starknet-react/core": "^5.0.3", "@tailwindcss/forms": "^0.5.0", "@tailwindcss/typography": "^0.5.2", "@tanstack/react-query": "^5.59.20", - "@tanstack/react-virtual": "^3.13.18", "@tanstack/virtual-core": "^3.13.19", "@train-protocol/auth": "workspace:^", "@train-protocol/aztec": "workspace:^", @@ -57,78 +56,45 @@ "@train-protocol/solana": "workspace:^", "@train-protocol/starknet": "workspace:^", "@train-protocol/tron": "workspace:^", - "@tronweb3/tronwallet-adapter-bitkeep": "^1.1.5", - "@tronweb3/tronwallet-adapter-bybit": "^1.0.1", - "@tronweb3/tronwallet-adapter-foxwallet": "^1.0.1", - "@tronweb3/tronwallet-adapter-gatewallet": "^1.0.3", - "@tronweb3/tronwallet-adapter-imtoken": "^1.0.2", - "@tronweb3/tronwallet-adapter-ledger": "^1.1.11", - "@tronweb3/tronwallet-adapter-metamask-tron": "^1.0.0", - "@tronweb3/tronwallet-adapter-okxwallet": "^1.0.6", - "@tronweb3/tronwallet-adapter-react-hooks": "^1.1.10", - "@tronweb3/tronwallet-adapter-tokenpocket": "^1.0.6", - "@tronweb3/tronwallet-adapter-tronlink": "^1.1.12", - "@tronweb3/tronwallet-adapter-trust": "^1.0.0", "@uidotdev/usehooks": "^2.4.1", "@vercel/analytics": "^1.5.0", - "@walletconnect/ethereum-provider": "2.21.8", - "@walletconnect/types": "2.21.8", - "@walletconnect/universal-provider": "2.21.8", - "@walletconnect/utils": "2.21.8", "axios": "^1.19.0", - "bn.js": "^5.2.3", - "bs58": "^6.0.0", "buffer": "^6.0.3", "class-variance-authority": "^0.7.1", "clsx": "^1.2.1", "cmdk": "^1.1.1", "color": "4.2.3", "copy-to-clipboard": "^3.3.3", - "crypto-js": "^4.1.1", "formik": "^2.2.9", "framer-motion": "^12.42.2", "fuels": "catalog:", - "get-starknet-core": "^3.3.5", - "js-sha3": "^0.8.0", - "json-rpc-2.0": "1.7.0", "lucide-react": "^1.27.0", - "memoizee": "^0.4.17", "next": "16.3.0", "next-themes": "^0.4.6", - "qrcode.react": "^4.2.0", "radix-ui": "^1.4.3", "react": "catalog:", "react-dom": "catalog:", "react-use-intercom": "^2.0.0", "shadcn": "^4.1.2", - "socket.io-client": "^4.8.3", "starknet": "catalog:", - "starknetkit": "^3.2.0", "swr": "^2.2.5", "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.5", "tronweb": "^6.2.2", "tw-animate-css": "^1.4.0", - "uuid": "^11.1.1", "viem": "catalog:", "wagmi": "2.14.11", "zustand": "^4.5.7" }, "devDependencies": { - "@next/bundle-analyzer": "^16.3.0", "@tailwindcss/postcss": "^4.2.1", - "@types/bn.js": "^5.1.0", - "@types/crypto-js": "^4.1.1", "@types/node": "^20", "@types/react": "catalog:", "@types/react-dom": "^19.2.3", - "@web3-react/types": "^6.0.7", - "autoprefixer": "^10.4.5", - "file-loader": "^6.2.0", "tailwindcss": "^4.2.1", "typescript": "catalog:" }, "engines": { "node": ">=20.9.0" } -} +} \ No newline at end of file diff --git a/apps/app/stores/starknetWalletStore.ts b/apps/app/stores/starknetWalletStore.ts deleted file mode 100644 index 0d0a069a..00000000 --- a/apps/app/stores/starknetWalletStore.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { createWithEqualityFn as create } from 'zustand/traditional' -import { Wallet } from '../Models/WalletProvider' -import { createJSONStorage, persist } from 'zustand/middleware' - -type StarknetAccountMap = { [key: string]: string } - -interface StarknetStoreState { - connectedWallets: Wallet[] - connectWallet: (wallet: Wallet) => void - starknetAccounts?: StarknetAccountMap - addAccount: (connectorId: string, l1Address: string) => void; - removeAccount: (address: string) => void - activeWalletAddress?: string; - setActiveWallet: (address: string) => void; -} - -export const useStarknetStore = create()( - persist( - (set) => ({ - connectedWallets: [], - setActiveWallet: (address) => set({ activeWalletAddress: address }), - addAccount: (connectorId, l1Address) => - set((state) => { - const updatedAccounts = { - ...state.starknetAccounts, - [connectorId]: l1Address, - }; - const updatedState: Partial = { - starknetAccounts: updatedAccounts, - }; - return updatedState; - }), - removeAccount: (address) => - set((state) => { - const updatedAccounts = Object.entries(state.starknetAccounts || {}).reduce( - (acc, [key, value]) => { - if (value.toLowerCase() !== address.toLowerCase()) { - acc[key] = value; - } - return acc; - }, - {} - ); - - const updatedWallets = state.connectedWallets.filter( - (w) => w.address.toLowerCase() !== address.toLowerCase() - ); - - let newActiveAddress: string | undefined = state.activeWalletAddress; - if (state.activeWalletAddress?.toLowerCase() === address.toLowerCase()) { - newActiveAddress = updatedWallets.length > 0 ? updatedWallets[0].address : undefined; - } - return { - starknetAccounts: updatedAccounts, - connectedWallets: updatedWallets, - activeWalletAddress: newActiveAddress - }; - }), - connectWallet: (wallet) => set((state) => { - if (state.connectedWallets.find(w => w.providerName == wallet.providerName && w.id == wallet.id && w.address == wallet.address)) { - return state - } - return ({ - connectedWallets: [ - ...state.connectedWallets, - wallet - ] - }) - }) - }), - { - name: 'ls-starknet-accounts', - storage: createJSONStorage(() => localStorage), - partialize: (state) => ({ - starknetAccounts: state.starknetAccounts, - activeWalletAddress: state.activeWalletAddress, - }), - } - ) -) \ No newline at end of file diff --git a/apps/app/stores/walletStore.ts b/apps/app/stores/walletStore.ts index 815f4310..8dabdc43 100644 --- a/apps/app/stores/walletStore.ts +++ b/apps/app/stores/walletStore.ts @@ -1,6 +1,5 @@ import { createWithEqualityFn as create } from 'zustand/traditional' -import { Wallet } from '../Models/WalletProvider'; - +import type { Wallet } from "@layerswap/widget-types"; interface WalletState { connectedWallets: Wallet[]; connectWallet: (wallet: Wallet) => void; @@ -36,4 +35,4 @@ export const useWalletStore = create()((set) => ({ disconnectWallet: (providerName, connectorName) => set((state) => ({ connectedWallets: state.connectedWallets.filter(w => connectorName ? !(w.providerName == providerName && w.id == connectorName) : w.providerName != providerName) })) -})) \ No newline at end of file +})) diff --git a/apps/app/styles/globals.css b/apps/app/styles/globals.css index e75affe1..bf77b3b4 100644 --- a/apps/app/styles/globals.css +++ b/apps/app/styles/globals.css @@ -1,7 +1,9 @@ @import 'tailwindcss'; @import 'tw-animate-css'; @import 'shadcn/tailwind.css'; +@import './ui-kit-overrides.css'; @config '../tailwind.config.js'; +@source "../node_modules/@layerswap/ui-kit/dist/esm"; @custom-variant dark (&:is([data-theme="default"] *, [data-theme="mist"] *)); diff --git a/apps/app/styles/ui-kit-overrides.css b/apps/app/styles/ui-kit-overrides.css new file mode 100644 index 00000000..9ef5b64b --- /dev/null +++ b/apps/app/styles/ui-kit-overrides.css @@ -0,0 +1,11 @@ +/* Train-specific styling for semantic slots rendered by @layerswap/ui-kit. */ +[data-slot="checkbox"][data-state="checked"] { + background-color: var(--color-primary); + border-color: var(--color-primary); + color: var(--color-primary-buttonTextColor); +} + +p.bg-primary-700.text-primary-buttonTextColor { + background-color: var(--color-secondary-100); + color: var(--color-secondary-text); +} diff --git a/local-packages/layerswap-ui-kit-2.0.0-next.0.tgz b/local-packages/layerswap-ui-kit-2.0.0-next.0.tgz new file mode 100644 index 00000000..8f0ada8f Binary files /dev/null and b/local-packages/layerswap-ui-kit-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-utils-2.0.0-next.0.tgz b/local-packages/layerswap-utils-2.0.0-next.0.tgz new file mode 100644 index 00000000..23e0e91c Binary files /dev/null and b/local-packages/layerswap-utils-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-core-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-core-2.0.0-next.0.tgz new file mode 100644 index 00000000..bec67261 Binary files /dev/null and b/local-packages/layerswap-wallet-core-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz new file mode 100644 index 00000000..8633ff7f Binary files /dev/null and b/local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz new file mode 100644 index 00000000..9aadf702 Binary files /dev/null and b/local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz new file mode 100644 index 00000000..8561e91f Binary files /dev/null and b/local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz new file mode 100644 index 00000000..f3bba3de Binary files /dev/null and b/local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz b/local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz new file mode 100644 index 00000000..ae5cdaf0 Binary files /dev/null and b/local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz differ diff --git a/local-packages/layerswap-widget-types-1.0.0-next.0.tgz b/local-packages/layerswap-widget-types-1.0.0-next.0.tgz new file mode 100644 index 00000000..f9c50548 Binary files /dev/null and b/local-packages/layerswap-widget-types-1.0.0-next.0.tgz differ diff --git a/package.json b/package.json index e20c57a8..4ce9017b 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,16 @@ } }, "overrides": { + "@layerswap/ui-kit": "file:./local-packages/layerswap-ui-kit-2.0.0-next.0.tgz", + "@layerswap/utils": "file:./local-packages/layerswap-utils-2.0.0-next.0.tgz", + "@layerswap/widget-types": "file:./local-packages/layerswap-widget-types-1.0.0-next.0.tgz", + "@layerswap/wallet-core": "file:./local-packages/layerswap-wallet-core-2.0.0-next.0.tgz", + "@layerswap/wallet-evm": "file:./local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz", + "@layerswap/wallet-fuel": "file:./local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz", + "@layerswap/wallet-starknet": "file:./local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz", + "@layerswap/wallet-svm": "file:./local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz", + "@layerswap/wallet-tron": "file:./local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz", "@radix-ui/react-dismissable-layer": "1.1.1", - "@walletconnect/universal-provider": "2.21.8", - "@walletconnect/ethereum-provider": "2.21.8", "@aztec/aztec.js": "catalog:", "elliptic": ">=6.6.1", "ws": ">=8.21.0", diff --git a/packages/blockchains/solana/src/client/wallet/redeemSolver.ts b/packages/blockchains/solana/src/client/wallet/redeemSolver.ts index 7bc1ade3..b131e7d7 100644 --- a/packages/blockchains/solana/src/client/wallet/redeemSolver.ts +++ b/packages/blockchains/solana/src/client/wallet/redeemSolver.ts @@ -14,7 +14,8 @@ export async function redeemSolver( const tx = await buildRedeemSolverTx(connection, program, walletPublicKey, params) try { - const signature = await signer.sendTransaction(tx) + const signed = await signer.signTransaction(tx) + const signature = await connection.sendRawTransaction(signed.serialize()) const res = await connection.confirmTransaction({ blockhash: tx.recentBlockhash!, lastValidBlockHeight: tx.lastValidBlockHeight!, diff --git a/packages/blockchains/solana/src/client/wallet/refund.ts b/packages/blockchains/solana/src/client/wallet/refund.ts index 912f02a6..938be4cb 100644 --- a/packages/blockchains/solana/src/client/wallet/refund.ts +++ b/packages/blockchains/solana/src/client/wallet/refund.ts @@ -14,7 +14,8 @@ export async function refund( const tx = await buildRefundTx(connection, program, walletPublicKey, params) try { - const signature = await signer.sendTransaction(tx) + const signed = await signer.signTransaction(tx) + const signature = await connection.sendRawTransaction(signed.serialize()) const res = await connection.confirmTransaction({ blockhash: tx.recentBlockhash!, lastValidBlockHeight: tx.lastValidBlockHeight!, diff --git a/packages/blockchains/solana/src/client/wallet/userLock.ts b/packages/blockchains/solana/src/client/wallet/userLock.ts index bc941ff9..016b2135 100644 --- a/packages/blockchains/solana/src/client/wallet/userLock.ts +++ b/packages/blockchains/solana/src/client/wallet/userLock.ts @@ -16,7 +16,8 @@ export async function userLock( let signature: string try { - signature = await signer.sendTransaction(tx) + const signed = await signer.signTransaction(tx) + signature = await connection.sendRawTransaction(signed.serialize()) } catch (e: any) { console.error('[SolanaHTLC] sendTransaction failed', e?.message ?? String(e), e?.logs ?? []) throw e diff --git a/packages/blockchains/solana/src/types.ts b/packages/blockchains/solana/src/types.ts index 9c1d9cc1..58591d7d 100644 --- a/packages/blockchains/solana/src/types.ts +++ b/packages/blockchains/solana/src/types.ts @@ -26,12 +26,15 @@ export type SolanaWalletSignConfig = { /** * Framework-agnostic Solana signer. - * The app wraps @solana/wallet-adapter-react hooks into this interface. + * + * Signing only — the wallet never touches the network. The client owns the sole + * `Connection` and uses it to build, broadcast and confirm, so the blockhash and + * the preflight can never come from differently configured endpoints. */ export interface SolanaSigner { /** Base58 public key string */ publicKey: string - sendTransaction(tx: Transaction | VersionedTransaction): Promise + signTransaction(tx: T): Promise } export type SolanaHTLCPublicClientConfig = { diff --git a/packages/react/src/providers/TrainProvider.tsx b/packages/react/src/providers/TrainProvider.tsx index f1c332b1..f972eec9 100644 --- a/packages/react/src/providers/TrainProvider.tsx +++ b/packages/react/src/providers/TrainProvider.tsx @@ -85,8 +85,18 @@ export function TrainProvider({ // adapterVersion in deps ensures these callbacks get new references when adapters register, // which propagates through walletValue → walletCtx → consumer useMemos. const createClient = useCallback((networkId: Caip2Id): IHTLCPublicClient => { - return findAdapter(networkId).createClient(sdk, networkId) - }, [findAdapter, sdk, adapterVersion]) + const { namespace } = parseCaip2Id(networkId) + const adapter = adaptersRef.current.get(namespace) + if (adapter) return adapter.createClient(sdk, networkId) + const rpcUrl = config.resolveNodeUrls?.(networkId)?.[0] + if (!rpcUrl) { + throw new Error( + `No RPC URL resolvable for network "${networkId}". ` + + `Pass resolveNodeUrls to TrainProvider or register a wallet adapter for "${namespace}".` + ) + } + return sdk.createHTLCPublicClient(namespace, { rpcUrl }) + }, [sdk, adapterVersion, config.resolveNodeUrls]) const createWriteClient = useCallback((networkId: Caip2Id, address?: string): IHTLCWalletClient => { return findAdapter(networkId).createWriteClient(sdk, networkId, address) diff --git a/packages/react/src/wallet/WalletContext.ts b/packages/react/src/wallet/WalletContext.ts index e5fded64..c99e225f 100644 --- a/packages/react/src/wallet/WalletContext.ts +++ b/packages/react/src/wallet/WalletContext.ts @@ -5,7 +5,7 @@ import type { Caip2Id, ChainNamespace } from '../internal/branded' export interface WalletContextValue { registerAdapter: (adapter: TrainWalletAdapter) => () => void - /** Create a public HTLC client for the given network (delegates to adapter) */ + /** Create a public HTLC client for the given network (uses an adapter or RPC fallback) */ createClient: (networkId: Caip2Id) => IHTLCPublicClient /** Create a wallet HTLC client with signer for the given network (delegates to adapter). * @param address - When provided, use this specific account as signer. */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 251f9726..28b099b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,9 +50,16 @@ catalogs: version: 4.5.7 overrides: + '@layerswap/ui-kit': file:./local-packages/layerswap-ui-kit-2.0.0-next.0.tgz + '@layerswap/utils': file:./local-packages/layerswap-utils-2.0.0-next.0.tgz + '@layerswap/widget-types': file:./local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@layerswap/wallet-core': file:./local-packages/layerswap-wallet-core-2.0.0-next.0.tgz + '@layerswap/wallet-evm': file:./local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz + '@layerswap/wallet-fuel': file:./local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz + '@layerswap/wallet-starknet': file:./local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz + '@layerswap/wallet-svm': file:./local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz + '@layerswap/wallet-tron': file:./local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz '@radix-ui/react-dismissable-layer': 1.1.1 - '@walletconnect/universal-provider': 2.21.8 - '@walletconnect/ethereum-provider': 2.21.8 '@aztec/aztec.js': ^5.1.0 elliptic: '>=6.6.1' ws: '>=8.21.0' @@ -120,18 +127,12 @@ importers: '@aztec/wallet-sdk': specifier: ^5.1.0 version: 5.1.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@cartridge/controller': - specifier: ^0.10.7 - version: 0.10.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@coral-xyz/anchor': specifier: 'catalog:' version: 0.30.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@eth-optimism/contracts-ts': specifier: ^0.17.2 - version: 0.17.2(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)(wagmi@2.14.11(@react-native-async-storage/async-storage@1.24.0)(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))) - '@fuels/react': - specifier: ^0.43.2 - version: 0.43.2(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fuels@0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 0.17.2(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)(wagmi@2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))) '@grafana/faro-react': specifier: ^2.5.0 version: 2.9.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -147,6 +148,33 @@ importers: '@hugeicons/react': specifier: ^1.1.6 version: 1.1.6(react@19.2.8) + '@layerswap/ui-kit': + specifier: file:../../local-packages/layerswap-ui-kit-2.0.0-next.0.tgz + version: file:local-packages/layerswap-ui-kit-2.0.0-next.0.tgz(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/utils': + specifier: file:../../local-packages/layerswap-utils-2.0.0-next.0.tgz + version: file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': + specifier: file:../../local-packages/layerswap-wallet-core-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/wallet-evm': + specifier: file:../../local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(wagmi@2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/wallet-fuel': + specifier: file:../../local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz(2cf27901872c4758b305211ceaad2364) + '@layerswap/wallet-starknet': + specifier: file:../../local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/wallet-svm': + specifier: file:../../local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz(@babel/runtime@7.28.6)(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@solana/sysvars@2.3.0(typescript@7.0.2))(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/wallet-tron': + specifier: file:../../local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz + version: file:local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': + specifier: file:../../local-packages/layerswap-widget-types-1.0.0-next.0.tgz + version: file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz '@noble/hashes': specifier: ^2.0.1 version: 2.0.1 @@ -180,27 +208,9 @@ importers: '@solana/spl-token': specifier: 'catalog:' version: 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-base': - specifier: ^0.9.27 - version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-react': - specifier: ^0.15.39 - version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.8)(typescript@7.0.2) - '@solana/wallet-adapter-wallets': - specifier: ^0.19.37 - version: 0.19.37(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0)(@solana/sysvars@2.3.0(typescript@7.0.2))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@solana/web3.js': specifier: 'catalog:' version: 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@starknet-io/types-js': - specifier: ^0.10.0 - version: 0.10.0 - '@starknet-react/chains': - specifier: ^5.0.3 - version: 5.0.3 - '@starknet-react/core': - specifier: ^5.0.3 - version: 5.0.3(bufferutil@4.1.0)(get-starknet-core@3.3.5(starknet@8.9.2))(react@19.2.8)(starknet@8.9.2)(typescript@7.0.2)(utf-8-validate@5.0.10) '@tailwindcss/forms': specifier: ^0.5.0 version: 0.5.11(tailwindcss@4.2.1) @@ -210,9 +220,6 @@ importers: '@tanstack/react-query': specifier: ^5.59.20 version: 5.90.21(react@19.2.8) - '@tanstack/react-virtual': - specifier: ^3.13.18 - version: 3.13.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@tanstack/virtual-core': specifier: ^3.13.19 version: 3.13.19 @@ -243,69 +250,15 @@ importers: '@train-protocol/tron': specifier: workspace:^ version: link:../../packages/blockchains/tron - '@tronweb3/tronwallet-adapter-bitkeep': - specifier: ^1.1.5 - version: 1.1.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-bybit': - specifier: ^1.0.1 - version: 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-foxwallet': - specifier: ^1.0.1 - version: 1.0.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-gatewallet': - specifier: ^1.0.3 - version: 1.0.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-imtoken': - specifier: ^1.0.2 - version: 1.0.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-ledger': - specifier: ^1.1.11 - version: 1.1.13(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-metamask-tron': - specifier: ^1.0.0 - version: 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-okxwallet': - specifier: ^1.0.6 - version: 1.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-react-hooks': - specifier: ^1.1.10 - version: 1.1.12(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tokenpocket': - specifier: ^1.0.6 - version: 1.0.9(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': - specifier: ^1.1.12 - version: 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-trust': - specifier: ^1.0.0 - version: 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@vercel/analytics': specifier: ^1.5.0 version: 1.6.1(next@16.3.0(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) - '@walletconnect/ethereum-provider': - specifier: 2.21.8 - version: 2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': - specifier: 2.21.8 - version: 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': - specifier: 2.21.8 - version: 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/utils': - specifier: 2.21.8 - version: 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) axios: specifier: '>=1.19.0' version: 1.19.0 - bn.js: - specifier: '>=5.2.3 <6' - version: 5.2.3 - bs58: - specifier: ^6.0.0 - version: 6.0.0 buffer: specifier: ^6.0.3 version: 6.0.3 @@ -324,9 +277,6 @@ importers: copy-to-clipboard: specifier: ^3.3.3 version: 3.3.3 - crypto-js: - specifier: ^4.1.1 - version: 4.2.0 formik: specifier: ^2.2.9 version: 2.4.9(@types/react@19.2.17)(react@19.2.8) @@ -336,30 +286,15 @@ importers: fuels: specifier: 'catalog:' version: 0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))) - get-starknet-core: - specifier: ^3.3.5 - version: 3.3.5(starknet@8.9.2) - js-sha3: - specifier: ^0.8.0 - version: 0.8.0 - json-rpc-2.0: - specifier: 1.7.0 - version: 1.7.0 lucide-react: specifier: ^1.27.0 version: 1.27.0(react@19.2.8) - memoizee: - specifier: ^0.4.17 - version: 0.4.17 next: specifier: 16.3.0 version: 16.3.0(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - qrcode.react: - specifier: ^4.2.0 - version: 4.2.0(react@19.2.8) radix-ui: specifier: ^1.4.3 version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -375,15 +310,9 @@ importers: shadcn: specifier: ^4.1.2 version: 4.1.2(@types/node@20.19.34)(typescript@7.0.2) - socket.io-client: - specifier: ^4.8.3 - version: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) starknet: specifier: 'catalog:' version: 8.9.2 - starknetkit: - specifier: ^3.2.0 - version: 3.4.3(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@react-native-async-storage/async-storage@1.24.0)(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(starknet@8.9.2)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10) swr: specifier: ^2.2.5 version: 2.4.0(react@19.2.8) @@ -399,31 +328,19 @@ importers: tw-animate-css: specifier: ^1.4.0 version: 1.4.0 - uuid: - specifier: ^11.1.1 - version: 11.1.1 viem: specifier: 'catalog:' version: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) wagmi: specifier: 2.14.11 - version: 2.14.11(@react-native-async-storage/async-storage@1.24.0)(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + version: 2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) zustand: specifier: ^4.5.7 version: 4.5.7(@types/react@19.2.17)(react@19.2.8) devDependencies: - '@next/bundle-analyzer': - specifier: ^16.3.0 - version: 16.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@tailwindcss/postcss': specifier: ^4.2.1 version: 4.2.1 - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 - '@types/crypto-js': - specifier: ^4.1.1 - version: 4.2.2 '@types/node': specifier: ^20 version: 20.19.34 @@ -433,15 +350,6 @@ importers: '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.17) - '@web3-react/types': - specifier: ^6.0.7 - version: 6.0.7 - autoprefixer: - specifier: ^10.4.5 - version: 10.4.27(postcss@8.5.26) - file-loader: - specifier: ^6.2.0 - version: 6.2.0 tailwindcss: specifier: ^4.2.1 version: 4.2.1 @@ -683,9 +591,6 @@ importers: packages: - '@adobe/css-tools@4.4.4': - resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} @@ -1306,10 +1211,6 @@ packages: resolution: {integrity: sha512-sGDPH1nW2EhJzjzHyINvTQwDNGRzdq/2vVzFwwrmFOHtIBaRjXGqo7wKj/JoJoNjuRSGeXz/EmaahRq0pgxzqw==} engines: {node: '>= 10'} - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - '@dotenvx/dotenvx@1.59.1': resolution: {integrity: sha512-Qg+meC+XFxliuVSDlEPkKnaUjdaJKK6FNx/Wwl2UxhQR8pyPIuLhMavsF7ePdB9qFZUWV1jEK3ckbJir/WmF4w==} hasBin: true @@ -1531,6 +1432,96 @@ packages: resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} engines: {node: '>=18'} + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@fivebinaries/coin-selection@3.0.0': resolution: {integrity: sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==} @@ -1626,13 +1617,6 @@ packages: engines: {node: ^20.0.0 || ^22.0.0 || ^24.0.0} hasBin: true - '@fuels/react@0.43.2': - resolution: {integrity: sha512-xcAAB4ahtYKPxjxb+zv93BSANksNAfCxjBNasUwKJ8rnRRksfLHJYb4YLCOU8vVLM8pGcwWj7rSr+6je5uJKww==} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - fuels: 0.101.1 - react: '>=18.0.0' - '@fuels/vm-asm@0.60.2': resolution: {integrity: sha512-wkCu63jTGJWpRZQirTaB8S4/gyoebEJLk3AKfnykt/lgWp1U9iHOcCICVHQP547i+y8jEVKwk18+huINFyYVFQ==} @@ -1922,30 +1906,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jest/diff-sequences@30.3.0': - resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect-utils@30.3.0': - resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/types@30.3.0': - resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1987,8 +1947,91 @@ packages: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} - '@ledgerhq/devices@6.27.1': - resolution: {integrity: sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ==} + '@layerswap/ui-kit@file:local-packages/layerswap-ui-kit-2.0.0-next.0.tgz': + resolution: {integrity: sha512-lZll+Hyp9IR+ZM4iQb6j4EcefaWNLERlaDOYGrhbgRkU+KZXe6vvyR6XOgegtcjVPRBoX4/vO3grFKAr2++6ew==, tarball: file:local-packages/layerswap-ui-kit-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + react: ^18.0 || ^19.0.0 || ^19.0.0-rc + zustand: ^4.5.7 + + '@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz': + resolution: {integrity: sha512-lVQRBqKVoGvWvcWLroxrAfhbHkEEfUf8a76AHlyZsV55wCy5Zdw3igomZWkR/6F4wUsUTClwqn68txtPwqpURw==, tarball: file:local-packages/layerswap-utils-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + react: ^18.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + react: + optional: true + + '@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz': + resolution: {integrity: sha512-adR968BFLIzQ3XUUfM9OLmgGpoGJV8bhzlGSCdfj82IdlVOLXnD9E5IDOFQlVUv+V21VEcR1+PvujhHReDk4tw==, tarball: file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + react: ^18.0 || ^19.0.0 || ^19.0.0-rc + zustand: ^4.5.7 + + '@layerswap/wallet-evm@file:local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz': + resolution: {integrity: sha512-ujtMTQFNQAZBPalGf9R53mSqXptMwu0hMOMmqlzAjSlDAluEQ7R9QgNjJeZ1NfM/DU3feqgU1N5g9BOhZMaSkw==, tarball: file:local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + '@layerswap/utils': ^2.0.0-next.0 + '@layerswap/wallet-core': ^2.0.0-next.0 + '@layerswap/widget-types': ^1.0.0-next.0 + viem: ^2.21.16 + wagmi: 2.14.11 + zustand: ^4.5.7 + + '@layerswap/wallet-fuel@file:local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz': + resolution: {integrity: sha512-5JLEeam6I6oFstT/IOW8bOTiQTFtkE9/T0eKFYvSGuHqSBg+DtmzruUAWhkGgaHYDetnp4R8yWd53fzSgp1bvw==, tarball: file:local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + '@layerswap/utils': ^2.0.0-next.0 + '@layerswap/wallet-core': ^2.0.0-next.0 + '@layerswap/widget-types': ^1.0.0-next.0 + '@wagmi/core': 2.16.4 + viem: ^2.21.16 + wagmi: 2.14.11 + zustand: ^4.5.7 + + '@layerswap/wallet-starknet@file:local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz': + resolution: {integrity: sha512-ngADZllY5S7szBmdnXxjZMUlwM6nbUN/1Jch6kuck3T3wnNa7FO5Uwxxh1DbNjux/kq9/NIWAb9XcosqHY7nLA==, tarball: file:local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + '@layerswap/utils': ^2.0.0-next.0 + '@layerswap/wallet-core': ^2.0.0-next.0 + '@layerswap/widget-types': ^1.0.0-next.0 + zustand: ^4.5.7 + + '@layerswap/wallet-svm@file:local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz': + resolution: {integrity: sha512-piyEvC145QqQyb0mT/uetCCdaA4L5ivEEcqowdt7woYAiw+wjgnhbyzUIr7KVE3QgpJVfz7S2enJDmTgn/AUCg==, tarball: file:local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + '@layerswap/utils': ^2.0.0-next.0 + '@layerswap/wallet-core': ^2.0.0-next.0 + '@layerswap/widget-types': ^1.0.0-next.0 + zustand: ^4.5.7 + + '@layerswap/wallet-tron@file:local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz': + resolution: {integrity: sha512-XGPgnDYGX3/ZYi5UKyshuTY+4MmPsWeMNiqWY6MPOzkQq9bWq67EHwGGDTxiQ682F3SnegnvbSqMaY/TIWzYKA==, tarball: file:local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz} + version: 2.0.0-next.0 + engines: {node: '>=22'} + peerDependencies: + '@layerswap/utils': ^2.0.0-next.0 + '@layerswap/wallet-core': ^2.0.0-next.0 + '@layerswap/widget-types': ^1.0.0-next.0 + zustand: ^4.5.7 + + '@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz': + resolution: {integrity: sha512-/pbjDUtC7UkEBoL/Pkz1b7E/OYL4Aug514Xuz/vlzmxQirq5bVce3t1+M+JoRjwgPkRyyOdA5k/Fyug1WFltkw==, tarball: file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz} + version: 1.0.0-next.0 + engines: {node: '>=18'} '@ledgerhq/devices@8.10.0': resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} @@ -1996,18 +2039,9 @@ packages: '@ledgerhq/errors@6.29.0': resolution: {integrity: sha512-mmDsGN662zd0XGKyjzSKkg+5o1/l9pvV1HkVHtbzaydvHAtRypghmVoWMY9XAQDLXiUBXGIsLal84NgmGeuKWA==} - '@ledgerhq/hw-app-trx@6.29.2': - resolution: {integrity: sha512-sLb5IiGf2Sqc64iUMcudt+YyJ/J68YhpupxAQDnEsyhDTrxxrn4ihRIxeYTYOSUwsSP/VNZaAuL+zqn3IqsA0w==} - - '@ledgerhq/hw-transport-webhid@6.27.1': - resolution: {integrity: sha512-u74rBYlibpbyGblSn74fRs2pMM19gEAkYhfVibq0RE1GNFjxDMFC1n7Sb+93Jqmz8flyfB4UFJsxs8/l1tm2Kw==} - '@ledgerhq/hw-transport-webhid@6.31.0': resolution: {integrity: sha512-XtCFOJ1ooaqCefB6WDfV/ie+GaO/7xQgezwRpyLroMBYboSpnEd3Diu3BAoptXKTNklwZEiUVRLVXlltTBzNvw==} - '@ledgerhq/hw-transport@6.27.1': - resolution: {integrity: sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ==} - '@ledgerhq/hw-transport@6.32.0': resolution: {integrity: sha512-bf2nxzDQ21DV/bsmExfWI0tatoVeoqhu/ePWalD/nPgPnTn/ZIDq7VBU+TY5p0JZaE87NQwmRUAjm6C1Exe61A==} @@ -2017,6 +2051,9 @@ packages: '@lit-labs/ssr-dom-shim@1.5.1': resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@lit/reactive-element@2.1.2': resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} @@ -2154,6 +2191,31 @@ packages: '@module-federation/sdk@0.1.21': resolution: {integrity: sha512-r7xPiAm+O4e+8Zvw+8b4ToeD0D0VJD004nHmt+Y8r/l98J2eA6di72Vn1FeyjtQbCrFtiMw3ts/dlqtcmIBipw==} + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.18.0': + resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/svelte@10.16.4': + resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@motionone/vue@10.16.4': + resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + '@msgpack/msgpack@3.1.2': resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} @@ -2196,9 +2258,6 @@ packages: resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} engines: {node: '>=18'} - '@next/bundle-analyzer@16.3.0': - resolution: {integrity: sha512-o8OiXKIATcSC6kHm5BIEmaDEDTFUDhpy9POQIbzAQTlb8NWwFhEQheTLFSbyQXxH2ywhjZ/e8EUlbOjj2k22Yg==} - '@next/env@16.3.0': resolution: {integrity: sha512-o9r1S0BNiNreHP9Vs+Qnqd9kviDkJh8xIACY7UFZSmiGbbQRzPBBosvHzAU4TULHOIuOj/18RSsyz2qrREmIFw==} @@ -2499,12 +2558,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.5.1': - resolution: {integrity: sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.8.0': resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} engines: {node: ^18.19.0 || >=20.6.0} @@ -2624,7 +2677,7 @@ packages: '@paulmillr/qr@0.2.1': resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} - deprecated: 'The package is now available as "qr": npm install qr' + deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -2633,9 +2686,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@project-serum/sol-wallet-adapter@0.2.6': resolution: {integrity: sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==} engines: {node: '>=10'} @@ -2645,6 +2695,9 @@ packages: '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/primitive@1.0.0': + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + '@radix-ui/primitive@1.1.0': resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} @@ -2768,6 +2821,11 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-compose-refs@1.0.0': + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + '@radix-ui/react-compose-refs@1.1.0': resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: @@ -2799,14 +2857,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-context@1.1.0': - resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + '@radix-ui/react-context@1.0.0': + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + react: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-context@1.1.2': resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} @@ -2826,18 +2880,11 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.1': - resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + '@radix-ui/react-dialog@1.0.0': + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-dialog@1.1.15': resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} @@ -2887,14 +2934,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.0': - resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + '@radix-ui/react-focus-guards@1.0.0': + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + react: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-focus-guards@1.1.3': resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} @@ -2905,18 +2948,11 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.0': - resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + '@radix-ui/react-focus-scope@1.0.0': + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} @@ -2957,14 +2993,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + '@radix-ui/react-id@1.0.0': + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + react: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} @@ -3079,18 +3111,11 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.1': - resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + '@radix-ui/react-portal@1.0.0': + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} @@ -3105,18 +3130,11 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.0': - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + '@radix-ui/react-presence@1.0.0': + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} @@ -3131,6 +3149,12 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@1.0.0': + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + '@radix-ui/react-primitive@2.0.0': resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: @@ -3274,6 +3298,11 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-slot@1.0.0': + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + '@radix-ui/react-slot@1.1.0': resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: @@ -3392,6 +3421,11 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-use-callback-ref@1.0.0': + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -3410,14 +3444,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + '@radix-ui/react-use-controllable-state@1.0.0': + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + react: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-use-controllable-state@1.2.2': resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} @@ -3464,14 +3494,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + '@radix-ui/react-use-layout-effect@1.0.0': + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + react: ^16.8 || ^17.0 || ^18.0 '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} @@ -3525,11 +3551,6 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-native-async-storage/async-storage@1.24.0': - resolution: {integrity: sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==} - peerDependencies: - react-native: ^0.0.0-0 || >=0.60 <1.0 - '@reown/appkit-common@1.7.2': resolution: {integrity: sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==} @@ -3724,9 +3745,6 @@ packages: '@sinclair/typebox@0.33.22': resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -3950,24 +3968,6 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5': - resolution: {integrity: sha512-xfQl6Kee0ZXagUG5mpy+bMhQTNf2LAzF65m5SSgNJp47y/nP9GdXWi9blVH8IPP+QjF/+DnCtURaXS14bk3WJw==} - peerDependencies: - '@solana/web3.js': ^1.58.0 - - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5': - resolution: {integrity: sha512-kCI+0/umWm98M9g12ndpS56U6wBzq4XdhobCkDPF8qRDYX/iTU8CD+QMcalh7VgRT7GWEmySQvQdaugM0Chf0g==} - peerDependencies: - react-native: '>0.69' - - '@solana-mobile/wallet-adapter-mobile@2.2.5': - resolution: {integrity: sha512-Zpzfwm3N4FfI63ZMs2qZChQ1j0z+p2prkZbSU51NyTnE+K9l9sDAl8RmRCOWnE29y+/AN10WuQZQoIAccHVOFg==} - peerDependencies: - '@solana/web3.js': ^1.58.0 - - '@solana-mobile/wallet-standard-mobile@0.4.4': - resolution: {integrity: sha512-LMvqkS5/aEH+EiDje9Dk351go6wO3POysgmobM4qm8RsG5s6rDAW3U0zA+5f2coGCTyRx8BKE1I/9nHlwtBuow==} - '@solana-program/compute-budget@0.8.0': resolution: {integrity: sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==} peerDependencies: @@ -4031,12 +4031,6 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-core@4.0.0': - resolution: {integrity: sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-data-structures@2.0.0-rc.1': resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} peerDependencies: @@ -4059,12 +4053,6 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-numbers@4.0.0': - resolution: {integrity: sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-strings@2.0.0-rc.1': resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} peerDependencies: @@ -4078,13 +4066,6 @@ packages: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5.3.3' - '@solana/codecs-strings@4.0.0': - resolution: {integrity: sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==} - engines: {node: '>=20.18.0'} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.3.3' - '@solana/codecs@2.0.0-rc.1': resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} peerDependencies: @@ -4109,13 +4090,6 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/errors@4.0.0': - resolution: {integrity: sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - '@solana/fast-stable-stringify@2.3.0': resolution: {integrity: sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==} engines: {node: '>=20.18.0'} @@ -4428,18 +4402,11 @@ packages: peerDependencies: '@solana/web3.js': ^1.98.0 - '@solana/wallet-adapter-phantom@0.9.28': - resolution: {integrity: sha512-g/hcuWwWjzo5l8I4vor9htniVhLxd/GhoVK52WSd0hy8IZ8/FBnV3u8ABVTheLqO13d0IVy+xTxoVBbDaMjLog==} - engines: {node: '>=20'} - peerDependencies: - '@solana/web3.js': ^1.98.0 - - '@solana/wallet-adapter-react@0.15.39': - resolution: {integrity: sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==} + '@solana/wallet-adapter-phantom@0.9.29': + resolution: {integrity: sha512-nAFvjtX2S1aRLzi70CSLajsmixGxev+1O1GzGzety4eyfv2AYxTHEuDIJySugcMTtSTleVpOMhHXjzlUkxuf1w==} engines: {node: '>=20'} peerDependencies: '@solana/web3.js': ^1.98.0 - react: '*' '@solana/wallet-adapter-safepal@0.5.22': resolution: {integrity: sha512-K1LlQIPoKgg3rdDIVUtMV218+uUM1kCtmuVKq2N+e+ZC8zK05cW3w7++nakDtU97AOmg+y4nsSFRCFsWBWmhTw==} @@ -4465,8 +4432,8 @@ packages: peerDependencies: '@solana/web3.js': ^1.98.0 - '@solana/wallet-adapter-solflare@0.6.32': - resolution: {integrity: sha512-FIqNyooif3yjPnw2gPNBZnsG6X9JYSrwCf1Oa0NN4/VxQcPjzGqvc+Tq1+js/nBOHju5roToeMFTbwNTdEOuZw==} + '@solana/wallet-adapter-solflare@0.6.33': + resolution: {integrity: sha512-eYDjpXMF+LyfWf5jG89IqJG2ehaEsWvv7P3y3NjPmhCqe0WjfFc2EwED19G4R0JUqdhnY5zFj+gn3pJ3ystGhg==} engines: {node: '>=20'} peerDependencies: '@solana/web3.js': ^1.98.0 @@ -4525,8 +4492,8 @@ packages: peerDependencies: '@solana/web3.js': ^1.98.0 - '@solana/wallet-adapter-wallets@0.19.37': - resolution: {integrity: sha512-LUHK2Zh6gELt0+kt+viIMxqc/bree65xZgTPXXBzjhbJNKJaV4D4wanYG2LM9O35/avehZ5BTLMHltbkibE+GA==} + '@solana/wallet-adapter-wallets@0.19.38': + resolution: {integrity: sha512-uwWP3DZe8uG9X80SMHo8+NvXaat8ChBnZExTcvQVQhxhvzsYdS04YyVhCiU0zFyPpmkZuBCsArHXDQnFr1XhjA==} engines: {node: '>=20'} peerDependencies: '@solana/web3.js': ^1.98.0 @@ -4541,10 +4508,6 @@ packages: resolution: {integrity: sha512-Us3TgL4eMVoVWhuC4UrePlYnpWN+lwteCBlhZDUhFZBJ5UMGh94mYPXno3Ho7+iHPYRtuCi/ePvPcYBqCGuBOw==} engines: {node: '>=16'} - '@solana/wallet-standard-core@1.1.2': - resolution: {integrity: sha512-FaSmnVsIHkHhYlH8XX0Y4TYS+ebM+scW7ZeDkdXo3GiKge61Z34MfBPinZSUMV08hCtzxxqH2ydeU9+q/KDrLA==} - engines: {node: '>=16'} - '@solana/wallet-standard-features@1.3.0': resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} engines: {node: '>=16'} @@ -4560,34 +4523,68 @@ packages: '@solana/web3.js': ^1.98.0 bs58: ^6.0.0 - '@solana/wallet-standard-wallet-adapter-react@1.1.4': - resolution: {integrity: sha512-xa4KVmPgB7bTiWo4U7lg0N6dVUtt2I2WhEnKlIv0jdihNvtyhOjCKMjucWet6KAVhir6I/mSWrJk1U9SvVvhCg==} - engines: {node: '>=16'} - peerDependencies: - '@solana/wallet-adapter-base': '*' - react: '*' - - '@solana/wallet-standard-wallet-adapter@1.1.4': - resolution: {integrity: sha512-YSBrxwov4irg2hx9gcmM4VTew3ofNnkqsXQ42JwcS6ykF1P1ecVY8JCbrv75Nwe6UodnqeoZRbN7n/p3awtjNQ==} - engines: {node: '>=16'} - - '@solana/wallet-standard@1.1.4': - resolution: {integrity: sha512-NF+MI5tOxyvfTU4A+O5idh/gJFmjm52bMwsPpFGRSL79GECSN0XLmpVOO/jqTKJgac2uIeYDpQw/eMaQuWuUXw==} - engines: {node: '>=16'} - '@solana/web3.js@1.98.4': resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - '@solflare-wallet/metamask-sdk@1.0.3': - resolution: {integrity: sha512-os5Px5PTMYKGS5tzOoyjDxtOtj0jZKnbI1Uwt8+Jsw1HHIA+Ib2UACCGNhQ/un2f8sIbTfLD1WuucNMOy8KZpQ==} - peerDependencies: - '@solana/web3.js': '*' - '@solflare-wallet/sdk@1.4.2': resolution: {integrity: sha512-jrseNWipwl9xXZgrzwZF3hhL0eIVxuEtoZOSLmuPuef7FgHjstuTtNJAeT4icA7pzdDV4hZvu54pI2r2f7SmrQ==} peerDependencies: '@solana/web3.js': '*' + '@stablelib/aead@1.0.1': + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + '@stablelib/chacha20poly1305@1.0.1': + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + + '@stablelib/chacha@1.0.1': + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + + '@stablelib/constant-time@1.0.1': + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + + '@stablelib/ed25519@1.0.3': + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + + '@stablelib/hash@1.0.1': + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + + '@stablelib/hkdf@1.0.1': + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + + '@stablelib/hmac@1.0.1': + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + + '@stablelib/poly1305@1.0.1': + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/sha256@1.0.1': + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + + '@stablelib/sha512@1.0.1': + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -4628,6 +4625,7 @@ packages: '@stellar/stellar-base@14.0.4': resolution: {integrity: sha512-UbNW6zbdOBXJwLAV2mMak0bIC9nw3IZVlQXkv2w2dk1jgCbJjy3oRVC943zeGE5JAm0Z9PHxrIjmkpGhayY7kw==} engines: {node: '>=20.0.0'} + deprecated: This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support. '@stellar/stellar-sdk@14.2.0': resolution: {integrity: sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==} @@ -4749,12 +4747,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.19': - resolution: {integrity: sha512-KzwmU1IbE0IvCZSm6OXkS+kRdrgW2c2P3Ho3NC+zZXWK6oObv/L+lcV/2VuJ+snVESRlMJ+w/fg4WXI/JzoNGQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.19': resolution: {integrity: sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==} @@ -4786,10 +4778,6 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - '@testing-library/jest-dom@5.17.0': - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} - '@testing-library/react@14.3.1': resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} engines: {node: '>=14'} @@ -4972,22 +4960,10 @@ packages: resolution: {integrity: sha512-2KGvaL5auUfAzf8TZQDE7y/dAP59sN4hdYDU5AjVgIlVpGMRWIgE4hzCaYAzk9hkQK/xaltmku24OprmJ7DwnQ==} engines: {node: '>=16', pnpm: '>=7'} - '@tronweb3/tronwallet-adapter-foxwallet@1.0.2': - resolution: {integrity: sha512-FmuYhrZqBfeGRz+s5EzDJmyBq6Su+aAb0wcyp6VS5Z1Ng9J5MpLkqWT0TgkdF8GbYy8aS3fu46BkvRbji9gt7A==} - engines: {node: '>=16', pnpm: '>=7'} - '@tronweb3/tronwallet-adapter-gatewallet@1.0.5': resolution: {integrity: sha512-5ioI8+XH8nrYD7G1NmUbEvvNTSE+3otEKzmxafas1awGsV8QZ1GGtqQtOyY4d6RRjoFv3SAE1UB0UDV6GIg5Og==} engines: {node: '>=18', pnpm: '>=9'} - '@tronweb3/tronwallet-adapter-imtoken@1.0.4': - resolution: {integrity: sha512-4g0/I+eIi9sbTEl4oe4VeLFHhqkfnFFYT91CKMXh7n9VfDSKDIfUubhlr3mILMqPUSGDXdke+yO22uUtXMZU9Q==} - engines: {node: '>=16', pnpm: '>=7'} - - '@tronweb3/tronwallet-adapter-ledger@1.1.13': - resolution: {integrity: sha512-pMjO9dxIFA53WsTbUTXA4NPocST4qXXDvpXx7WMTvm1ingBliOH5Jn2YwKFQ6B1dbcU/hBXWNGO6dN/K9ATmyQ==} - engines: {node: '>=16', pnpm: '>=7'} - '@tronweb3/tronwallet-adapter-metamask-tron@1.0.3': resolution: {integrity: sha512-3nWoHc6oX9GbrDJeChfXDupHPI6u+EMY/mSLEoN6MdGUSJwF057UzQ1nDzcgPWt+ySVOyk4NeIHr45e2608xlg==} engines: {node: '>=16', pnpm: '>=7'} @@ -4996,17 +4972,6 @@ packages: resolution: {integrity: sha512-WX/e3LHxl7Bw78C7GTrKC4Aq+zh/oTgx9iWJ8HacEAFxe7HLsglyPt7tI8zr79yuXQEg4ryok2eO/foLY4KRQQ==} engines: {node: '>=16', pnpm: '>=7'} - '@tronweb3/tronwallet-adapter-react-hooks@1.1.12': - resolution: {integrity: sha512-L7qTkfQ/usd2m3TbNCRC6qH6Jp6HwES0CpHR3xxYjScLeOxBlhvOSXmfjkE9sK0m+jR4iTKsExEXV+J0P88ERA==} - engines: {node: '>=16', pnpm: '>=7'} - peerDependencies: - react: '*' - react-dom: '*' - - '@tronweb3/tronwallet-adapter-tokenpocket@1.0.9': - resolution: {integrity: sha512-7WykmtFbC6Pelg6QrNt7fms1Wn3NlNsvx2UyGBPtEOFblSZJmbx37K1sjD9qSBiEV3gaE951ye0w8CgS6oQ2lg==} - engines: {node: '>=16', pnpm: '>=7'} - '@tronweb3/tronwallet-adapter-tronlink@1.1.14': resolution: {integrity: sha512-knfKownZrSU37LyvEe7eD2n2Aq5AaacapBDX29/LYjXN20jraZrF4Kh/waAKuoY8muOSUME29CQWOr3JZ96J7A==} engines: {node: '>=16', pnpm: '>=7'} @@ -5063,9 +5028,6 @@ packages: '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} @@ -5079,9 +5041,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/crypto-js@4.2.2': - resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -5096,21 +5055,6 @@ packages: peerDependencies: '@types/react': '*' - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -5139,15 +5083,9 @@ packages: '@types/request@2.48.13': resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/testing-library__jest-dom@5.14.9': - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -5172,12 +5110,6 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -5390,15 +5322,6 @@ packages: resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} engines: {node: '>=16'} - '@wallet-standard/core@1.1.1': - resolution: {integrity: sha512-5Xmjc6+Oe0hcPfVc5n8F77NVLwx1JVAoCVgQpLyv/43/bhtIif+Gx3WUrDlaSDoM8i2kA2xd6YoFbHCxs+e0zA==} - engines: {node: '>=16'} - - '@wallet-standard/errors@0.1.1': - resolution: {integrity: sha512-V8Ju1Wvol8i/VDyQOHhjhxmMVwmKiwyxUZBnHhtiPZJTWY0U/Shb2iEWyGngYEbAkp2sGTmEeNX1tVyGR7PqNw==} - engines: {node: '>=16'} - hasBin: true - '@wallet-standard/features@1.1.0': resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} engines: {node: '>=16'} @@ -5407,6 +5330,22 @@ packages: resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} engines: {node: '>=16'} + '@walletconnect/core@2.17.0': + resolution: {integrity: sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.19.0': + resolution: {integrity: sha512-AEoyICLHQEnjijZr9XsL4xtFhC5Cmu0RsEGxAxmwxbfGvAcYcSCNp1fYq0Q6nHc8jyoPOALpwySTle300Y1vxw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.19.1': + resolution: {integrity: sha512-rMvpZS0tQXR/ivzOxN1GkHvw3jRRMlI/jRX5g7ZteLgg2L0ZcANsFvAU5IxILxIKcIkTCloF9TcfloKVbK3qmw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} + '@walletconnect/core@2.21.8': resolution: {integrity: sha512-MD1SY7KAeHWvufiBK8C1MwP9/pxxI7SnKi/rHYfjco2Xvke+M+Bbm2OzvuSN7dYZvwLTkZCiJmBccTNVPCpSUQ==} engines: {node: '>=18'} @@ -5418,6 +5357,10 @@ packages: '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + '@walletconnect/ethereum-provider@2.17.0': + resolution: {integrity: sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/ethereum-provider@2.21.8': resolution: {integrity: sha512-yjDlPpGMkuSXoIdmX7q7K7mDjPBqBqRW3hjXExhrRpbScdP92ZEFHoJf3E4ALDxdaV894ivXrOmMyGsoY5Eexg==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' @@ -5440,6 +5383,9 @@ packages: '@walletconnect/jsonrpc-utils@1.0.8': resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + '@walletconnect/jsonrpc-ws-connection@1.0.14': + resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} + '@walletconnect/jsonrpc-ws-connection@1.0.16': resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} @@ -5457,15 +5403,44 @@ packages: '@walletconnect/logger@3.0.2': resolution: {integrity: sha512-7wR3wAwJTOmX4gbcUZcFMov8fjftY05+5cO/d4cpDD8wDzJ+cIlKdYOXaXfxHLSYeDazMXIsxMYjHYVDfkx+nA==} + '@walletconnect/modal-core@2.7.0': + resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} + + '@walletconnect/modal-ui@2.7.0': + resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} + + '@walletconnect/modal@2.7.0': + resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} + deprecated: Please follow the migration guide on https://docs.reown.com/appkit/upgrade/wcm + '@walletconnect/relay-api@1.0.11': resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + '@walletconnect/relay-auth@1.0.4': + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + '@walletconnect/relay-auth@1.1.0': resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + '@walletconnect/sign-client@2.17.0': + resolution: {integrity: sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.19.0': + resolution: {integrity: sha512-+GkuJzPK9SPq+RZgdKHNOvgRagxh/hhYWFHOeSiGh3DyAQofWuFTq4UrN/MPjKOYswSSBKfIa+iqKYsi4t8zLQ==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.19.1': + resolution: {integrity: sha512-OgBHRPo423S02ceN3lAzcZ3MYb1XuLyTTkKqLmKp/icYZCyRzm3/ynqJDKndiBLJ5LTic0y07LiZilnliYqlvw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/sign-client@2.21.8': resolution: {integrity: sha512-lTcUbMjQ0YUZ5wzCLhpBeS9OkWYgLLly6BddEp2+pm4QxiwCCU2Nao0nBJXgzKbZYQOgrEGqtdm/7ze67gjzRA==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' @@ -5482,6 +5457,9 @@ packages: '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + '@walletconnect/types@2.17.0': + resolution: {integrity: sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA==} + '@walletconnect/types@2.19.0': resolution: {integrity: sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==} @@ -5497,13 +5475,38 @@ packages: '@walletconnect/types@2.23.6': resolution: {integrity: sha512-ZoAa/TnNzq1hfh4b7J+GU5IXaYidWw469N4nSji5irPg2KQXvQWW+mhzswGrzYEzD3K/OTFzo0bdkhYVrvTTMw==} + '@walletconnect/universal-provider@2.17.0': + resolution: {integrity: sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.19.0': + resolution: {integrity: sha512-e9JvadT5F8QwdLmd7qBrmACq04MT7LQEe1m3X2Fzvs3DWo8dzY8QbacnJy4XSv5PCdxMWnua+2EavBk8nrI9QA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.19.1': + resolution: {integrity: sha512-4rdLvJ2TGDIieNWW3sZw2MXlX65iHpTuKb5vyvUHQtjIVNLj+7X/09iUAI/poswhtspBK0ytwbH+AIT/nbGpjg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/universal-provider@2.21.8': resolution: {integrity: sha512-Nc1Z6VXnya152yucNDPnlTkrhG289tCUfcjiWqDmwNYzFSfdT5oJQHlnffQXlvoks90kn5Ru8Rnwag2CH1YOVQ==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/utils@2.17.0': + resolution: {integrity: sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ==} + '@walletconnect/utils@2.19.0': resolution: {integrity: sha512-LZ0D8kevknKfrfA0Sq3Hf3PpmM8oWyNfsyWwFR51t//2LBgtN2Amz5xyoDDJcjLibIbKAxpuo/i0JYAQxz+aPA==} + '@walletconnect/utils@2.19.1': + resolution: {integrity: sha512-aOwcg+Hpph8niJSXLqkU25pmLR49B8ECXp5gFQDW5IeVgXHoOoK7w8a79GBhIBheMLlIt1322sTKQ7Rq5KzzFg==} + + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + '@walletconnect/utils@2.21.8': resolution: {integrity: sha512-HtMraGJ9qXo55l4wGSM1aZvyz0XVv460iWhlRGAyRl9Yz8RQeKyXavDhwBfcTFha/6kwLxPExqQ+MURtKeVVXw==} @@ -5516,9 +5519,6 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@web3-react/types@6.0.7': - resolution: {integrity: sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A==} - '@xrplf/isomorphic@1.0.1': resolution: {integrity: sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==} engines: {node: '>=16.0.0'} @@ -5580,14 +5580,8 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} @@ -5607,14 +5601,6 @@ packages: ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -5659,10 +5645,6 @@ packages: aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} @@ -5712,13 +5694,6 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - autoprefixer@10.4.27: - resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: '>=8.5.23' - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -5743,6 +5718,10 @@ packages: resolution: {integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==} engines: {node: '>=0.12.0'} + base58-js@3.0.3: + resolution: {integrity: sha512-3hf42BysHnUqmZO7mK6e5X/hs1AvyEJIhdVLbG/Mxn/fhFnhGxOO37mWbMHg1RT4TxqcPKXgqj9/bp1YG0GBXA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5755,6 +5734,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + bech32@2.0.0: resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} @@ -5762,9 +5744,6 @@ packages: resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} engines: {node: '>=0.6'} - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} @@ -5791,6 +5770,9 @@ packages: bip66@2.0.0: resolution: {integrity: sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ==} + bitcoin-address-validation@3.0.0: + resolution: {integrity: sha512-R1X1c9EdgjgjTpjshjk5e16TbgF7HYasxBcu7l5ScWMxVs53845vMUg5PvnQ/R/3h8Grly6Y52DgH6/77gazLQ==} + bitcoin-ops@1.4.1: resolution: {integrity: sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==} @@ -5975,10 +5957,6 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -6001,10 +5979,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - cipher-base@1.0.7: resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} engines: {node: '>= 0.10'} @@ -6049,6 +6023,12 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmdk@0.2.1: + resolution: {integrity: sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: @@ -6120,10 +6100,6 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} - engines: {node: '>=20'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -6131,10 +6107,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -6247,9 +6219,6 @@ packages: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -6258,10 +6227,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -6276,9 +6241,6 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6448,9 +6410,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -6482,10 +6441,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} @@ -6540,32 +6495,21 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + es-toolkit@1.39.3: resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} es-toolkit@1.44.0: resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild@0.25.3: resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} engines: {node: '>=18'} @@ -6582,21 +6526,9 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -6626,6 +6558,9 @@ packages: ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@6.13.5: resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} engines: {node: '>=14.0.0'} @@ -6637,9 +6572,6 @@ packages: ev-emitter@2.1.2: resolution: {integrity: sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==} - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -6690,10 +6622,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expect@30.3.0: - resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - express-rate-limit@8.3.1: resolution: {integrity: sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==} engines: {node: '>= 16'} @@ -6704,9 +6632,6 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -6777,12 +6702,6 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-loader@6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -6844,9 +6763,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.42.2: resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: @@ -6939,12 +6855,6 @@ packages: get-size@3.0.0: resolution: {integrity: sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==} - get-starknet-core@3.3.5: - resolution: {integrity: sha512-EiXfbVp1ZIKc4jjGA5hEyNsy9rnkH4ALpiMCD+4G2jtqo/Gq4TrcVzh//mJclLA8yHRh3576H1vbAeH5zA1CiQ==} - deprecated: Package no longer supported. Please use @starknet-io/get-starknet-core - peerDependencies: - starknet: ^5.18.0 - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -7007,10 +6917,6 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -7066,6 +6972,9 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -7083,9 +6992,6 @@ packages: html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} @@ -7150,10 +7056,6 @@ packages: resolution: {integrity: sha512-AiohS3H80sXO6owEltjGX+glb7qXaDhBoJb9XcQVH4UI207xu/bDLUcadVKp7Qe576reg9yr/PXZjV5qx8gfbA==} engines: {node: '>=18'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflation@2.1.0: resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} engines: {node: '>= 0.8.0'} @@ -7274,21 +7176,10 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -7391,30 +7282,6 @@ packages: engines: {node: '>=8'} hasBin: true - jest-diff@30.3.0: - resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-matcher-utils@30.3.0: - resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-message-util@30.3.0: - resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-mock@30.3.0: - resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-util@30.3.0: - resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -7426,9 +7293,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} @@ -7463,9 +7327,6 @@ packages: json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -7718,12 +7579,21 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + lit-element@4.2.2: resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + lit-html@3.3.2: resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + lit@3.1.0: resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} @@ -7738,10 +7608,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -7815,8 +7681,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lucide-react@0.379.0: + resolution: {integrity: sha512-KcdeVPqmhRldldAAgptb8FjIunM2x2Zy26ZBh1RsEUcdLIvsEmbcw7KpzFYUy5BbpGeWhPu9Z9J5YXfStiXwhg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 lucide-react@1.27.0: resolution: {integrity: sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw==} @@ -7845,18 +7713,10 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memoizee@0.4.17: - resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} - engines: {node: '>=0.12'} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} - merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -7910,10 +7770,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -7965,9 +7821,8 @@ packages: motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} + motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -8027,9 +7882,6 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@16.3.0: resolution: {integrity: sha512-NEdGOzH+08eTXMUp9UYkA99Nhi5N6Thrhc1jgFOQgfgnGK/dA2hRwBpXep+exdFQrnwlRf/3Wixyp8lLBUpE2A==} engines: {node: '>=20.9.0'} @@ -8204,10 +8056,6 @@ packages: openapi-typescript-helpers@0.0.15: resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - ora@8.2.0: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} @@ -8439,9 +8287,6 @@ packages: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.26: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} @@ -8450,9 +8295,6 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} - preact@10.23.0: - resolution: {integrity: sha512-Pox0jeY4q6PGkFB5AsXni+zHxxx/sAYFIFZzukW4nIpoJLRziRX0xC4WjZENlkSrDQvqVgZcaZzZ/NL8/A+H/w==} - preact@10.28.4: resolution: {integrity: sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==} @@ -8460,10 +8302,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@30.3.0: - resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -8503,6 +8341,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-compare@2.6.0: resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} @@ -8516,36 +8357,25 @@ packages: pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - pushdata-bitcoin@1.0.1: resolution: {integrity: sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==} qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + qrcode-generator@2.0.4: + resolution: {integrity: sha512-mZSiP6RnbHl4xL2Ap5HfkjLnmxfKcPWpWe/c+5XxCuetEenqmNFf1FH/ftXPCtFG5/TDobjsjz6sSNL0Sr8Z9g==} + qrcode.react@1.0.1: resolution: {integrity: sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg==} peerDependencies: react: ^15.5.3 || ^16.0.0 || ^17.0.0 - qrcode.react@4.2.0: - resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - qrcode@1.5.3: resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} engines: {node: '>=10.13.0'} hasBin: true - qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true - qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -8616,9 +8446,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} @@ -8634,6 +8461,12 @@ packages: react: ~16 react-dom: ~16 + react-qrcode-logo@4.1.0: + resolution: {integrity: sha512-drcieitJFX3u66XpFn+4PxsCzrQo5nAMXsyOtiuTZCJPUQwGwysIlr14MjKbXDhBNz3iOqM8/yV5K1mllt/mTw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -8644,8 +8477,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.5.7: - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + react-remove-scroll@2.5.4: + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -8720,10 +8553,6 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} @@ -8859,9 +8688,8 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} sdp@2.12.0: resolution: {integrity: sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==} @@ -8883,11 +8711,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -8987,17 +8810,9 @@ packages: simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - slow-redact@0.3.2: resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} @@ -9049,10 +8864,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -9151,10 +8962,6 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} @@ -9250,10 +9057,6 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - timers-ext@0.1.8: - resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} - engines: {node: '>=0.12'} - tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} @@ -9314,10 +9117,6 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} @@ -9328,6 +9127,9 @@ packages: tronweb@6.2.2: resolution: {integrity: sha512-jRBf4+7fJ0HUVzveBi0tE21r3EygCNtbYE92T38Sxlwr/x320W2vz+dvGLOIpp4kW/CvJ4HLvtnb6U30A0V2eA==} + tronweb@6.4.0: + resolution: {integrity: sha512-WyrjHKN6YSnV/Dvc4cdULDyXVKJfj4bqQ/8dib6FlOaQ1T/EiOjLtOx24hDgcn8lY/iVMy4Axchzurk1wGcRJg==} + trpc-browser@1.4.4: resolution: {integrity: sha512-5ZH/LqSoF008W8KU+4tfQ+g3F4Yl6BywDUnSlx5jT6fKa87mm8PkIXfhjGN1k6LoxjpMjy82bxvQzNLkJ3vUvw==} peerDependencies: @@ -9388,9 +9190,6 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -9551,9 +9350,6 @@ packages: upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urijs@1.19.11: resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} @@ -9622,6 +9418,18 @@ packages: resolution: {integrity: sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==} engines: {node: '>= 0.10'} + valtio@1.11.2: + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + valtio@1.13.2: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} @@ -9778,11 +9586,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} - engines: {node: '>= 10.13.0'} - hasBin: true - webrtc-adapter@7.7.1: resolution: {integrity: sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A==} engines: {node: '>=6.0.0', npm: '>=3.10.0'} @@ -9975,8 +9778,6 @@ packages: snapshots: - '@adobe/css-tools@4.4.4': {} - '@adraffy/ens-normalize@1.10.1': {} '@adraffy/ens-normalize@1.11.1': {} @@ -11210,57 +11011,14 @@ snapshots: '@cartridge/controller-wasm@0.3.19': {} - '@cartridge/controller@0.10.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': - dependencies: - '@cartridge/controller-wasm': 0.3.19 - '@cartridge/penpal': 6.2.4 - '@starknet-io/types-js': 0.9.1 - '@telegram-apps/sdk': 2.11.3 - '@turnkey/sdk-browser': 4.3.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/ethereum-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - bs58: 6.0.0 - cbor-x: 1.6.0 - ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - micro-sol-signer: 0.5.0 - mipd: 0.0.7(typescript@7.0.2) - open: 10.2.0 - starknet: 8.9.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - - '@cartridge/controller@0.10.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@cartridge/controller@0.10.7(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@cartridge/controller-wasm': 0.3.19 '@cartridge/penpal': 6.2.4 '@starknet-io/types-js': 0.9.1 '@telegram-apps/sdk': 2.11.3 '@turnkey/sdk-browser': 4.3.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/ethereum-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/ethereum-provider': 2.21.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) bs58: 6.0.0 cbor-x: 1.6.0 ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -11395,8 +11153,6 @@ snapshots: '@crate-crypto/node-eth-kzg-win32-arm64-msvc': 0.10.0 '@crate-crypto/node-eth-kzg-win32-x64-msvc': 0.10.0 - '@discoveryjs/json-ext@0.5.7': {} - '@dotenvx/dotenvx@1.59.1': dependencies: commander: 11.1.0 @@ -11497,7 +11253,7 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true - '@eth-optimism/contracts-ts@0.17.2(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)(wagmi@2.14.11(@react-native-async-storage/async-storage@1.24.0)(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))': + '@eth-optimism/contracts-ts@0.17.2(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)(wagmi@2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))': dependencies: '@testing-library/react': 14.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/change-case': 2.3.5 @@ -11507,7 +11263,7 @@ snapshots: viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) optionalDependencies: '@wagmi/core': 2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - wagmi: 2.14.11(@react-native-async-storage/async-storage@1.24.0)(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + wagmi: 2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -11563,6 +11319,261 @@ snapshots: '@ethereumjs/rlp': 5.0.2 ethereum-cryptography: 2.2.1 + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.3 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/providers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.3 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@fivebinaries/coin-selection@3.0.0': dependencies: '@emurgo/cardano-serialization-lib-browser': 13.2.1 @@ -11774,18 +11785,6 @@ snapshots: chalk: 4.1.2 cli-table: 0.3.11 - '@fuels/react@0.43.2(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fuels@0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-dialog': 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@tanstack/react-query': 5.90.21(react@19.2.8) - events: 3.3.0 - fuels: 0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))) - react: 19.2.8 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - react-dom - '@fuels/vm-asm@0.60.2': {} '@google-cloud/paginator@5.0.2': @@ -11850,7 +11849,7 @@ snapshots: '@opentelemetry/instrumentation-fetch': 0.219.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-xml-http-request': 0.219.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': 2.10.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -12036,33 +12035,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/diff-sequences@30.3.0': {} - - '@jest/expect-utils@30.3.0': - dependencies: - '@jest/get-type': 30.1.0 - - '@jest/get-type@30.1.0': {} - - '@jest/pattern@30.0.1': - dependencies: - '@types/node': 20.19.34 - jest-regex-util: 30.0.1 - - '@jest/schemas@30.0.5': - dependencies: - '@sinclair/typebox': 0.34.49 - - '@jest/types@30.3.0': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.34 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12132,32 +12104,271 @@ snapshots: dependencies: vary: 1.1.2 - '@ledgerhq/devices@6.27.1': + '@layerswap/ui-kit@file:local-packages/layerswap-ui-kit-2.0.0-next.0.tgz(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': dependencies: - '@ledgerhq/errors': 6.29.0 - '@ledgerhq/logs': 6.14.0 - rxjs: 6.6.7 - semver: 7.7.4 + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + clsx: 2.1.1 + cmdk: 0.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + color: 4.2.3 + framer-motion: 12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + lucide-react: 0.379.0(react@19.2.8) + radix-ui: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-qrcode-logo: 4.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react' + - '@types/react-dom' + - react-dom - '@ledgerhq/devices@8.10.0': + '@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8)': dependencies: - '@ledgerhq/errors': 6.29.0 - '@ledgerhq/logs': 6.14.0 - rxjs: 7.8.2 - semver: 7.7.3 + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + bitcoin-address-validation: 3.0.0 + bn.js: 5.2.3 + bs58: 6.0.0 + clsx: 2.1.1 + copy-to-clipboard: 3.3.3 + csstype: 3.2.3 + js-sha3: 0.8.0 + tailwind-merge: 3.5.0 + optionalDependencies: + react: 19.2.8 - '@ledgerhq/errors@6.29.0': {} + '@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': + dependencies: + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + react: 19.2.8 + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) - '@ledgerhq/hw-app-trx@6.29.2': + '@layerswap/wallet-evm@file:local-packages/layerswap-wallet-evm-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(wagmi@2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': dependencies: - '@ledgerhq/hw-transport': 6.32.0 + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@metamask/sdk': 0.34.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/ethereum-provider': 2.21.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) + js-sha3: 0.8.0 + viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + wagmi: 2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - supports-color + - typescript + - uploadthing + - utf-8-validate + - zod + + '@layerswap/wallet-fuel@file:local-packages/layerswap-wallet-fuel-2.0.0-next.0.tgz(2cf27901872c4758b305211ceaad2364)': + dependencies: + '@fuel-ts/account': 0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))) + '@fuel-ts/address': 0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))) + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@wagmi/core': 2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + fuels: 0.101.3(vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(jiti@2.6.1)(msw@2.12.14(@types/node@20.19.34)(typescript@7.0.2))) + json-rpc-2.0: 1.7.0 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + wagmi: 2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + - vitest + + '@layerswap/wallet-starknet@file:local-packages/layerswap-wallet-starknet-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': + dependencies: + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@starknet-io/get-starknet-core': 4.0.8 + '@starknet-io/types-js': 0.10.0 + '@starknet-react/core': 5.0.3(bufferutil@4.1.0)(react@19.2.8)(starknet@8.9.2)(typescript@7.0.2)(utf-8-validate@5.0.10) + bn.js: 5.2.3 + ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) + starknet: 8.9.2 + starknetkit: 3.4.3(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(starknet@8.9.2)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@chakra-ui/react' + - '@deno/kv' + - '@emotion/react' + - '@emotion/styled' + - '@netlify/blobs' + - '@planetscale/database' + - '@radix-ui/react-slot' + - '@react-native-async-storage/async-storage' + - '@scure/bip39' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@zxcvbn-ts/core' + - '@zxcvbn-ts/language-common' + - '@zxcvbn-ts/language-en' + - aws4fetch + - bufferutil + - class-variance-authority + - clsx + - colord + - db0 + - embla-carousel + - embla-carousel-react + - embla-carousel-wheel-gestures + - emittery + - encoding + - framer-motion + - get-starknet-core + - history + - i18next + - ioredis + - lightweight-charts + - object-hash + - popmotion + - react + - react-copy-to-clipboard + - react-i18next + - react-router-dom + - react-spring-bottom-sheet + - react-virtuoso + - swr + - tailwind-merge + - tailwindcss + - tailwindcss-animate + - typescript + - uploadthing + - url-join + - utf-8-validate + - zod + + '@layerswap/wallet-svm@file:local-packages/layerswap-wallet-svm-2.0.0-next.0.tgz(@babel/runtime@7.28.6)(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(@solana/sysvars@2.3.0(typescript@7.0.2))(@types/react@19.2.17)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': + dependencies: + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-wallets': 0.19.38(@babel/runtime@7.28.6)(@solana/sysvars@2.3.0(typescript@7.0.2))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@wallet-standard/app': 1.1.0 + '@walletconnect/ethereum-provider': 2.21.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.8 + '@walletconnect/universal-provider': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + bs58: 6.0.0 + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/runtime' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@sentry/types' + - '@solana/sysvars' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - ioredis + - react + - react-dom + - react-native + - supports-color + - tslib + - typescript + - uploadthing + - utf-8-validate + - ws + - zod + + '@layerswap/wallet-tron@file:local-packages/layerswap-wallet-tron-2.0.0-next.0.tgz(@layerswap/utils@file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8))(@layerswap/wallet-core@file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)))(@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8))': + dependencies: + '@layerswap/utils': file:local-packages/layerswap-utils-2.0.0-next.0.tgz(react@19.2.8) + '@layerswap/wallet-core': file:local-packages/layerswap-wallet-core-2.0.0-next.0.tgz(react@19.2.8)(zustand@4.5.7(@types/react@19.2.17)(react@19.2.8)) + '@layerswap/widget-types': file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz + '@tronweb3/tronwallet-adapter-bitkeep': 1.1.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-bybit': 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-gatewallet': 1.0.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-metamask-tron': 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-okxwallet': 1.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-trust': 1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tronweb: 6.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@layerswap/widget-types@file:local-packages/layerswap-widget-types-1.0.0-next.0.tgz': + dependencies: + csstype: 3.2.3 - '@ledgerhq/hw-transport-webhid@6.27.1': + '@ledgerhq/devices@8.10.0': dependencies: - '@ledgerhq/devices': 6.27.1 '@ledgerhq/errors': 6.29.0 - '@ledgerhq/hw-transport': 6.32.0 '@ledgerhq/logs': 6.14.0 + rxjs: 7.8.2 + semver: 7.7.3 + + '@ledgerhq/errors@6.29.0': {} '@ledgerhq/hw-transport-webhid@6.31.0': dependencies: @@ -12166,12 +12377,6 @@ snapshots: '@ledgerhq/hw-transport': 6.32.0 '@ledgerhq/logs': 6.14.0 - '@ledgerhq/hw-transport@6.27.1': - dependencies: - '@ledgerhq/devices': 6.27.1 - '@ledgerhq/errors': 6.29.0 - events: 3.3.0 - '@ledgerhq/hw-transport@6.32.0': dependencies: '@ledgerhq/devices': 8.10.0 @@ -12183,6 +12388,10 @@ snapshots: '@lit-labs/ssr-dom-shim@1.5.1': {} + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element@2.1.2': dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 @@ -12402,6 +12611,51 @@ snapshots: '@module-federation/sdk@0.1.21': {} + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/dom@10.18.0': + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/svelte@10.16.4': + dependencies: + '@motionone/dom': 10.18.0 + tslib: 2.8.1 + + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/vue@10.16.4': + dependencies: + '@motionone/dom': 10.18.0 + tslib: 2.8.1 + '@msgpack/msgpack@3.1.2': {} '@msgpack/msgpack@3.1.3': {} @@ -12433,13 +12687,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@next/bundle-analyzer@16.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - webpack-bundle-analyzer: 4.10.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@next/env@16.3.0': {} '@next/swc-darwin-arm64@16.3.0': @@ -12729,13 +12976,7 @@ snapshots: '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - - '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) @@ -12873,8 +13114,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@polka/url@1.0.0-next.29': {} - '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) @@ -12883,6 +13122,10 @@ snapshots: '@radix-ui/number@1.1.1': {} + '@radix-ui/primitive@1.0.0': + dependencies: + '@babel/runtime': 7.28.6 + '@radix-ui/primitive@1.1.0': {} '@radix-ui/primitive@1.1.3': {} @@ -13002,6 +13245,11 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@radix-ui/react-compose-refs@1.0.0(react@19.2.8)': + dependencies: + '@babel/runtime': 7.28.6 + react: 19.2.8 + '@radix-ui/react-compose-refs@1.1.0(@types/react@19.2.17)(react@19.2.8)': dependencies: react: 19.2.8 @@ -13028,11 +13276,10 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-context@1.1.0(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-context@1.0.0(react@19.2.8)': dependencies: + '@babel/runtime': 7.28.6 react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 '@radix-ui/react-context@1.1.2(@types/react@19.2.17)(react@19.2.8)': dependencies: @@ -13046,27 +13293,28 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-dialog@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dialog@1.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@19.2.8) + '@radix-ui/react-context': 1.0.0(react@19.2.8) '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@radix-ui/react-focus-guards': 1.0.0(react@19.2.8) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.0.0(react@19.2.8) + '@radix-ui/react-portal': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.0.0(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.0.0(react@19.2.8) aria-hidden: 1.2.6 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.5.7(@types/react@19.2.17)(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + react-remove-scroll: 2.5.4(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -13124,11 +13372,10 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-focus-guards@1.1.0(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-focus-guards@1.0.0(react@19.2.8)': dependencies: + '@babel/runtime': 7.28.6 react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.17)(react@19.2.8)': dependencies: @@ -13136,16 +13383,14 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-focus-scope@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/react-compose-refs': 1.0.0(react@19.2.8) + '@radix-ui/react-primitive': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.0.0(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -13189,12 +13434,11 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-id@1.1.0(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-id@1.0.0(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/react-use-layout-effect': 1.0.0(react@19.2.8) react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 '@radix-ui/react-id@1.1.1(@types/react@19.2.17)(react@19.2.8)': dependencies: @@ -13355,15 +13599,12 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-portal@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-portal@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/react-primitive': 1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -13375,15 +13616,13 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-presence@1.1.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-presence@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/react-compose-refs': 1.0.0(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.0.0(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -13395,6 +13634,13 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@radix-ui/react-primitive@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.28.6 + '@radix-ui/react-slot': 1.0.0(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/react-slot': 1.1.0(@types/react@19.2.17)(react@19.2.8) @@ -13551,6 +13797,12 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@radix-ui/react-slot@1.0.0(react@19.2.8)': + dependencies: + '@babel/runtime': 7.28.6 + '@radix-ui/react-compose-refs': 1.0.0(react@19.2.8) + react: 19.2.8 + '@radix-ui/react-slot@1.1.0(@types/react@19.2.17)(react@19.2.8)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.2.17)(react@19.2.8) @@ -13684,6 +13936,11 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@radix-ui/react-use-callback-ref@1.0.0(react@19.2.8)': + dependencies: + '@babel/runtime': 7.28.6 + react: 19.2.8 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.2.17)(react@19.2.8)': dependencies: react: 19.2.8 @@ -13696,12 +13953,11 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-controllable-state@1.0.0(react@19.2.8)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.17)(react@19.2.8) + '@babel/runtime': 7.28.6 + '@radix-ui/react-use-callback-ref': 1.0.0(react@19.2.8) react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.17)(react@19.2.8)': dependencies: @@ -13739,11 +13995,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-layout-effect@1.0.0(react@19.2.8)': dependencies: + '@babel/runtime': 7.28.6 react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.2.8)': dependencies: @@ -13782,11 +14037,6 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@react-native-async-storage/async-storage@1.24.0': - dependencies: - merge-options: 3.0.4 - optional: true - '@reown/appkit-common@1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: big.js: 6.2.2 @@ -13831,11 +14081,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-controllers@1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -13866,11 +14116,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-controllers@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@18.3.1) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -13901,11 +14151,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-controllers@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -13936,12 +14186,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-pay@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 valtio: 1.13.2(@types/react@19.2.17)(react@18.3.1) transitivePeerDependencies: @@ -13972,12 +14222,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-pay@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) transitivePeerDependencies: @@ -14016,12 +14266,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-scaffold-ui@1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.1.0 transitivePeerDependencies: @@ -14052,12 +14302,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-scaffold-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -14088,12 +14338,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-scaffold-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -14124,10 +14374,10 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-ui@1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.1.0 qrcode: 1.5.3 @@ -14159,10 +14409,10 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-ui@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 @@ -14194,10 +14444,10 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-ui@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 @@ -14229,14 +14479,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-utils@1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.2 '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14267,14 +14517,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-utils@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@18.3.1) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14305,14 +14555,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit-utils@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14365,17 +14615,17 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit@1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.2 - '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-scaffold-ui': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.1 + '@walletconnect/universal-provider': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) @@ -14407,18 +14657,18 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-pay': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.2.17)(react@18.3.1) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) @@ -14450,18 +14700,18 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@reown/appkit@1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-pay': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) @@ -14612,8 +14862,6 @@ snapshots: '@sinclair/typebox@0.33.22': {} - '@sinclair/typebox@0.34.49': {} - '@sindresorhus/merge-streams@4.0.0': {} '@smithy/abort-controller@4.2.10': @@ -14956,68 +15204,6 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2)': - dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)(typescript@7.0.2) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - bs58: 5.0.0 - js-base64: 3.7.8 - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - fastestsmallesttextencoderdecoder - - react - - react-native - - typescript - - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)(typescript@7.0.2)': - dependencies: - '@solana/codecs-strings': 4.0.0(typescript@7.0.2) - '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8) - '@solana/wallet-standard-util': 1.1.2 - '@wallet-standard/core': 1.1.1 - js-base64: 3.7.8 - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - bs58 - - fastestsmallesttextencoderdecoder - - react - - typescript - - '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2)': - dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2) - '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2) - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-features': 1.3.0 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - js-base64: 3.7.8 - optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - react - - react-native - - typescript - - '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2)': - dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)(typescript@7.0.2) - '@solana/wallet-standard-chains': 1.1.1 - '@solana/wallet-standard-features': 1.3.0 - '@wallet-standard/base': 1.1.0 - '@wallet-standard/features': 1.1.0 - bs58: 5.0.0 - js-base64: 3.7.8 - qrcode: 1.5.4 - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - fastestsmallesttextencoderdecoder - - react - - react-native - - typescript - '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(typescript@7.0.2)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: '@solana/kit': 2.3.0(typescript@7.0.2)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) @@ -15093,11 +15279,6 @@ snapshots: '@solana/errors': 2.3.0(typescript@7.0.2) typescript: 7.0.2 - '@solana/codecs-core@4.0.0(typescript@7.0.2)': - dependencies: - '@solana/errors': 4.0.0(typescript@7.0.2) - typescript: 7.0.2 - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@7.0.2)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@7.0.2) @@ -15124,12 +15305,6 @@ snapshots: '@solana/errors': 2.3.0(typescript@7.0.2) typescript: 7.0.2 - '@solana/codecs-numbers@4.0.0(typescript@7.0.2)': - dependencies: - '@solana/codecs-core': 4.0.0(typescript@7.0.2) - '@solana/errors': 4.0.0(typescript@7.0.2) - typescript: 7.0.2 - '@solana/codecs-strings@2.0.0-rc.1(typescript@7.0.2)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@7.0.2) @@ -15144,13 +15319,6 @@ snapshots: '@solana/errors': 2.3.0(typescript@7.0.2) typescript: 7.0.2 - '@solana/codecs-strings@4.0.0(typescript@7.0.2)': - dependencies: - '@solana/codecs-core': 4.0.0(typescript@7.0.2) - '@solana/codecs-numbers': 4.0.0(typescript@7.0.2) - '@solana/errors': 4.0.0(typescript@7.0.2) - typescript: 7.0.2 - '@solana/codecs@2.0.0-rc.1(typescript@7.0.2)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@7.0.2) @@ -15185,12 +15353,6 @@ snapshots: commander: 14.0.3 typescript: 7.0.2 - '@solana/errors@4.0.0(typescript@7.0.2)': - dependencies: - chalk: 5.6.2 - commander: 14.0.1 - typescript: 7.0.2 - '@solana/fast-stable-stringify@2.3.0(typescript@7.0.2)': dependencies: typescript: 7.0.2 @@ -15644,23 +15806,10 @@ snapshots: transitivePeerDependencies: - bs58 - '@solana/wallet-adapter-phantom@0.9.28(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': - dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - - '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.8)(typescript@7.0.2)': + '@solana/wallet-adapter-phantom@0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: - '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(react@19.2.8)(typescript@7.0.2) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.8) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - react: 19.2.8 - transitivePeerDependencies: - - bs58 - - fastestsmallesttextencoderdecoder - - react-native - - typescript '@solana/wallet-adapter-safepal@0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: @@ -15683,14 +15832,11 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-solflare@0.6.32(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': + '@solana/wallet-adapter-solflare@0.6.33(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-chains': 1.1.1 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@solflare-wallet/metamask-sdk': 1.0.3(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solflare-wallet/sdk': 1.4.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@wallet-standard/wallet': 1.1.0 '@solana/wallet-adapter-solong@0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: @@ -15764,11 +15910,11 @@ snapshots: '@solana/wallet-standard-util': 1.1.2 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@solana/wallet-adapter-walletconnect@0.1.21(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0)(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/solana-adapter': 0.0.8(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15797,7 +15943,7 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-wallets@0.19.37(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0)(@solana/sysvars@2.3.0(typescript@7.0.2))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@solana/wallet-adapter-wallets@0.19.38(@babel/runtime@7.28.6)(@solana/sysvars@2.3.0(typescript@7.0.2))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-alpha': 0.1.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) @@ -15819,12 +15965,12 @@ snapshots: '@solana/wallet-adapter-nufi': 0.1.21(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-onto': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-particle': 0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0) - '@solana/wallet-adapter-phantom': 0.9.28(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-phantom': 0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-safepal': 0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-saifu': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-salmon': 0.1.18(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-sky': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-solflare': 0.6.32(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-solflare': 0.6.33(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-solong': 0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-spot': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-tokenary': 0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) @@ -15833,7 +15979,7 @@ snapshots: '@solana/wallet-adapter-trezor': 0.1.6(@solana/sysvars@2.3.0(typescript@7.0.2))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(tslib@2.8.1)(typescript@7.0.2)(utf-8-validate@5.0.10)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-trust': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-walletconnect': 0.1.21(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) '@solana/wallet-adapter-xdefi': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -15886,12 +16032,6 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@solana/wallet-standard-core@1.1.2': - dependencies: - '@solana/wallet-standard-chains': 1.1.1 - '@solana/wallet-standard-features': 1.3.0 - '@solana/wallet-standard-util': 1.1.2 - '@solana/wallet-standard-features@1.3.0': dependencies: '@wallet-standard/base': 1.1.0 @@ -15903,19 +16043,6 @@ snapshots: '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 - '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)': - dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-chains': 1.1.1 - '@solana/wallet-standard-features': 1.3.0 - '@solana/wallet-standard-util': 1.1.2 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@wallet-standard/app': 1.1.0 - '@wallet-standard/base': 1.1.0 - '@wallet-standard/features': 1.1.0 - '@wallet-standard/wallet': 1.1.0 - bs58: 5.0.0 - '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) @@ -15929,48 +16056,6 @@ snapshots: '@wallet-standard/wallet': 1.1.0 bs58: 6.0.0 - '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)': - dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0) - '@wallet-standard/app': 1.1.0 - '@wallet-standard/base': 1.1.0 - react: 19.2.8 - transitivePeerDependencies: - - '@solana/web3.js' - - bs58 - - '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.8)': - dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@6.0.0) - '@wallet-standard/app': 1.1.0 - '@wallet-standard/base': 1.1.0 - react: 19.2.8 - transitivePeerDependencies: - - '@solana/web3.js' - - bs58 - - '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)': - dependencies: - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0) - '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8) - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - bs58 - - react - - '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8)': - dependencies: - '@solana/wallet-standard-core': 1.1.2 - '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.8) - transitivePeerDependencies: - - '@solana/wallet-adapter-base' - - '@solana/web3.js' - - bs58 - - react - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.6 @@ -15994,21 +16079,92 @@ snapshots: - typescript - utf-8-validate - '@solflare-wallet/metamask-sdk@1.0.3(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': + '@solflare-wallet/sdk@1.4.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: - '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@wallet-standard/base': 1.1.0 bs58: 5.0.0 eventemitter3: 5.0.4 uuid: 11.1.1 - '@solflare-wallet/sdk@1.4.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': + '@stablelib/aead@1.0.1': {} + + '@stablelib/binary@1.0.1': dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - bs58: 5.0.0 - eventemitter3: 5.0.4 - uuid: 11.1.1 + '@stablelib/int': 1.0.1 + + '@stablelib/bytes@1.0.1': {} + + '@stablelib/chacha20poly1305@1.0.1': + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/chacha@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/constant-time@1.0.1': {} + + '@stablelib/ed25519@1.0.3': + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hash@1.0.1': {} + + '@stablelib/hkdf@1.0.1': + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hmac@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/keyagreement@1.0.1': + dependencies: + '@stablelib/bytes': 1.0.1 + + '@stablelib/poly1305@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha256@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha512@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/wipe@1.0.1': {} + + '@stablelib/x25519@1.0.3': + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 '@standard-schema/spec@1.1.0': {} @@ -16035,14 +16191,13 @@ snapshots: '@starknet-react/chains@5.0.3': {} - '@starknet-react/core@5.0.3(bufferutil@4.1.0)(get-starknet-core@3.3.5(starknet@8.9.2))(react@19.2.8)(starknet@8.9.2)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@starknet-react/core@5.0.3(bufferutil@4.1.0)(react@19.2.8)(starknet@8.9.2)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 5.0.3 '@tanstack/react-query': 5.90.21(react@19.2.8) abi-wan-kanabi: 2.2.4 eventemitter3: 5.0.4 - get-starknet-core: 3.3.5(starknet@8.9.2) react: 19.2.8 starknet: 8.9.2 viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -16171,12 +16326,6 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.8 - '@tanstack/react-virtual@3.13.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@tanstack/virtual-core': 3.13.19 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - '@tanstack/virtual-core@3.13.19': {} '@telegram-apps/bridge@1.9.2': @@ -16218,18 +16367,6 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@5.17.0': - dependencies: - '@adobe/css-tools': 4.4.4 - '@babel/runtime': 7.28.6 - '@types/testing-library__jest-dom': 5.14.9 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 - lodash: 4.18.1 - redent: 3.0.0 - '@testing-library/react@14.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.6 @@ -16614,16 +16751,6 @@ snapshots: - supports-color - utf-8-validate - '@tronweb3/tronwallet-adapter-foxwallet@1.0.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - '@tronweb3/tronwallet-adapter-gatewallet@1.0.5(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -16634,36 +16761,28 @@ snapshots: - supports-color - utf-8-validate - '@tronweb3/tronwallet-adapter-imtoken@1.0.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tronweb3/tronwallet-adapter-metamask-tron@1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: + '@metamask/multichain-api-client': 0.11.0 '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - '@tronweb3/tronwallet-adapter-ledger@1.1.13(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tronweb3/tronwallet-adapter-okxwallet@1.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: - '@ledgerhq/hw-app-trx': 6.29.2 - '@ledgerhq/hw-transport': 6.27.1 - '@ledgerhq/hw-transport-webhid': 6.27.1 - '@testing-library/jest-dom': 5.17.0 '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - buffer: 6.0.3 - eventemitter3: 5.0.4 - preact: 10.23.0 - tronweb: 6.2.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - '@tronweb3/tronwallet-adapter-metamask-tron@1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tronweb3/tronwallet-adapter-tronlink@1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: - '@metamask/multichain-api-client': 0.11.0 '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -16671,48 +16790,7 @@ snapshots: - supports-color - utf-8-validate - '@tronweb3/tronwallet-adapter-okxwallet@1.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - '@tronweb3/tronwallet-adapter-react-hooks@1.1.12(bufferutil@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(utf-8-validate@5.0.10)': - dependencies: - '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - '@tronweb3/tronwallet-adapter-tokenpocket@1.0.9(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - '@tronweb3/tronwallet-adapter-tronlink@1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - '@tronweb3/tronwallet-adapter-trust@1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tronweb3/tronwallet-adapter-trust@1.0.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: '@tronweb3/tronwallet-abstract-adapter': 1.1.12(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@tronweb3/tronwallet-adapter-tronlink': 1.1.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -16804,10 +16882,6 @@ snapshots: dependencies: '@types/node': 20.19.34 - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 20.19.34 - '@types/caseless@0.12.5': {} '@types/chai@5.2.3': @@ -16823,8 +16897,6 @@ snapshots: dependencies: '@types/node': 20.19.34 - '@types/crypto-js@4.2.2': {} - '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -16838,23 +16910,6 @@ snapshots: '@types/react': 19.2.17 hoist-non-react-statics: 3.3.2 - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@30.0.0': - dependencies: - expect: 30.3.0 - pretty-format: 30.3.0 - - '@types/json-schema@7.0.15': {} - '@types/ms@2.1.0': {} '@types/node@12.20.55': {} @@ -16886,14 +16941,8 @@ snapshots: '@types/tough-cookie': 4.0.5 form-data: 2.5.6 - '@types/stack-utils@2.0.3': {} - '@types/statuses@2.0.6': {} - '@types/testing-library__jest-dom@5.14.9': - dependencies: - '@types/jest': 30.0.0 - '@types/tough-cookie@4.0.5': {} '@types/trusted-types@2.0.7': {} @@ -16914,12 +16963,6 @@ snapshots: dependencies: '@types/node': 20.19.34 - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.35': - dependencies: - '@types/yargs-parser': 21.0.3 - '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -17032,14 +17075,14 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.1 - '@wagmi/connectors@5.7.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': + '@wagmi/connectors@5.7.7(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.34.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@wagmi/core': 2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@walletconnect/ethereum-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/ethereum-provider': 2.17.0(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(utf-8-validate@5.0.10) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) optionalDependencies: @@ -17108,19 +17151,6 @@ snapshots: '@wallet-standard/base@1.1.0': {} - '@wallet-standard/core@1.1.1': - dependencies: - '@wallet-standard/app': 1.1.0 - '@wallet-standard/base': 1.1.0 - '@wallet-standard/errors': 0.1.1 - '@wallet-standard/features': 1.1.0 - '@wallet-standard/wallet': 1.1.0 - - '@wallet-standard/errors@0.1.1': - dependencies: - chalk: 5.6.2 - commander: 13.1.0 - '@wallet-standard/features@1.1.0': dependencies: '@wallet-standard/base': 1.1.0 @@ -17129,25 +17159,24 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/core@2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/utils': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.39.3 + '@walletconnect/types': 2.17.0 + '@walletconnect/utils': 2.17.0 events: 3.3.0 - uint8arrays: 3.1.1 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17168,30 +17197,28 @@ snapshots: - bufferutil - db0 - ioredis - - typescript - uploadthing - utf-8-validate - - zod - '@walletconnect/core@2.23.6(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/core@2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/logger': 3.0.2 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.6(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/utils': 2.23.6(@react-native-async-storage/async-storage@1.24.0)(typescript@7.0.2) + '@walletconnect/types': 2.19.0 + '@walletconnect/utils': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) '@walletconnect/window-getters': 1.0.1 - es-toolkit: 1.44.0 events: 3.3.0 - uint8arrays: 3.1.1 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17217,23 +17244,25 @@ snapshots: - utf-8-validate - zod - '@walletconnect/environment@1.0.1': - dependencies: - tslib: 1.14.1 - - '@walletconnect/ethereum-provider@2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/core@2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/sign-client': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/utils': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1 + '@walletconnect/utils': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 events: 3.3.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17246,7 +17275,6 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' @@ -17254,27 +17282,31 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - - react - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/ethereum-provider@2.21.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit': 1.7.8(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/sign-client': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/utils': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 events: 3.3.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17287,7 +17319,6 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' @@ -17295,68 +17326,31 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - - react - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/events@1.0.1': - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.2': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-http-connection@1.0.8': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.2.0 - events: 3.3.0 - transitivePeerDependencies: - - encoding - - '@walletconnect/jsonrpc-provider@1.0.14': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-types@1.0.4': - dependencies: - events: 3.3.0 - keyvaluestorage-interface: 1.0.0 - - '@walletconnect/jsonrpc-utils@1.0.8': + '@walletconnect/core@2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/environment': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 - - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.8 + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.39.3 events: 3.3.0 - ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0)': - dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.2 - unstorage: 1.17.4(idb-keyval@6.2.2) - optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17368,52 +17362,39 @@ snapshots: - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' - aws4fetch + - bufferutil - db0 - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/logger@3.0.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 10.0.0 - - '@walletconnect/relay-api@1.0.11': - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.1.0': - dependencies: - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - uint8arrays: 3.1.1 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/core@2.23.6(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/core': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/utils': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.23.6 + '@walletconnect/utils': 2.23.6(typescript@7.0.2) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.44.0 events: 3.3.0 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17439,16 +17420,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.23.6(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/environment@1.0.1': dependencies: - '@walletconnect/core': 2.23.6(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.17.0(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(utf-8-validate@5.0.10)': + 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': 3.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.6(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/utils': 2.23.6(@react-native-async-storage/async-storage@1.24.0)(typescript@7.0.2) + '@walletconnect/modal': 2.7.0(@types/react@19.2.17)(react@19.2.8) + '@walletconnect/sign-client': 2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.17.0 + '@walletconnect/universal-provider': 2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.17.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17462,6 +17448,7 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' @@ -17469,20 +17456,25 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - - typescript + - react - uploadthing - utf-8-validate - - zod - '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0)(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/ethereum-provider@2.21.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - bs58: 6.0.0 + '@reown/appkit': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.8 + '@walletconnect/universal-provider': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17511,17 +17503,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0)': + '@walletconnect/ethereum-provider@2.21.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@reown/appkit': 1.7.8(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/logger': 2.1.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.8 + '@walletconnect/universal-provider': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17535,21 +17528,511 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - react + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0)': + '@walletconnect/events@1.0.1': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.17.4(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/logger@3.0.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 10.0.0 + + '@walletconnect/modal-core@2.7.0(@types/react@19.2.17)(react@19.2.8)': + dependencies: + valtio: 1.11.2(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.7.0(@types/react@19.2.17)(react@19.2.8)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.2.17)(react@19.2.8) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.7.0(@types/react@19.2.17)(react@19.2.8)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.2.17)(react@19.2.8) + '@walletconnect/modal-ui': 2.7.0(@types/react@19.2.17)(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/sign-client@2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.0 + '@walletconnect/utils': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1 + '@walletconnect/utils': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@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.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@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.21.8 + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.23.6(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.23.6(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 3.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.23.6 + '@walletconnect/utils': 2.23.6(typescript@7.0.2) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/solana-adapter@0.0.8(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit': 1.7.2(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + bs58: 6.0.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.17.0': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.19.0': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.19.1': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.0': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -17573,12 +18056,12 @@ snapshots: - ioredis - uploadthing - '@walletconnect/types@2.21.0(@react-native-async-storage/async-storage@1.24.0)': + '@walletconnect/types@2.21.8': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -17602,14 +18085,248 @@ snapshots: - ioredis - uploadthing - '@walletconnect/types@2.21.8(@react-native-async-storage/async-storage@1.24.0)': + '@walletconnect/types@2.23.6': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.17.0 + '@walletconnect/utils': 2.17.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/universal-provider@2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.0 + '@walletconnect/utils': 2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + events: 3.3.0 + lodash: 4.18.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.19.1 + '@walletconnect/utils': 2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.8 + '@walletconnect/utils': 2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + es-toolkit: 1.39.3 events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.17.0': + 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.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17631,14 +18348,25 @@ snapshots: - ioredis - uploadthing - '@walletconnect/types@2.23.6(@react-native-async-storage/async-storage@1.24.0)': + '@walletconnect/utils@2.19.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/logger': 3.0.2 - events: 3.3.0 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17656,24 +18384,34 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - aws4fetch + - bufferutil - db0 - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/universal-provider@2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/utils@2.19.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) - '@walletconnect/utils': 2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) - es-toolkit: 1.39.3 - events: 3.3.0 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17693,29 +18431,28 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/types': 2.21.0 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 detect-browser: 5.3.0 - elliptic: 6.6.1 query-string: 7.1.3 uint8arrays: 3.1.0 viem: 2.23.2(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) @@ -17744,7 +18481,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.8(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': + '@walletconnect/utils@2.21.8(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -17752,12 +18489,12 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.8(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/types': 2.21.8 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 @@ -17791,7 +18528,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.23.6(@react-native-async-storage/async-storage@1.24.0)(typescript@7.0.2)': + '@walletconnect/utils@2.23.6(typescript@7.0.2)': dependencies: '@msgpack/msgpack': 3.1.3 '@noble/ciphers': 1.3.0 @@ -17799,13 +18536,13 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 3.0.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.6(@react-native-async-storage/async-storage@1.24.0) + '@walletconnect/types': 2.23.6 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 @@ -17844,8 +18581,6 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@web3-react/types@6.0.7': {} - '@xrplf/isomorphic@1.0.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: '@noble/hashes': 1.8.0 @@ -17917,11 +18652,7 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} + aes-js@3.0.0: {} aes-js@4.0.0-beta.5: {} @@ -17941,17 +18672,6 @@ snapshots: dependencies: ajv: 8.18.0 - ajv-keywords@3.5.2(ajv@6.14.0): - dependencies: - ajv: 6.14.0 - - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -17992,8 +18712,6 @@ snapshots: dependencies: deep-equal: 2.2.3 - aria-query@5.3.2: {} - array-back@3.1.0: {} array-back@4.0.2: {} @@ -18045,15 +18763,6 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.27(postcss@8.5.26): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.26 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -18080,18 +18789,20 @@ snapshots: base32.js@0.1.0: {} + base58-js@3.0.3: {} + base64-js@1.5.1: {} base64url@3.0.1: {} baseline-browser-mapping@2.10.0: {} + bech32@1.1.4: {} + bech32@2.0.0: {} big-integer@1.6.36: {} - big.js@5.2.2: {} - big.js@6.2.2: {} bigint-buffer@1.1.5: @@ -18112,6 +18823,12 @@ snapshots: bip66@2.0.0: {} + bitcoin-address-validation@3.0.0: + dependencies: + base58-js: 3.0.3 + bech32: 2.0.0 + sha256-uint8array: 0.10.7 + bitcoin-ops@1.4.1: {} blake-hash@2.0.0: @@ -18349,11 +19066,6 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -18394,8 +19106,6 @@ snapshots: dependencies: readdirp: 5.0.0 - ci-info@4.4.0: {} - cipher-base@1.0.7: dependencies: inherits: 2.0.4 @@ -18438,6 +19148,15 @@ snapshots: clsx@2.1.1: {} + cmdk@0.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.17)(react@19.2.8) @@ -18514,14 +19233,10 @@ snapshots: commander@13.1.0: {} - commander@14.0.1: {} - commander@14.0.3: {} commander@2.20.3: {} - commander@7.2.0: {} - compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -18662,17 +19377,10 @@ snapshots: crypto-js@4.2.0: {} - css.escape@1.5.1: {} - cssesc@3.0.0: {} csstype@3.2.3: {} - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - data-uri-to-buffer@4.0.1: {} date-fns@2.30.0: @@ -18683,8 +19391,6 @@ snapshots: dayjs@1.11.13: {} - debounce@1.2.1: {} - debug@3.2.7: dependencies: ms: 2.1.3 @@ -18767,10 +19473,6 @@ snapshots: dequal@2.0.3: {} - derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.2.17)(react@18.3.1)): - dependencies: - valtio: 1.13.2(@types/react@19.2.17)(react@18.3.1) - derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.2.17)(react@19.2.8)): dependencies: valtio: 1.13.2(@types/react@19.2.17)(react@19.2.8) @@ -18826,8 +19528,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer@0.1.2: {} - duplexify@4.1.3: dependencies: end-of-stream: 1.4.5 @@ -18868,8 +19568,6 @@ snapshots: emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} - encode-utf8@1.0.3: {} encodeurl@1.0.2: {} @@ -18934,41 +19632,18 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 + es-toolkit@1.33.0: {} + es-toolkit@1.39.3: {} es-toolkit@1.44.0: {} - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - es6-promise@4.2.8: {} es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild@0.25.3: optionalDependencies: '@esbuild/aix-ppc64': 0.25.3 @@ -19003,19 +19678,8 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - - escape-string-regexp@4.0.0: {} - esm-env@1.2.2: {} - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - esprima@4.0.1: {} estree-walker@3.0.3: @@ -19058,6 +19722,42 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 + ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethers@6.13.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -19086,11 +19786,6 @@ snapshots: ev-emitter@2.1.2: {} - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} @@ -19147,15 +19842,6 @@ snapshots: expect-type@1.3.0: {} - expect@30.3.0: - dependencies: - '@jest/expect-utils': 30.3.0 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.3.0 - jest-message-util: 30.3.0 - jest-mock: 30.3.0 - jest-util: 30.3.0 - express-rate-limit@8.3.1(express@5.2.1): dependencies: express: 5.2.1 @@ -19194,10 +19880,6 @@ snapshots: transitivePeerDependencies: - supports-color - ext@1.7.0: - dependencies: - type: 2.7.3 - extend@3.0.2: {} extension-port-stream@3.0.0: @@ -19269,11 +19951,6 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-loader@6.2.0: - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - file-uri-to-path@1.0.0: {} fill-range@7.1.1: @@ -19350,8 +20027,6 @@ snapshots: forwarded@0.2.0: {} - fraction.js@5.3.4: {} - framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: motion-dom: 12.42.2 @@ -19474,11 +20149,6 @@ snapshots: get-size@3.0.0: {} - get-starknet-core@3.3.5(starknet@8.9.2): - dependencies: - '@module-federation/runtime': 0.1.21 - starknet: 8.9.2 - get-stream@6.0.1: {} get-stream@9.0.1: @@ -19550,10 +20220,6 @@ snapshots: - encoding - supports-color - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -19621,6 +20287,8 @@ snapshots: help-me@5.0.0: {} + hey-listen@1.0.8: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -19643,8 +20311,6 @@ snapshots: html-entities@2.6.0: {} - html-escaper@2.0.2: {} - http-assert@1.5.0: dependencies: deep-equal: 1.0.1 @@ -19723,8 +20389,6 @@ snapshots: es-module-lexer: 2.3.1 module-details-from-path: 1.0.4 - indent-string@4.0.0: {} - inflation@2.1.0: {} inherits@2.0.4: {} @@ -19824,15 +20488,8 @@ snapshots: is-obj@3.0.0: {} - is-plain-obj@2.1.0: - optional: true - is-plain-obj@4.1.0: {} - is-plain-object@5.0.0: {} - - is-promise@2.2.2: {} - is-promise@4.0.0: {} is-regex@1.2.1: @@ -19932,57 +20589,12 @@ snapshots: - bufferutil - utf-8-validate - jest-diff@30.3.0: - dependencies: - '@jest/diff-sequences': 30.3.0 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.3.0 - - jest-matcher-utils@30.3.0: - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.3.0 - pretty-format: 30.3.0 - - jest-message-util@30.3.0: - dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 30.3.0 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - picomatch: 4.0.4 - pretty-format: 30.3.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 20.19.34 - jest-util: 30.3.0 - - jest-regex-util@30.0.1: {} - - jest-util@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 20.19.34 - chalk: 4.1.2 - ci-info: 4.4.0 - graceful-fs: 4.2.11 - picomatch: 4.0.4 - jiti@2.6.1: {} jose@6.2.2: {} joycon@3.1.1: {} - js-base64@3.7.8: {} - js-sha3@0.8.0: {} js-tokens@4.0.0: {} @@ -20010,8 +20622,6 @@ snapshots: json-rpc-random-id@1.0.1: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} @@ -20241,16 +20851,32 @@ snapshots: lines-and-columns@1.2.4: {} + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 '@lit/reactive-element': 2.1.2 lit-html: 3.3.2 + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + lit-html@3.3.2: dependencies: '@types/trusted-types': 2.0.7 + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + lit@3.1.0: dependencies: '@lit/reactive-element': 2.1.2 @@ -20282,12 +20908,6 @@ snapshots: load-tsconfig@0.2.5: {} - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -20343,9 +20963,9 @@ snapshots: dependencies: yallist: 3.1.1 - lru-queue@0.1.0: + lucide-react@0.379.0(react@19.2.8): dependencies: - es5-ext: 0.10.64 + react: 19.2.8 lucide-react@1.27.0(react@19.2.8): dependencies: @@ -20361,7 +20981,7 @@ snapshots: md5.js@1.3.5: dependencies: - hash-base: 3.0.5 + hash-base: 3.1.2 inherits: 2.0.4 safe-buffer: 5.2.1 @@ -20369,24 +20989,8 @@ snapshots: media-typer@1.1.0: {} - memoizee@0.4.17: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.8 - merge-descriptors@2.0.0: {} - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 - optional: true - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -20432,8 +21036,6 @@ snapshots: mimic-function@5.0.1: {} - min-indent@1.0.1: {} - mini-svg-data-uri@1.4.4: {} minimalistic-assert@1.0.1: {} @@ -20470,7 +21072,14 @@ snapshots: motion-utils@12.39.0: {} - mrmime@2.0.1: {} + motion@10.16.2: + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/dom': 10.18.0 + '@motionone/svelte': 10.16.4 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + '@motionone/vue': 10.16.4 ms@2.1.2: {} @@ -20538,8 +21147,6 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - next-tick@1.1.0: {} - next@16.3.0(@opentelemetry/api@1.9.0)(@types/node@20.19.34)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@next/env': 16.3.0 @@ -20709,8 +21316,6 @@ snapshots: openapi-typescript-helpers@0.0.15: {} - opener@1.5.2: {} - ora@8.2.0: dependencies: chalk: 5.6.2 @@ -21065,8 +21670,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - postcss@8.5.26: dependencies: nanoid: 3.3.18 @@ -21075,8 +21678,6 @@ snapshots: powershell-utils@0.1.0: {} - preact@10.23.0: {} - preact@10.28.4: {} pretty-format@27.5.1: @@ -21085,12 +21686,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@30.3.0: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 - pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -21130,6 +21725,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-compare@2.5.1: {} + proxy-compare@2.6.0: {} proxy-from-env@2.1.0: {} @@ -21148,14 +21745,14 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - punycode@2.3.1: {} - pushdata-bitcoin@1.0.1: dependencies: bitcoin-ops: 1.4.1 qr.js@0.0.0: {} + qrcode-generator@2.0.4: {} + qrcode.react@1.0.1(react@19.2.8): dependencies: loose-envify: 1.4.0 @@ -21163,10 +21760,6 @@ snapshots: qr.js: 0.0.0 react: 19.2.8 - qrcode.react@4.2.0(react@19.2.8): - dependencies: - react: 19.2.8 - qrcode@1.5.3: dependencies: dijkstrajs: 1.0.3 @@ -21174,12 +21767,6 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qrcode@1.5.4: - dependencies: - dijkstrajs: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -21305,8 +21892,6 @@ snapshots: react-is@17.0.2: {} - react-is@18.3.1: {} - react-lifecycles-compat@3.0.4: {} react-modal@3.16.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): @@ -21326,6 +21911,12 @@ snapshots: react-dom: 19.2.8(react@19.2.8) webrtc-adapter: 7.7.1 + react-qrcode-logo@4.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + qrcode-generator: 2.0.4 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.8): dependencies: react: 19.2.8 @@ -21334,7 +21925,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 - react-remove-scroll@2.5.7(@types/react@19.2.17)(react@19.2.8): + react-remove-scroll@2.5.4(@types/react@19.2.17)(react@19.2.8): dependencies: react: 19.2.8 react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.8) @@ -21417,11 +22008,6 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - redeyed@2.1.1: dependencies: esprima: 4.0.1 @@ -21601,11 +22187,7 @@ snapshots: scheduler@0.27.0: {} - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.14.0 - ajv-keywords: 3.5.2(ajv@6.14.0) + scrypt-js@3.0.1: {} sdp@2.12.0: {} @@ -21617,8 +22199,6 @@ snapshots: semver@7.7.3: {} - semver@7.7.4: {} - semver@7.8.5: {} send@1.2.1: @@ -21818,16 +22398,8 @@ snapshots: dependencies: is-arrayish: 0.3.4 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 - sisteransi@1.0.5: {} - slash@3.0.0: {} - slow-redact@0.3.2: {} smart-buffer@4.2.0: {} @@ -21889,10 +22461,6 @@ snapshots: split2@4.2.0: {} - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - stackback@0.0.2: {} starknet@8.9.2: @@ -21908,16 +22476,16 @@ snapshots: pako: 2.1.0 ts-mixer: 6.0.4 - starknetkit@3.4.3(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@react-native-async-storage/async-storage@1.24.0)(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(starknet@8.9.2)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10): + starknetkit@3.4.3(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@scure/bip39@2.0.1)(@types/react@19.2.17)(bufferutil@4.1.0)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(starknet@8.9.2)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1)(typescript@7.0.2)(utf-8-validate@5.0.10): dependencies: '@argent/x-ui': 1.109.1(@radix-ui/react-slot@1.2.4(@types/react@19.2.17)(react@19.2.8))(@scure/bip39@2.0.1)(@starknet-io/types-js@0.8.4)(class-variance-authority@0.7.1)(clsx@1.2.1)(framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(lodash-es@4.18.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(starknet@8.9.2)(swr@2.4.0(react@19.2.8))(tailwind-merge@3.5.0)(tailwindcss-animate@1.0.7(tailwindcss@4.2.1))(tailwindcss@4.2.1) - '@cartridge/controller': 0.10.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@cartridge/controller': 0.10.7(@types/react@19.2.17)(bufferutil@4.1.0)(react@18.3.1)(typescript@7.0.2)(utf-8-validate@5.0.10) '@starknet-io/get-starknet': 4.0.8 '@starknet-io/get-starknet-core': 4.0.8 '@starknet-io/types-js': 0.8.4 '@trpc/client': 10.45.4(@trpc/server@10.45.4) '@trpc/server': 10.45.4 - '@walletconnect/sign-client': 2.23.6(@react-native-async-storage/async-storage@1.24.0)(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) + '@walletconnect/sign-client': 2.23.6(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10) bowser: 2.14.1 detect-browser: 5.3.0 eventemitter3: 5.0.4 @@ -22068,10 +22636,6 @@ snapshots: strip-final-newline@4.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@5.0.3: {} strnum@2.3.0: {} @@ -22153,11 +22717,6 @@ snapshots: dependencies: real-require: 0.2.0 - timers-ext@0.1.8: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - tiny-case@1.0.3: {} tiny-invariant@1.3.3: {} @@ -22212,8 +22771,6 @@ snapshots: toposort@2.0.2: {} - totalist@3.0.1: {} - tough-cookie@6.0.1: dependencies: tldts: 7.0.27 @@ -22237,6 +22794,23 @@ snapshots: - supports-color - utf-8-validate + tronweb@6.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@babel/runtime': 7.26.10 + axios: 1.19.0 + bignumber.js: 9.1.2 + ethereum-cryptography: 2.2.1 + ethers: 6.13.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + eventemitter3: 5.0.1 + google-protobuf: 3.21.4 + semver: 7.7.1 + validator: 13.15.23 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + trpc-browser@1.4.4(@trpc/client@10.45.4(@trpc/server@10.45.4))(@trpc/server@10.45.4): dependencies: '@trpc/client': 10.45.4(@trpc/server@10.45.4) @@ -22297,8 +22871,6 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - type@2.7.3: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -22409,10 +22981,6 @@ snapshots: dependencies: tslib: 2.8.1 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - urijs@1.19.11: {} usb@2.17.0: @@ -22477,9 +23045,17 @@ snapshots: validator@13.15.23: {} + valtio@1.11.2(@types/react@19.2.17)(react@19.2.8): + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0(react@19.2.8) + optionalDependencies: + '@types/react': 19.2.17 + react: 19.2.8 + valtio@1.13.2(@types/react@19.2.17)(react@18.3.1): dependencies: - derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.2.17)(react@18.3.1)) + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.2.17)(react@19.2.8)) proxy-compare: 2.6.0 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: @@ -22637,10 +23213,10 @@ snapshots: - tsx - yaml - wagmi@2.14.11(@react-native-async-storage/async-storage@1.24.0)(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)): + wagmi@2.14.11(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@19.2.8))(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)): dependencies: '@tanstack/react-query': 5.90.21(react@19.2.8) - '@wagmi/connectors': 5.7.7(@react-native-async-storage/async-storage@1.24.0)(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) + '@wagmi/connectors': 5.7.7(@types/react@19.2.17)(@wagmi/core@2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)))(bufferutil@4.1.0)(react@19.2.8)(typescript@7.0.2)(utf-8-validate@5.0.10)(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) '@wagmi/core': 2.16.4(@tanstack/query-core@5.90.20)(@types/react@19.2.17)(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.4.0(react@19.2.8))(viem@2.44.1(bufferutil@4.1.0)(typescript@7.0.2)(utf-8-validate@5.0.10)) react: 19.2.8 use-sync-external-store: 1.4.0(react@19.2.8) @@ -22690,25 +23266,6 @@ snapshots: webidl-conversions@3.0.1: {} - webpack-bundle-analyzer@4.10.1(bufferutil@4.1.0)(utf-8-validate@5.0.10): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - acorn: 8.16.0 - acorn-walk: 8.3.5 - commander: 7.2.0 - debounce: 1.2.1 - escape-string-regexp: 4.0.0 - gzip-size: 6.0.0 - html-escaper: 2.0.2 - is-plain-object: 5.0.0 - opener: 1.5.2 - picocolors: 1.1.1 - sirv: 2.0.4 - ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - webrtc-adapter@7.7.1: dependencies: rtcpeerconnection-shim: 1.2.15 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 639f688b..948217d3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -24,4 +24,6 @@ catalog: wagmi: 2.14.11 zustand: ^4.5.7 -minimumReleaseAge: 4320 \ No newline at end of file +minimumReleaseAge: 4320 +minimumReleaseAgeExclude: + - '@layerswap/*' \ No newline at end of file